bump
This commit is contained in:
@@ -4,8 +4,16 @@ import { HttpClient, HttpParams } from '@angular/common/http';
|
||||
import type { Observable } from 'rxjs';
|
||||
import type {
|
||||
AuditLogDto,
|
||||
AdminSessionDto,
|
||||
AdminUserDetailDto,
|
||||
AdminUserListItemDto,
|
||||
CreateNotificationDto,
|
||||
ItemDto,
|
||||
NotificationDto,
|
||||
NotificationPageDto,
|
||||
NotificationStatusFilter,
|
||||
PageDto,
|
||||
Permission,
|
||||
RoleDto,
|
||||
SaveItemDto,
|
||||
SessionDto,
|
||||
@@ -20,9 +28,13 @@ export class ApiClientService {
|
||||
me(): Observable<UserDto> {
|
||||
return this.http.get<UserDto>(`${this.base}/me`, { withCredentials: true });
|
||||
}
|
||||
|
||||
updateSettings(body: { tablePageSize?: number; sidebarExpanded?: boolean }): Observable<UserDto> {
|
||||
return this.http.patch<UserDto>(`${this.base}/me/settings`, body, { withCredentials: true });
|
||||
return this.http.patch<UserDto>(`${this.base}/me/settings`, body, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
dashboard(): Observable<{
|
||||
userCount: number;
|
||||
activeSessions: number;
|
||||
@@ -51,15 +63,25 @@ export class ApiClientService {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
item(id: string): Observable<ItemDto> {
|
||||
return this.http.get<ItemDto>(`${this.base}/items/${id}`, { withCredentials: true });
|
||||
return this.http.get<ItemDto>(`${this.base}/items/${id}`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
createItem(body: SaveItemDto): Observable<ItemDto> {
|
||||
return this.http.post<ItemDto>(`${this.base}/items`, body, { withCredentials: true });
|
||||
return this.http.post<ItemDto>(`${this.base}/items`, body, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
updateItem(id: string, body: Required<SaveItemDto>): Observable<ItemDto> {
|
||||
return this.http.put<ItemDto>(`${this.base}/items/${id}`, body, { withCredentials: true });
|
||||
return this.http.put<ItemDto>(`${this.base}/items/${id}`, body, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
deleteItem(id: string, version: number): Observable<void> {
|
||||
return this.http.delete<void>(`${this.base}/items/${id}`, {
|
||||
params: { version },
|
||||
@@ -75,6 +97,7 @@ export class ApiClientService {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
setUserActive(id: string, active: boolean): Observable<UserDto> {
|
||||
return this.http.patch<UserDto>(
|
||||
`${this.base}/users/${id}/active`,
|
||||
@@ -82,6 +105,7 @@ export class ApiClientService {
|
||||
{ withCredentials: true },
|
||||
);
|
||||
}
|
||||
|
||||
setUserRoles(id: string, roleIds: string[]): Observable<UserDto> {
|
||||
return this.http.patch<UserDto>(
|
||||
`${this.base}/users/${id}/roles`,
|
||||
@@ -90,28 +114,157 @@ export class ApiClientService {
|
||||
);
|
||||
}
|
||||
|
||||
adminUsers(
|
||||
query: {
|
||||
search?: string;
|
||||
active?: 'all' | 'active' | 'inactive';
|
||||
roleId?: string;
|
||||
sort?: 'name' | 'email' | 'lastLoginAt' | 'createdAt';
|
||||
direction?: 'ASC' | 'DESC';
|
||||
page?: number;
|
||||
pageSize?: number;
|
||||
} = {},
|
||||
): Observable<PageDto<AdminUserListItemDto>> {
|
||||
return this.http.get<PageDto<AdminUserListItemDto>>(`${this.base}/admin/users`, {
|
||||
params: this.params(query),
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
adminUser(id: string): Observable<AdminUserDetailDto> {
|
||||
return this.http.get<AdminUserDetailDto>(`${this.base}/admin/users/${id}`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
activateAdminUser(id: string): Observable<AdminUserDetailDto> {
|
||||
return this.http.patch<AdminUserDetailDto>(
|
||||
`${this.base}/admin/users/${id}/activate`,
|
||||
{},
|
||||
{ withCredentials: true },
|
||||
);
|
||||
}
|
||||
|
||||
deactivateAdminUser(id: string): Observable<AdminUserDetailDto> {
|
||||
return this.http.patch<AdminUserDetailDto>(
|
||||
`${this.base}/admin/users/${id}/deactivate`,
|
||||
{},
|
||||
{ withCredentials: true },
|
||||
);
|
||||
}
|
||||
|
||||
assignAdminUserRole(userId: string, roleId: string): Observable<AdminUserDetailDto> {
|
||||
return this.http.post<AdminUserDetailDto>(
|
||||
`${this.base}/admin/users/${userId}/roles/${roleId}`,
|
||||
{},
|
||||
{ withCredentials: true },
|
||||
);
|
||||
}
|
||||
|
||||
removeAdminUserRole(userId: string, roleId: string): Observable<AdminUserDetailDto> {
|
||||
return this.http.delete<AdminUserDetailDto>(
|
||||
`${this.base}/admin/users/${userId}/roles/${roleId}`,
|
||||
{ withCredentials: true },
|
||||
);
|
||||
}
|
||||
|
||||
adminUserSessions(id: string): Observable<AdminSessionDto[]> {
|
||||
return this.http.get<AdminSessionDto[]>(`${this.base}/admin/users/${id}/sessions`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
revokeAdminUserSession(userId: string, sessionId: string): Observable<void> {
|
||||
return this.http.delete<void>(`${this.base}/admin/users/${userId}/sessions/${sessionId}`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
revokeAdminUserSessions(userId: string): Observable<{ revoked: number }> {
|
||||
return this.http.delete<{ revoked: number }>(`${this.base}/admin/users/${userId}/sessions`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
roles(): Observable<RoleDto[]> {
|
||||
return this.http.get<RoleDto[]>(`${this.base}/roles`, { withCredentials: true });
|
||||
return this.http.get<RoleDto[]>(`${this.base}/roles`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
createRole(body: { name: string; permissions: string[] }): Observable<RoleDto> {
|
||||
return this.http.post<RoleDto>(`${this.base}/roles`, body, { withCredentials: true });
|
||||
return this.http.post<RoleDto>(`${this.base}/roles`, body, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
updateRole(id: string, body: { name: string; permissions: string[] }): Observable<RoleDto> {
|
||||
return this.http.put<RoleDto>(`${this.base}/roles/${id}`, body, { withCredentials: true });
|
||||
return this.http.put<RoleDto>(`${this.base}/roles/${id}`, body, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
deleteRole(id: string): Observable<void> {
|
||||
return this.http.delete<void>(`${this.base}/roles/${id}`, { withCredentials: true });
|
||||
return this.http.delete<void>(`${this.base}/roles/${id}`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
adminRoles(): Observable<RoleDto[]> {
|
||||
return this.http.get<RoleDto[]>(`${this.base}/admin/roles`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
adminRole(id: string): Observable<RoleDto> {
|
||||
return this.http.get<RoleDto>(`${this.base}/admin/roles/${id}`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
createAdminRole(body: {
|
||||
name: string;
|
||||
description?: string;
|
||||
permissions: Permission[];
|
||||
}): Observable<RoleDto> {
|
||||
return this.http.post<RoleDto>(`${this.base}/admin/roles`, body, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
updateAdminRole(
|
||||
id: string,
|
||||
body: { name: string; description?: string; permissions: Permission[] },
|
||||
): Observable<RoleDto> {
|
||||
return this.http.put<RoleDto>(`${this.base}/admin/roles/${id}`, body, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
deleteAdminRole(id: string): Observable<void> {
|
||||
return this.http.delete<void>(`${this.base}/admin/roles/${id}`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
sessions(): Observable<SessionDto[]> {
|
||||
return this.http.get<SessionDto[]>(`${this.base}/sessions/own`, { withCredentials: true });
|
||||
return this.http.get<SessionDto[]>(`${this.base}/sessions/own`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
revokeSession(id: string): Observable<void> {
|
||||
return this.http.delete<void>(`${this.base}/sessions/own/${id}`, { withCredentials: true });
|
||||
return this.http.delete<void>(`${this.base}/sessions/own/${id}`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
revokeOtherSessions(): Observable<void> {
|
||||
return this.http.delete<void>(`${this.base}/sessions/own`, { withCredentials: true });
|
||||
return this.http.delete<void>(`${this.base}/sessions/own`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
revokeUserSessions(userId: string): Observable<void> {
|
||||
return this.http.delete<void>(`${this.base}/sessions/users/${userId}`, {
|
||||
withCredentials: true,
|
||||
@@ -125,6 +278,61 @@ export class ApiClientService {
|
||||
});
|
||||
}
|
||||
|
||||
notifications(
|
||||
query: {
|
||||
page?: number;
|
||||
pageSize?: number;
|
||||
status?: NotificationStatusFilter;
|
||||
} = {},
|
||||
): Observable<NotificationPageDto> {
|
||||
return this.http.get<NotificationPageDto>(`${this.base}/notifications`, {
|
||||
params: this.params(query),
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
unreadNotificationCount(): Observable<{ count: number }> {
|
||||
return this.http.get<{ count: number }>(`${this.base}/notifications/unread-count`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
markNotificationRead(id: string): Observable<NotificationDto> {
|
||||
return this.http.patch<NotificationDto>(
|
||||
`${this.base}/notifications/${id}/read`,
|
||||
{},
|
||||
{ withCredentials: true },
|
||||
);
|
||||
}
|
||||
|
||||
markNotificationUnread(id: string): Observable<NotificationDto> {
|
||||
return this.http.patch<NotificationDto>(
|
||||
`${this.base}/notifications/${id}/unread`,
|
||||
{},
|
||||
{ withCredentials: true },
|
||||
);
|
||||
}
|
||||
|
||||
markAllNotificationsRead(): Observable<{ updated: number }> {
|
||||
return this.http.patch<{ updated: number }>(
|
||||
`${this.base}/notifications/read-all`,
|
||||
{},
|
||||
{ withCredentials: true },
|
||||
);
|
||||
}
|
||||
|
||||
deleteNotification(id: string): Observable<void> {
|
||||
return this.http.delete<void>(`${this.base}/notifications/${id}`, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
createAdminNotification(body: CreateNotificationDto): Observable<NotificationDto> {
|
||||
return this.http.post<NotificationDto>(`${this.base}/admin/notifications`, body, {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
private params(value: Record<string, string | number | undefined>): HttpParams {
|
||||
let params = new HttpParams();
|
||||
Object.entries(value).forEach(([key, entry]) => {
|
||||
|
||||
@@ -11,7 +11,10 @@ export type Permission =
|
||||
| 'audit.read'
|
||||
| 'sessions.readOwn'
|
||||
| 'sessions.revokeOwn'
|
||||
| 'sessions.manage';
|
||||
| 'sessions.manage'
|
||||
| 'notifications.readOwn'
|
||||
| 'notifications.updateOwn'
|
||||
| 'notifications.manage';
|
||||
|
||||
export interface ApiErrorBody {
|
||||
status: number;
|
||||
@@ -38,11 +41,47 @@ export interface UserDto {
|
||||
settings: { tablePageSize: number; sidebarExpanded: boolean };
|
||||
}
|
||||
|
||||
export interface AdminRoleSummaryDto {
|
||||
id: string;
|
||||
name: string;
|
||||
system: boolean;
|
||||
}
|
||||
|
||||
export interface AdminSessionDto {
|
||||
id: string;
|
||||
createdAt: string;
|
||||
lastActivityAt: string;
|
||||
userAgent: string | null;
|
||||
approximateIp: string | null;
|
||||
current: boolean;
|
||||
expiresAt: string;
|
||||
revokedAt: string | null;
|
||||
}
|
||||
|
||||
export interface AdminUserListItemDto {
|
||||
id: string;
|
||||
name: string;
|
||||
email: string | null;
|
||||
active: boolean;
|
||||
roles: AdminRoleSummaryDto[];
|
||||
lastLoginAt: string | null;
|
||||
createdAt: string;
|
||||
activeSessionCount: number;
|
||||
}
|
||||
|
||||
export interface AdminUserDetailDto extends AdminUserListItemDto {
|
||||
effectivePermissions: Permission[];
|
||||
sessions: AdminSessionDto[];
|
||||
}
|
||||
|
||||
export interface RoleDto {
|
||||
id: string;
|
||||
name: string;
|
||||
description: string;
|
||||
system: boolean;
|
||||
protected: boolean;
|
||||
permissions: { id: Permission; description: string }[];
|
||||
userCount?: number;
|
||||
users?: UserDto[];
|
||||
}
|
||||
|
||||
@@ -84,3 +123,32 @@ export interface AuditLogDto {
|
||||
metadata: Record<string, string | number | boolean | null> | null;
|
||||
requestId: string;
|
||||
}
|
||||
|
||||
export type NotificationType = 'system' | 'item.created' | 'item.updated' | 'user.role-changed';
|
||||
|
||||
export type NotificationStatusFilter = 'all' | 'read' | 'unread';
|
||||
|
||||
export interface NotificationDto {
|
||||
id: string;
|
||||
type: NotificationType;
|
||||
title: string;
|
||||
message: string;
|
||||
link: string | null;
|
||||
metadata: Record<string, string | number | boolean | null> | null;
|
||||
read: boolean;
|
||||
readAt: string | null;
|
||||
createdAt: string;
|
||||
}
|
||||
|
||||
export interface NotificationPageDto extends PageDto<NotificationDto> {
|
||||
unreadCount: number;
|
||||
}
|
||||
|
||||
export interface CreateNotificationDto {
|
||||
userId: string;
|
||||
type: NotificationType;
|
||||
title: string;
|
||||
message: string;
|
||||
link?: string;
|
||||
metadata?: Record<string, string | number | boolean | null>;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user