feat(api): migrate TypeScript type definitions and API services

This commit is contained in:
Sam 2026-02-06 00:11:36 +08:00
parent 9600147586
commit 9b5198f87a
8 changed files with 393 additions and 0 deletions

View File

@ -0,0 +1,6 @@
export * from './log';
export * from './oauth';
export * from './role';
export * from './tenant';
export * from './user';
export * from './typings';

View File

@ -0,0 +1,35 @@
import type { FenglingApi } from './typings';
import { requestClient } from '#/api/request';
export namespace LogApi {
export async function getAuditLogList(params: {
page?: number
pageSize?: number
userId?: number
action?: string
resourceType?: string
startDate?: string
endDate?: string
}) {
return requestClient.get<FenglingApi.PaginatedResponse<FenglingApi.Log.AuditLog>>(
'/logs/audit',
{ params }
);
}
export async function getAccessLogList(params: {
page?: number
pageSize?: number
userId?: number
path?: string
statusCode?: number
startDate?: string
endDate?: string
}) {
return requestClient.get<FenglingApi.PaginatedResponse<FenglingApi.Log.AccessLog>>(
'/logs/access',
{ params }
);
}
}

View File

@ -0,0 +1,45 @@
import type { FenglingApi } from './typings';
import { requestClient } from '#/api/request';
export namespace OAuthApi {
export async function getClientList(params: {
page?: number
pageSize?: number
keyword?: string
status?: string
}) {
return requestClient.get<FenglingApi.PaginatedResponse<FenglingApi.OAuth.OAuthClient>>(
'/oauth/clients',
{ params }
);
}
export async function getClientById(id: number) {
return requestClient.get<FenglingApi.OAuth.OAuthClient>(`/oauth/clients/${id}`);
}
export async function createClient(data: FenglingApi.OAuth.CreateOAuthClientDto) {
return requestClient.post<FenglingApi.OAuth.OAuthClient>('/oauth/clients', data);
}
export async function updateClient(id: number, data: FenglingApi.OAuth.UpdateOAuthClientDto) {
return requestClient.put<FenglingApi.OAuth.OAuthClient>(`/oauth/clients/${id}`, data);
}
export async function deleteClient(id: number) {
return requestClient.delete(`/oauth/clients/${id}`);
}
export async function regenerateClientSecret(id: number) {
return requestClient.post(`/oauth/clients/${id}/regenerate-secret`);
}
export async function activateClient(id: number) {
return requestClient.post(`/oauth/clients/${id}/activate`);
}
export async function deactivateClient(id: number) {
return requestClient.post(`/oauth/clients/${id}/deactivate`);
}
}

View File

@ -0,0 +1,36 @@
import type { FenglingApi } from './typings';
import { requestClient } from '#/api/request';
export namespace RoleApi {
export async function getRoleList(params: {
page?: number
pageSize?: number
keyword?: string
}) {
return requestClient.get<FenglingApi.PaginatedResponse<FenglingApi.Role.Role>>(
'/roles',
{ params }
);
}
export async function getRoleById(id: number) {
return requestClient.get<FenglingApi.Role.Role>(`/roles/${id}`);
}
export async function createRole(data: FenglingApi.Role.CreateRoleDto) {
return requestClient.post<FenglingApi.Role.Role>('/roles', data);
}
export async function updateRole(id: number, data: FenglingApi.Role.UpdateRoleDto) {
return requestClient.put<FenglingApi.Role.Role>(`/roles/${id}`, data);
}
export async function deleteRole(id: number) {
return requestClient.delete(`/roles/${id}`);
}
export async function getAllRoles() {
return requestClient.get<FenglingApi.Role.Role[]>('/roles/all');
}
}

View File

@ -0,0 +1,55 @@
import type { FenglingApi } from './typings';
import { requestClient } from '#/api/request';
export namespace TenantApi {
export async function getTenantList(params: {
page?: number
pageSize?: number
keyword?: string
status?: string
}) {
return requestClient.get<FenglingApi.PaginatedResponse<FenglingApi.Tenant.Tenant>>(
'/tenants',
{ params }
);
}
export async function getTenantById(id: number) {
return requestClient.get<FenglingApi.Tenant.Tenant>(`/tenants/${id}`);
}
export async function createTenant(data: FenglingApi.Tenant.CreateTenantDto) {
return requestClient.post<FenglingApi.Tenant.Tenant>('/tenants', data);
}
export async function updateTenant(id: number, data: FenglingApi.Tenant.UpdateTenantDto) {
return requestClient.put<FenglingApi.Tenant.Tenant>(`/tenants/${id}`, data);
}
export async function deleteTenant(id: number) {
return requestClient.delete(`/tenants/${id}`);
}
export async function activateTenant(id: number) {
return requestClient.post(`/tenants/${id}/activate`);
}
export async function deactivateTenant(id: number) {
return requestClient.post(`/tenants/${id}/deactivate`);
}
export async function extendTenantExpiry(id: number, expiresAt: string) {
return requestClient.post(`/tenants/${id}/extend`, { expiresAt });
}
export async function getTenantUsers(id: number) {
return requestClient.get<FenglingApi.PaginatedResponse<FenglingApi.User.User>>(
`/tenants/${id}/users`
);
}
export async function getTenantStatistics(id: number) {
return requestClient.get(`/tenants/${id}/statistics`);
}
}

View File

@ -0,0 +1,177 @@
export namespace FenglingApi {
export namespace Tenant {
export interface Tenant {
id: number
tenantId: string
name: string
contactName: string
contactEmail: string
contactPhone: string
maxUsers?: number
userCount: number
status: 'active' | 'inactive' | 'expired'
expiresAt?: string
description?: string
createdAt: string
}
export interface CreateTenantDto {
tenantId: string
name: string
contactName: string
contactEmail: string
contactPhone: string
maxUsers?: number
expiresAt?: string
status: 'active' | 'inactive'
description?: string
}
export interface UpdateTenantDto {
name?: string
contactName?: string
contactEmail?: string
contactPhone?: string
maxUsers?: number
expiresAt?: string
status?: 'active' | 'inactive'
description?: string
}
}
export namespace User {
export interface User {
id: number
userName: string
email: string
realName?: string
tenantId?: string
roles: string[]
isActive: boolean
createdAt: string
}
export interface CreateUserDto {
userName: string
email: string
realName?: string
password: string
tenantId?: string
roleIds: number[]
}
export interface UpdateUserDto {
email?: string
realName?: string
isActive?: boolean
roleIds?: number[]
}
export interface ResetPasswordDto {
newPassword: string
}
}
export namespace Role {
export interface Role {
id: number
name: string
displayName: string
description?: string
permissions: string[]
createdAt: string
}
export interface CreateRoleDto {
name: string
displayName: string
description?: string
permissions: string[]
}
export interface UpdateRoleDto {
displayName?: string
description?: string
permissions?: string[]
}
}
export namespace OAuth {
export interface OAuthClient {
id: number
clientId: string
displayName: string
redirectUris: string[]
postLogoutRedirectUris: string[]
scopes: string[]
grantTypes: string[]
clientType: 'confidential' | 'public'
consentType: 'explicit' | 'implicit' | 'external'
status: 'active' | 'inactive'
description?: string
createdAt: string
updatedAt: string
}
export interface CreateOAuthClientDto {
clientId: string
displayName: string
clientSecret?: string
redirectUris: string[]
postLogoutRedirectUris: string[]
scopes: string[]
grantTypes: string[]
clientType?: 'confidential' | 'public'
consentType?: 'explicit' | 'implicit' | 'external'
status?: 'active' | 'inactive'
description?: string
}
export interface UpdateOAuthClientDto {
displayName: string
redirectUris: string[]
postLogoutRedirectUris: string[]
scopes: string[]
grantTypes: string[]
clientType: 'confidential' | 'public'
consentType: 'explicit' | 'implicit' | 'external'
status: 'active' | 'inactive'
description?: string
}
}
export namespace Log {
export interface AuditLog {
id: number
userId?: number
userName?: string
action: string
resourceType: string
resourceId?: string
details?: string
ipAddress?: string
userAgent?: string
createdAt: string
}
export interface AccessLog {
id: number
userId?: number
userName?: string
path: string
method: string
statusCode: number
duration: number
ipAddress?: string
userAgent?: string
createdAt: string
}
}
export interface PaginatedResponse<T> {
items: T[]
totalCount: number
page: number
pageSize: number
}
}

View File

@ -0,0 +1,38 @@
import type { FenglingApi } from './typings';
import { requestClient } from '#/api/request';
export namespace UserApi {
export async function getUserList(params: {
page?: number
pageSize?: number
keyword?: string
tenantId?: string
isActive?: boolean
}) {
return requestClient.get<FenglingApi.PaginatedResponse<FenglingApi.User.User>>(
'/users',
{ params }
);
}
export async function getUserById(id: number) {
return requestClient.get<FenglingApi.User.User>(`/users/${id}`);
}
export async function createUser(data: FenglingApi.User.CreateUserDto) {
return requestClient.post<FenglingApi.User.User>('/users', data);
}
export async function updateUser(id: number, data: FenglingApi.User.UpdateUserDto) {
return requestClient.put<FenglingApi.User.User>(`/users/${id}`, data);
}
export async function deleteUser(id: number) {
return requestClient.delete(`/users/${id}`);
}
export async function resetUserPassword(id: number, data: FenglingApi.User.ResetPasswordDto) {
return requestClient.post(`/users/${id}/reset-password`, data);
}
}

View File

@ -1 +1,2 @@
export * from './core';
export * from './fengling';