@gymspace/shared 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,185 @@
1
+ // Permission constants
2
+ export const PERMISSIONS = {
3
+ // Organizations
4
+ ORGANIZATIONS_CREATE: 'ORGANIZATIONS_CREATE',
5
+ ORGANIZATIONS_READ: 'ORGANIZATIONS_READ',
6
+ ORGANIZATIONS_UPDATE: 'ORGANIZATIONS_UPDATE',
7
+ ORGANIZATIONS_DELETE: 'ORGANIZATIONS_DELETE',
8
+
9
+ // Gyms
10
+ GYMS_CREATE: 'GYMS_CREATE',
11
+ GYMS_READ: 'GYMS_READ',
12
+ GYMS_UPDATE: 'GYMS_UPDATE',
13
+ GYMS_DELETE: 'GYMS_DELETE',
14
+
15
+ // Collaborators
16
+ COLLABORATORS_CREATE: 'COLLABORATORS_CREATE',
17
+ COLLABORATORS_READ: 'COLLABORATORS_READ',
18
+ COLLABORATORS_UPDATE: 'COLLABORATORS_UPDATE',
19
+ COLLABORATORS_DELETE: 'COLLABORATORS_DELETE',
20
+
21
+ // Clients
22
+ CLIENTS_CREATE: 'CLIENTS_CREATE',
23
+ CLIENTS_READ: 'CLIENTS_READ',
24
+ CLIENTS_UPDATE: 'CLIENTS_UPDATE',
25
+ CLIENTS_DELETE: 'CLIENTS_DELETE',
26
+
27
+ // Contracts
28
+ CONTRACTS_CREATE: 'CONTRACTS_CREATE',
29
+ CONTRACTS_READ: 'CONTRACTS_READ',
30
+ CONTRACTS_UPDATE: 'CONTRACTS_UPDATE',
31
+ CONTRACTS_APPROVE: 'CONTRACTS_APPROVE',
32
+ CONTRACTS_CANCEL: 'CONTRACTS_CANCEL',
33
+
34
+ // Evaluations
35
+ EVALUATIONS_CREATE: 'EVALUATIONS_CREATE',
36
+ EVALUATIONS_READ: 'EVALUATIONS_READ',
37
+ EVALUATIONS_UPDATE: 'EVALUATIONS_UPDATE',
38
+ EVALUATIONS_DELETE: 'EVALUATIONS_DELETE',
39
+
40
+ // Check-ins
41
+ CHECKINS_CREATE: 'CHECKINS_CREATE',
42
+ CHECKINS_READ: 'CHECKINS_READ',
43
+
44
+ // Leads
45
+ LEADS_CREATE: 'LEADS_CREATE',
46
+ LEADS_READ: 'LEADS_READ',
47
+ LEADS_UPDATE: 'LEADS_UPDATE',
48
+ LEADS_DELETE: 'LEADS_DELETE',
49
+
50
+ // Reports
51
+ REPORTS_VIEW: 'REPORTS_VIEW',
52
+ REPORTS_FINANCIAL: 'REPORTS_FINANCIAL',
53
+
54
+ // Settings
55
+ SETTINGS_UPDATE: 'SETTINGS_UPDATE',
56
+
57
+ // Assets
58
+ ASSETS_CREATE: 'ASSETS_CREATE',
59
+ ASSETS_READ: 'ASSETS_READ',
60
+ ASSETS_DELETE: 'ASSETS_DELETE',
61
+
62
+ // Files
63
+ FILES_CREATE: 'FILES_CREATE',
64
+ FILES_READ: 'FILES_READ',
65
+ FILES_DELETE: 'FILES_DELETE',
66
+
67
+ // Products
68
+ PRODUCTS_CREATE: 'PRODUCTS_CREATE',
69
+ PRODUCTS_READ: 'PRODUCTS_READ',
70
+ PRODUCTS_UPDATE: 'PRODUCTS_UPDATE',
71
+ PRODUCTS_DELETE: 'PRODUCTS_DELETE',
72
+
73
+ // Product Categories
74
+ PRODUCT_CATEGORIES_CREATE: 'PRODUCT_CATEGORIES_CREATE',
75
+ PRODUCT_CATEGORIES_READ: 'PRODUCT_CATEGORIES_READ',
76
+ PRODUCT_CATEGORIES_UPDATE: 'PRODUCT_CATEGORIES_UPDATE',
77
+ PRODUCT_CATEGORIES_DELETE: 'PRODUCT_CATEGORIES_DELETE',
78
+
79
+ // Sales
80
+ SALES_CREATE: 'SALES_CREATE',
81
+ SALES_READ: 'SALES_READ',
82
+ SALES_UPDATE: 'SALES_UPDATE',
83
+ SALES_DELETE: 'SALES_DELETE',
84
+
85
+ // Suppliers
86
+ SUPPLIERS_CREATE: 'SUPPLIERS_CREATE',
87
+ SUPPLIERS_READ: 'SUPPLIERS_READ',
88
+ SUPPLIERS_UPDATE: 'SUPPLIERS_UPDATE',
89
+ SUPPLIERS_DELETE: 'SUPPLIERS_DELETE',
90
+ } as const;
91
+
92
+ // Role definitions
93
+ export const ROLE_PERMISSIONS = {
94
+ OWNER: Object.values(PERMISSIONS),
95
+ MANAGER: [
96
+ PERMISSIONS.GYMS_READ,
97
+ PERMISSIONS.COLLABORATORS_READ,
98
+ PERMISSIONS.CLIENTS_CREATE,
99
+ PERMISSIONS.CLIENTS_READ,
100
+ PERMISSIONS.CLIENTS_UPDATE,
101
+ PERMISSIONS.CONTRACTS_CREATE,
102
+ PERMISSIONS.CONTRACTS_READ,
103
+ PERMISSIONS.EVALUATIONS_CREATE,
104
+ PERMISSIONS.EVALUATIONS_READ,
105
+ PERMISSIONS.EVALUATIONS_UPDATE,
106
+ PERMISSIONS.CHECKINS_CREATE,
107
+ PERMISSIONS.CHECKINS_READ,
108
+ PERMISSIONS.REPORTS_VIEW,
109
+ PERMISSIONS.ASSETS_CREATE,
110
+ PERMISSIONS.ASSETS_READ,
111
+ PERMISSIONS.ASSETS_DELETE,
112
+ PERMISSIONS.FILES_CREATE,
113
+ PERMISSIONS.FILES_READ,
114
+ PERMISSIONS.FILES_DELETE,
115
+ PERMISSIONS.PRODUCTS_CREATE,
116
+ PERMISSIONS.PRODUCTS_READ,
117
+ PERMISSIONS.PRODUCTS_UPDATE,
118
+ PERMISSIONS.PRODUCTS_DELETE,
119
+ PERMISSIONS.PRODUCT_CATEGORIES_CREATE,
120
+ PERMISSIONS.PRODUCT_CATEGORIES_READ,
121
+ PERMISSIONS.PRODUCT_CATEGORIES_UPDATE,
122
+ PERMISSIONS.PRODUCT_CATEGORIES_DELETE,
123
+ PERMISSIONS.SALES_CREATE,
124
+ PERMISSIONS.SALES_READ,
125
+ PERMISSIONS.SALES_UPDATE,
126
+ PERMISSIONS.SUPPLIERS_CREATE,
127
+ PERMISSIONS.SUPPLIERS_READ,
128
+ PERMISSIONS.SUPPLIERS_UPDATE,
129
+ PERMISSIONS.SUPPLIERS_DELETE,
130
+ ],
131
+ STAFF: [
132
+ PERMISSIONS.CLIENTS_READ,
133
+ PERMISSIONS.CHECKINS_CREATE,
134
+ PERMISSIONS.CHECKINS_READ,
135
+ PERMISSIONS.PRODUCTS_READ,
136
+ PERMISSIONS.PRODUCT_CATEGORIES_READ,
137
+ PERMISSIONS.SALES_CREATE,
138
+ PERMISSIONS.SALES_READ,
139
+ ],
140
+ ADVISOR: [
141
+ PERMISSIONS.CLIENTS_READ,
142
+ PERMISSIONS.EVALUATIONS_CREATE,
143
+ PERMISSIONS.EVALUATIONS_READ,
144
+ PERMISSIONS.EVALUATIONS_UPDATE,
145
+ PERMISSIONS.ASSETS_CREATE,
146
+ PERMISSIONS.ASSETS_READ,
147
+ PERMISSIONS.FILES_CREATE,
148
+ PERMISSIONS.FILES_READ,
149
+ ],
150
+ } as const;
151
+
152
+ // Cache TTL values (in seconds)
153
+ export const CACHE_TTL = {
154
+ USER_PERMISSIONS: 900, // 15 minutes
155
+ GYM_DATA: 1800, // 30 minutes
156
+ STATIC_DATA: 3600, // 60 minutes
157
+ REPORTS: 300, // 5 minutes
158
+ } as const;
159
+
160
+ // File size limits (in bytes)
161
+ export const FILE_LIMITS = {
162
+ MAX_FILE_SIZE: 10 * 1024 * 1024, // 10MB
163
+ MAX_IMAGE_SIZE: 5 * 1024 * 1024, // 5MB
164
+ MAX_DOCUMENT_SIZE: 10 * 1024 * 1024, // 10MB
165
+ } as const;
166
+
167
+ // Pagination defaults
168
+ export const PAGINATION_DEFAULTS = {
169
+ PAGE: 1,
170
+ LIMIT: 20,
171
+ MAX_LIMIT: 100,
172
+ } as const;
173
+
174
+ // Date formats
175
+ export const DATE_FORMATS = {
176
+ DATE_ONLY: 'YYYY-MM-DD',
177
+ DATETIME: 'YYYY-MM-DD HH:mm:ss',
178
+ TIME_ONLY: 'HH:mm:ss',
179
+ } as const;
180
+
181
+ // Headers
182
+ export const HEADERS = {
183
+ GYM_ID: 'X-Gym-Id',
184
+ REQUEST_ID: 'X-Request-Id',
185
+ } as const;
package/src/enums.ts ADDED
@@ -0,0 +1,110 @@
1
+ export enum UserType {
2
+ OWNER = 'owner',
3
+ COLLABORATOR = 'collaborator',
4
+ }
5
+
6
+ export enum SubscriptionStatus {
7
+ ACTIVE = 'active',
8
+ INACTIVE = 'inactive',
9
+ EXPIRED = 'expired',
10
+ }
11
+
12
+ export enum CollaboratorStatus {
13
+ PENDING = 'pending',
14
+ ACTIVE = 'active',
15
+ INACTIVE = 'inactive',
16
+ }
17
+
18
+ export enum InvitationStatus {
19
+ PENDING = 'pending',
20
+ ACCEPTED = 'accepted',
21
+ EXPIRED = 'expired',
22
+ }
23
+
24
+ export enum ClientStatus {
25
+ ACTIVE = 'active',
26
+ INACTIVE = 'inactive',
27
+ }
28
+
29
+ export enum PlanStatus {
30
+ ACTIVE = 'active',
31
+ INACTIVE = 'inactive',
32
+ ARCHIVED = 'archived',
33
+ }
34
+
35
+ export enum ContractStatus {
36
+ PENDING = 'pending',
37
+ ACTIVE = 'active',
38
+ EXPIRING_SOON = 'expiring_soon',
39
+ EXPIRED = 'expired',
40
+ CANCELLED = 'cancelled',
41
+ }
42
+
43
+ export enum PaymentFrequency {
44
+ MONTHLY = 'monthly',
45
+ QUARTERLY = 'quarterly',
46
+ ANNUAL = 'annual',
47
+ }
48
+
49
+ export enum AssetStatus {
50
+ ACTIVE = 'active',
51
+ DELETED = 'deleted',
52
+ }
53
+
54
+ export enum EvaluationType {
55
+ INITIAL = 'initial',
56
+ PROGRESS = 'progress',
57
+ FINAL = 'final',
58
+ }
59
+
60
+ export enum EvaluationStatus {
61
+ OPEN = 'open',
62
+ IN_PROGRESS = 'in_progress',
63
+ COMPLETED = 'completed',
64
+ CANCELLED = 'cancelled',
65
+ }
66
+
67
+ export enum CommentType {
68
+ PROGRESS_NOTE = 'progress_note',
69
+ PHONE_CALL = 'phone_call',
70
+ MEETING = 'meeting',
71
+ REMINDER = 'reminder',
72
+ OTHER = 'other',
73
+ }
74
+
75
+ export enum AssetCategory {
76
+ MEDICAL_DOCUMENT = 'medical_document',
77
+ IDENTIFICATION = 'identification',
78
+ INSURANCE = 'insurance',
79
+ CONTRACT_COPY = 'contract_copy',
80
+ OTHER = 'other',
81
+ }
82
+
83
+ export enum ContractAssetType {
84
+ PAYMENT_RECEIPT = 'payment_receipt',
85
+ CONTRACT_DOCUMENT = 'contract_document',
86
+ IDENTIFICATION = 'identification',
87
+ OTHER = 'other',
88
+ }
89
+
90
+ export enum EvaluationAssetStage {
91
+ INITIAL = 'initial',
92
+ PROGRESS = 'progress',
93
+ FINAL = 'final',
94
+ }
95
+
96
+ export enum EvaluationAssetCategory {
97
+ BODY_PHOTO = 'body_photo',
98
+ MEASUREMENT_PHOTO = 'measurement_photo',
99
+ DOCUMENT = 'document',
100
+ REPORT = 'report',
101
+ OTHER = 'other',
102
+ }
103
+
104
+ export enum LeadStatus {
105
+ NEW = 'NEW',
106
+ CONTACTED = 'CONTACTED',
107
+ INTERESTED = 'INTERESTED',
108
+ CONVERTED = 'CONVERTED',
109
+ LOST = 'LOST',
110
+ }
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from './types';
2
+ export * from './enums';
3
+ export * from './interfaces';
4
+ export * from './constants';
@@ -0,0 +1,72 @@
1
+ import { UUID, Permission } from './types';
2
+ import { UserType, CollaboratorStatus } from './enums';
3
+
4
+ export interface IUser {
5
+ id: UUID;
6
+ email: string;
7
+ name: string;
8
+ phone?: string;
9
+ userType: UserType;
10
+ emailVerifiedAt?: Date;
11
+ }
12
+
13
+ export interface IOrganization {
14
+ id: UUID;
15
+ ownerUserId: UUID;
16
+ name: string;
17
+ subscriptionPlanId: UUID;
18
+ subscriptionStatus: string;
19
+ subscriptionStart: Date;
20
+ subscriptionEnd: Date;
21
+ country: string;
22
+ currency: string;
23
+ timezone: string;
24
+ settings?: Record<string, any>;
25
+ }
26
+
27
+ export interface IGym {
28
+ id: UUID;
29
+ organizationId: UUID;
30
+ name: string;
31
+ address?: string;
32
+ description?: string;
33
+ phone?: string;
34
+ gymCode: string;
35
+ profileAssetId?: UUID;
36
+ coverAssetId?: UUID;
37
+ evaluationStructure?: Record<string, any>;
38
+ }
39
+
40
+ export interface ICollaborator {
41
+ id: UUID;
42
+ userId: UUID;
43
+ gymId: UUID;
44
+ roleId: UUID;
45
+ status: CollaboratorStatus;
46
+ hiredDate?: Date;
47
+ invitationId?: UUID;
48
+ profileAssetId?: UUID;
49
+ coverAssetId?: UUID;
50
+ description?: string;
51
+ specialties?: string[];
52
+ }
53
+
54
+ export interface IRole {
55
+ id: UUID;
56
+ name: string;
57
+ permissions: Permission[];
58
+ description?: string;
59
+ canManageEvaluations: boolean;
60
+ }
61
+
62
+ export interface IRequestContext {
63
+ user: IUser;
64
+ gym?: IGym;
65
+ organization?: IOrganization;
66
+ permissions: Permission[];
67
+ hasPermission(permission: Permission): boolean;
68
+ canAccess(resource: string, action: string): boolean;
69
+ getGymId(): UUID | undefined;
70
+ getOrganizationId(): UUID | undefined;
71
+ getUserId(): UUID;
72
+ }
package/src/types.ts ADDED
@@ -0,0 +1,100 @@
1
+ export type UUID = string;
2
+
3
+ export type Currency = 'USD' | 'EUR' | 'PEN' | 'MXN' | 'COP' | 'ARS' | 'CLP';
4
+
5
+ export type EntityType =
6
+ | 'user'
7
+ | 'organization'
8
+ | 'gym'
9
+ | 'collaborator'
10
+ | 'client'
11
+ | 'contract'
12
+ | 'evaluation'
13
+ | 'asset';
14
+
15
+ export type Permission =
16
+ | 'ORGANIZATIONS_CREATE'
17
+ | 'ORGANIZATIONS_READ'
18
+ | 'ORGANIZATIONS_UPDATE'
19
+ | 'ORGANIZATIONS_DELETE'
20
+ | 'GYMS_CREATE'
21
+ | 'GYMS_READ'
22
+ | 'GYMS_UPDATE'
23
+ | 'GYMS_DELETE'
24
+ | 'COLLABORATORS_CREATE'
25
+ | 'COLLABORATORS_READ'
26
+ | 'COLLABORATORS_UPDATE'
27
+ | 'COLLABORATORS_DELETE'
28
+ | 'CLIENTS_CREATE'
29
+ | 'CLIENTS_READ'
30
+ | 'CLIENTS_UPDATE'
31
+ | 'CLIENTS_DELETE'
32
+ | 'CONTRACTS_CREATE'
33
+ | 'CONTRACTS_READ'
34
+ | 'CONTRACTS_UPDATE'
35
+ | 'CONTRACTS_APPROVE'
36
+ | 'CONTRACTS_CANCEL'
37
+ | 'EVALUATIONS_CREATE'
38
+ | 'EVALUATIONS_READ'
39
+ | 'EVALUATIONS_UPDATE'
40
+ | 'EVALUATIONS_DELETE'
41
+ | 'CHECKINS_CREATE'
42
+ | 'CHECKINS_READ'
43
+ | 'LEADS_CREATE'
44
+ | 'LEADS_READ'
45
+ | 'LEADS_UPDATE'
46
+ | 'LEADS_DELETE'
47
+ | 'REPORTS_VIEW'
48
+ | 'REPORTS_FINANCIAL'
49
+ | 'SETTINGS_UPDATE'
50
+ | 'ASSETS_CREATE'
51
+ | 'ASSETS_READ'
52
+ | 'ASSETS_DELETE'
53
+ | 'FILES_CREATE'
54
+ | 'FILES_READ'
55
+ | 'FILES_DELETE'
56
+ | 'PRODUCTS_CREATE'
57
+ | 'PRODUCTS_READ'
58
+ | 'PRODUCTS_UPDATE'
59
+ | 'PRODUCTS_DELETE'
60
+ | 'PRODUCT_CATEGORIES_CREATE'
61
+ | 'PRODUCT_CATEGORIES_READ'
62
+ | 'PRODUCT_CATEGORIES_UPDATE'
63
+ | 'PRODUCT_CATEGORIES_DELETE'
64
+ | 'SALES_CREATE'
65
+ | 'SALES_READ'
66
+ | 'SALES_UPDATE'
67
+ | 'SALES_DELETE'
68
+ | 'SUPPLIERS_CREATE'
69
+ | 'SUPPLIERS_READ'
70
+ | 'SUPPLIERS_UPDATE'
71
+ | 'SUPPLIERS_DELETE';
72
+
73
+ export interface AuditFields {
74
+ createdByUserId: UUID;
75
+ updatedByUserId?: UUID;
76
+ createdAt: Date;
77
+ updatedAt: Date;
78
+ deletedAt?: Date;
79
+ }
80
+
81
+ export interface PaginationParams {
82
+ page: number;
83
+ limit: number;
84
+ sortBy?: string;
85
+ sortOrder?: 'asc' | 'desc';
86
+ }
87
+
88
+ export interface PaginationMeta {
89
+ total: number;
90
+ page: number;
91
+ limit: number;
92
+ totalPages: number;
93
+ hasNext: boolean;
94
+ hasPrevious: boolean;
95
+ }
96
+
97
+ export interface PaginatedResponse<T> {
98
+ data: T[];
99
+ meta: PaginationMeta;
100
+ }