operations.service.ts 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { inject, Injectable } from '@angular/core';
  2. import { CoachAvailability, CoachDetailData, CoachSummary, OperationsDashboardData, OperationsPage, OperationsUser, OperationsUserDetail, PayRate, PayrollDetail, PayrollSummary, ScheduleCalendarData } from './admin.models';
  3. import { CloudFunctionsService } from './cloud-functions.service';
  4. export type OperationsListKind = 'relations' | 'course-bindings' | 'appointments' | 'lessons' | 'learning-records' | 'finance' | 'money-logs';
  5. @Injectable({ providedIn: 'root' })
  6. export class OperationsService {
  7. private readonly functions = inject(CloudFunctionsService);
  8. dashboard(): Promise<OperationsDashboardData> {
  9. return this.functions.operations<OperationsDashboardData>('ops/dashboard/summary');
  10. }
  11. request<T>(operation: string, params: Record<string, unknown> = {}): Promise<T> {
  12. return this.functions.operations<T>(operation, params);
  13. }
  14. users(page: number, pageSize: number, search: string, filters: Record<string, unknown> = {}, refresh = false): Promise<OperationsPage<OperationsUser>> {
  15. return this.functions.operations<OperationsPage<OperationsUser>>('ops/users/list', { page, pageSize, search, filters, refresh });
  16. }
  17. userDetail(objectId: string): Promise<OperationsUserDetail> {
  18. return this.functions.operations<OperationsUserDetail>('ops/users/detail', { objectId });
  19. }
  20. coaches(page: number, pageSize: number, search = '', filters: Record<string, unknown> = {}): Promise<OperationsPage<CoachSummary>> {
  21. return this.functions.operations<OperationsPage<CoachSummary>>('ops/coaches/list', { page, pageSize, search, filters });
  22. }
  23. coachDetail(objectId: string): Promise<CoachDetailData> {
  24. return this.functions.operations<CoachDetailData>('ops/coaches/detail', { objectId });
  25. }
  26. schedule(dateFrom: string, dateTo: string, coachId = 0): Promise<ScheduleCalendarData> {
  27. return this.functions.operations<ScheduleCalendarData>('ops/schedule/calendar', { dateFrom, dateTo, filters: { coachId } });
  28. }
  29. availability(coachId: number): Promise<OperationsPage<CoachAvailability>> {
  30. return this.functions.operations<OperationsPage<CoachAvailability>>('ops/coach-availability/list', { page: 1, pageSize: 100, filters: { coachId } });
  31. }
  32. payRates(): Promise<OperationsPage<PayRate>> {
  33. return this.functions.operations<OperationsPage<PayRate>>('ops/pay-rates/list', { page: 1, pageSize: 100 });
  34. }
  35. payrolls(page = 1, pageSize = 20): Promise<OperationsPage<PayrollSummary>> {
  36. return this.functions.operations<OperationsPage<PayrollSummary>>('ops/payroll/list', { page, pageSize });
  37. }
  38. payrollPreview(month: string): Promise<PayrollDetail> {
  39. return this.functions.operations<PayrollDetail>('ops/payroll/preview', { month });
  40. }
  41. payrollDetail(targetId: string): Promise<PayrollDetail> {
  42. return this.functions.operations<PayrollDetail>('ops/payroll/detail', { targetId });
  43. }
  44. list(kind: OperationsListKind, page: number, pageSize: number, search: string, filters: Record<string, unknown> = {}): Promise<OperationsPage> {
  45. const operation = kind === 'relations' ? 'ops/relations/list'
  46. : kind === 'course-bindings' ? 'ops/course-bindings/list'
  47. : kind === 'appointments' ? 'ops/appointments/list'
  48. : kind === 'lessons' ? 'ops/lessons/list'
  49. : kind === 'learning-records' ? 'ops/learning-records/list'
  50. : kind === 'finance' ? 'ops/finance/list'
  51. : 'ops/money-logs/list';
  52. return this.functions.operations<OperationsPage>(operation, { page, pageSize, search, filters });
  53. }
  54. mutate<T>(operation: string, targetId: string, reason: string, payload: Record<string, unknown> = {}, expectedUpdatedAt = '', idempotencyKey = ''): Promise<T> {
  55. return this.functions.operations<T>(operation, { targetId, reason, payload, expectedUpdatedAt, idempotencyKey: idempotencyKey || crypto.randomUUID() });
  56. }
  57. }