@managemint-solutions/sdk 0.19.0 → 0.20.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.
- package/dist/client.d.ts +2 -0
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/notifications/index.d.ts +8 -0
- package/dist/notifications/index.js +17 -2
- package/dist/notifications/index.js.map +1 -1
- package/dist/service-client/index.d.ts +2 -0
- package/dist/service-client/index.js +7 -0
- package/dist/service-client/index.js.map +1 -1
- package/dist/support/tickets/dto.d.ts +33 -0
- package/dist/support/tickets/dto.js +141 -0
- package/dist/support/tickets/dto.js.map +1 -0
- package/dist/support/tickets/index.d.ts +161 -0
- package/dist/support/tickets/index.js +443 -0
- package/dist/support/tickets/index.js.map +1 -0
- package/dist/users/dto.d.ts +27 -1
- package/dist/users/dto.js +117 -1
- package/dist/users/dto.js.map +1 -1
- package/dist/users/index.d.ts +13 -0
- package/dist/users/index.js +32 -0
- package/dist/users/index.js.map +1 -1
- package/dist/users/paths.d.ts +24 -0
- package/dist/users/paths.js +39 -0
- package/dist/users/paths.js.map +1 -0
- package/package.json +8 -3
package/dist/users/dto.js
CHANGED
|
@@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.UpdateUserDto = exports.GetUsersQueryDto = exports.AddUserDto = exports.UserIdDto = void 0;
|
|
12
|
+
exports.UpdateMyProfileDto = exports.UpdateUserDto = exports.GetUsersQueryDto = exports.AddUserDto = exports.UserIdDto = void 0;
|
|
13
13
|
const class_validator_1 = require("class-validator");
|
|
14
14
|
const class_transformer_1 = require("class-transformer");
|
|
15
15
|
const validators_1 = require("../validators");
|
|
@@ -272,4 +272,120 @@ __decorate([
|
|
|
272
272
|
(0, class_validator_1.IsEmail)({}, { message: 'Invalid emergency contact email address' }),
|
|
273
273
|
__metadata("design:type", Object)
|
|
274
274
|
], UpdateUserDto.prototype, "emergency_contact_email", void 0);
|
|
275
|
+
/**
|
|
276
|
+
* `PATCH /users/me` — what a member may change about themselves.
|
|
277
|
+
*
|
|
278
|
+
* Every field here also appears on UpdateUserDto with the same constraints; what makes
|
|
279
|
+
* this a separate class is what it *omits*. The api's ValidationPipe runs
|
|
280
|
+
* `whitelist + forbidNonWhitelisted`, so a self-service request carrying `job_title`,
|
|
281
|
+
* `manager_id`, `employment_type`, `start_date`, `end_date` or `profile_image` is
|
|
282
|
+
* rejected with a 400 rather than silently ignored — the narrowing is the guard.
|
|
283
|
+
*/
|
|
284
|
+
class UpdateMyProfileDto {
|
|
285
|
+
name;
|
|
286
|
+
surname;
|
|
287
|
+
phone;
|
|
288
|
+
country_code;
|
|
289
|
+
birthday;
|
|
290
|
+
social_facebook;
|
|
291
|
+
social_linkedin;
|
|
292
|
+
social_twitter;
|
|
293
|
+
social_instagram;
|
|
294
|
+
social_github;
|
|
295
|
+
social_website;
|
|
296
|
+
emergency_contact_name;
|
|
297
|
+
emergency_contact_relationship;
|
|
298
|
+
emergency_contact_phone;
|
|
299
|
+
emergency_contact_email;
|
|
300
|
+
}
|
|
301
|
+
exports.UpdateMyProfileDto = UpdateMyProfileDto;
|
|
302
|
+
__decorate([
|
|
303
|
+
(0, class_validator_1.IsString)({ message: 'Invalid name' }),
|
|
304
|
+
(0, class_validator_1.MinLength)(1, { message: 'Name is required' }),
|
|
305
|
+
(0, class_validator_1.MaxLength)(50, { message: 'Name cannot be longer than 50 characters' }),
|
|
306
|
+
__metadata("design:type", String)
|
|
307
|
+
], UpdateMyProfileDto.prototype, "name", void 0);
|
|
308
|
+
__decorate([
|
|
309
|
+
(0, class_validator_1.IsString)({ message: 'Invalid surname' }),
|
|
310
|
+
(0, class_validator_1.MinLength)(1, { message: 'Surname is required' }),
|
|
311
|
+
(0, class_validator_1.MaxLength)(50, { message: 'Surname cannot be longer than 50 characters' }),
|
|
312
|
+
__metadata("design:type", String)
|
|
313
|
+
], UpdateMyProfileDto.prototype, "surname", void 0);
|
|
314
|
+
__decorate([
|
|
315
|
+
(0, class_validator_1.IsString)({ message: 'Invalid phone number' }),
|
|
316
|
+
__metadata("design:type", String)
|
|
317
|
+
], UpdateMyProfileDto.prototype, "phone", void 0);
|
|
318
|
+
__decorate([
|
|
319
|
+
(0, class_validator_1.IsString)({ message: 'Country code is required' }),
|
|
320
|
+
(0, class_validator_1.MinLength)(1, { message: 'Country code is required' }),
|
|
321
|
+
__metadata("design:type", String)
|
|
322
|
+
], UpdateMyProfileDto.prototype, "country_code", void 0);
|
|
323
|
+
__decorate([
|
|
324
|
+
(0, class_validator_1.IsOptional)(),
|
|
325
|
+
(0, validators_1.IsNullable)(),
|
|
326
|
+
(0, class_validator_1.IsDateString)({}, { message: 'Birthday must be a valid ISO 8601 date string' }),
|
|
327
|
+
__metadata("design:type", Object)
|
|
328
|
+
], UpdateMyProfileDto.prototype, "birthday", void 0);
|
|
329
|
+
__decorate([
|
|
330
|
+
(0, class_validator_1.IsOptional)(),
|
|
331
|
+
(0, validators_1.IsNullable)(),
|
|
332
|
+
(0, class_validator_1.IsUrl)({}, { message: 'Invalid Facebook URL' }),
|
|
333
|
+
__metadata("design:type", Object)
|
|
334
|
+
], UpdateMyProfileDto.prototype, "social_facebook", void 0);
|
|
335
|
+
__decorate([
|
|
336
|
+
(0, class_validator_1.IsOptional)(),
|
|
337
|
+
(0, validators_1.IsNullable)(),
|
|
338
|
+
(0, class_validator_1.IsUrl)({}, { message: 'Invalid LinkedIn URL' }),
|
|
339
|
+
__metadata("design:type", Object)
|
|
340
|
+
], UpdateMyProfileDto.prototype, "social_linkedin", void 0);
|
|
341
|
+
__decorate([
|
|
342
|
+
(0, class_validator_1.IsOptional)(),
|
|
343
|
+
(0, validators_1.IsNullable)(),
|
|
344
|
+
(0, class_validator_1.IsUrl)({}, { message: 'Invalid Twitter URL' }),
|
|
345
|
+
__metadata("design:type", Object)
|
|
346
|
+
], UpdateMyProfileDto.prototype, "social_twitter", void 0);
|
|
347
|
+
__decorate([
|
|
348
|
+
(0, class_validator_1.IsOptional)(),
|
|
349
|
+
(0, validators_1.IsNullable)(),
|
|
350
|
+
(0, class_validator_1.IsUrl)({}, { message: 'Invalid Instagram URL' }),
|
|
351
|
+
__metadata("design:type", Object)
|
|
352
|
+
], UpdateMyProfileDto.prototype, "social_instagram", void 0);
|
|
353
|
+
__decorate([
|
|
354
|
+
(0, class_validator_1.IsOptional)(),
|
|
355
|
+
(0, validators_1.IsNullable)(),
|
|
356
|
+
(0, class_validator_1.IsUrl)({}, { message: 'Invalid GitHub URL' }),
|
|
357
|
+
__metadata("design:type", Object)
|
|
358
|
+
], UpdateMyProfileDto.prototype, "social_github", void 0);
|
|
359
|
+
__decorate([
|
|
360
|
+
(0, class_validator_1.IsOptional)(),
|
|
361
|
+
(0, validators_1.IsNullable)(),
|
|
362
|
+
(0, class_validator_1.IsUrl)({}, { message: 'Invalid website URL' }),
|
|
363
|
+
__metadata("design:type", Object)
|
|
364
|
+
], UpdateMyProfileDto.prototype, "social_website", void 0);
|
|
365
|
+
__decorate([
|
|
366
|
+
(0, class_validator_1.IsOptional)(),
|
|
367
|
+
(0, validators_1.IsNullable)(),
|
|
368
|
+
(0, class_validator_1.IsString)({ message: 'Invalid emergency contact name' }),
|
|
369
|
+
(0, class_validator_1.MinLength)(1, { message: 'Emergency contact name is required' }),
|
|
370
|
+
(0, class_validator_1.MaxLength)(50, { message: 'Emergency contact name cannot be longer than 50 characters' }),
|
|
371
|
+
__metadata("design:type", Object)
|
|
372
|
+
], UpdateMyProfileDto.prototype, "emergency_contact_name", void 0);
|
|
373
|
+
__decorate([
|
|
374
|
+
(0, class_validator_1.IsOptional)(),
|
|
375
|
+
(0, validators_1.IsNullable)(),
|
|
376
|
+
(0, class_validator_1.IsEnum)(enum_1.EmergencyContactRelationship, { message: 'Invalid emergency contact relationship' }),
|
|
377
|
+
__metadata("design:type", Object)
|
|
378
|
+
], UpdateMyProfileDto.prototype, "emergency_contact_relationship", void 0);
|
|
379
|
+
__decorate([
|
|
380
|
+
(0, class_validator_1.IsOptional)(),
|
|
381
|
+
(0, validators_1.IsNullable)(),
|
|
382
|
+
(0, class_validator_1.IsString)({ message: 'Invalid emergency contact phone number' }),
|
|
383
|
+
__metadata("design:type", Object)
|
|
384
|
+
], UpdateMyProfileDto.prototype, "emergency_contact_phone", void 0);
|
|
385
|
+
__decorate([
|
|
386
|
+
(0, class_validator_1.IsOptional)(),
|
|
387
|
+
(0, validators_1.IsNullable)(),
|
|
388
|
+
(0, class_validator_1.IsEmail)({}, { message: 'Invalid emergency contact email address' }),
|
|
389
|
+
__metadata("design:type", Object)
|
|
390
|
+
], UpdateMyProfileDto.prototype, "emergency_contact_email", void 0);
|
|
275
391
|
//# sourceMappingURL=dto.js.map
|
package/dist/users/dto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dto.js","sourceRoot":"","sources":["../../src/users/dto.ts"],"names":[],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"dto.js","sourceRoot":"","sources":["../../src/users/dto.ts"],"names":[],"mappings":"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"}
|
package/dist/users/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { type AuditActor, type AuditResource, type AuditRow } from '../audit';
|
|
|
4
4
|
import type { TypedSupabaseClient } from '../client';
|
|
5
5
|
import type { GetUsersQueryDto } from './dto';
|
|
6
6
|
export * from './dto';
|
|
7
|
+
export * from './paths';
|
|
7
8
|
/** The full users row. The api resolves its manager/created_by/last_updated_by ids into identities. */
|
|
8
9
|
export type UserRow = Record<string, unknown> & {
|
|
9
10
|
mms_id: string;
|
|
@@ -28,6 +29,18 @@ export declare class UsersResource {
|
|
|
28
29
|
activeCount(): Promise<number>;
|
|
29
30
|
isActive(userId: string): Promise<boolean>;
|
|
30
31
|
update(userId: string, patch: AuditRow): Promise<UserRow>;
|
|
32
|
+
/**
|
|
33
|
+
* Stores a member's avatar and puts its public URL on their row.
|
|
34
|
+
*
|
|
35
|
+
* Runs on the caller's own client: the storage policies scope writes to
|
|
36
|
+
* `organizationId/userId/`, and `profile_image` is in the `authenticated` column grant, so
|
|
37
|
+
* nothing here needs the service role. The row write goes through `update`, which means the
|
|
38
|
+
* avatar change is audited like any other.
|
|
39
|
+
*
|
|
40
|
+
* The previous object is removed *after* the new URL is committed, and a failed cleanup is
|
|
41
|
+
* swallowed — an orphaned object is a storage bill, a failed upload is a broken avatar.
|
|
42
|
+
*/
|
|
43
|
+
setProfileImage(userId: string, file: File): Promise<UserRow>;
|
|
31
44
|
/** `active` is not an archive flag, so a deactivation is recorded as a plain UPDATE. */
|
|
32
45
|
setActive(userId: string, active: boolean): Promise<UserRow>;
|
|
33
46
|
/**
|
package/dist/users/index.js
CHANGED
|
@@ -18,8 +18,11 @@ exports.UsersResource = void 0;
|
|
|
18
18
|
const enum_1 = require("@managemint-solutions/entities/audit-trail/enum");
|
|
19
19
|
const audit_1 = require("../audit");
|
|
20
20
|
const errors_1 = require("../errors");
|
|
21
|
+
const paths_1 = require("../supporting-files/paths");
|
|
21
22
|
const transforms_1 = require("../transforms");
|
|
23
|
+
const paths_2 = require("./paths");
|
|
22
24
|
__exportStar(require("./dto"), exports);
|
|
25
|
+
__exportStar(require("./paths"), exports);
|
|
23
26
|
const USERS_TABLE = {
|
|
24
27
|
table: 'users',
|
|
25
28
|
entityType: enum_1.AuditTrailEntityType.USER,
|
|
@@ -118,6 +121,35 @@ class UsersResource {
|
|
|
118
121
|
});
|
|
119
122
|
return this.getRow(userId);
|
|
120
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Stores a member's avatar and puts its public URL on their row.
|
|
126
|
+
*
|
|
127
|
+
* Runs on the caller's own client: the storage policies scope writes to
|
|
128
|
+
* `organizationId/userId/`, and `profile_image` is in the `authenticated` column grant, so
|
|
129
|
+
* nothing here needs the service role. The row write goes through `update`, which means the
|
|
130
|
+
* avatar change is audited like any other.
|
|
131
|
+
*
|
|
132
|
+
* The previous object is removed *after* the new URL is committed, and a failed cleanup is
|
|
133
|
+
* swallowed — an orphaned object is a storage bill, a failed upload is a broken avatar.
|
|
134
|
+
*/
|
|
135
|
+
async setProfileImage(userId, file) {
|
|
136
|
+
const { name, extension } = (0, paths_1.splitFileName)((0, paths_1.sanitizeFileName)(file.name));
|
|
137
|
+
const path = (0, paths_2.profileImagePath)(this.auth.organization_id, userId, name, extension);
|
|
138
|
+
const previous = (0, paths_2.profileImageObjectPath)((await this.getRow(userId)).profile_image);
|
|
139
|
+
const { error } = await this.supabase.storage
|
|
140
|
+
.from(paths_2.PROFILE_PICTURES_BUCKET)
|
|
141
|
+
.upload(path, file, { cacheControl: '3600', upsert: true });
|
|
142
|
+
if (error)
|
|
143
|
+
throw (0, errors_1.mapStorageError)(error, `Failed to upload profile image: ${file.name}`);
|
|
144
|
+
const row = await this.update(userId, {
|
|
145
|
+
profile_image: this.supabase.storage.from(paths_2.PROFILE_PICTURES_BUCKET).getPublicUrl(path).data
|
|
146
|
+
.publicUrl,
|
|
147
|
+
});
|
|
148
|
+
if (previous && previous !== path) {
|
|
149
|
+
await this.supabase.storage.from(paths_2.PROFILE_PICTURES_BUCKET).remove([previous]);
|
|
150
|
+
}
|
|
151
|
+
return row;
|
|
152
|
+
}
|
|
121
153
|
/** `active` is not an archive flag, so a deactivation is recorded as a plain UPDATE. */
|
|
122
154
|
async setActive(userId, active) {
|
|
123
155
|
return this.update(userId, { active });
|
package/dist/users/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/users/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0EAAuF;AAGvF,oCAOkB;AAElB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/users/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0EAAuF;AAGvF,oCAOkB;AAElB,sCAA+D;AAC/D,qDAA4E;AAC5E,8CAAmD;AAEnD,mCAA4F;AAE5F,wCAAsB;AACtB,0CAAwB;AAExB,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,OAAO;IACd,UAAU,EAAE,2BAAoB,CAAC,IAAI;CAC7B,CAAC;AAEX,MAAM,gBAAgB,GACpB,iFAA0F,CAAC;AAU7F,MAAa,aAAa;IAIL;IACA;IAJF,KAAK,CAAe;IAErC,YACmB,QAA6B,EAC7B,IAAgB,EACjC,KAAoB;QAFH,aAAQ,GAAR,QAAQ,CAAqB;QAC7B,SAAI,GAAJ,IAAI,CAAY;QAGjC,IAAI,CAAC,KAAK,GAAG,IAAA,oBAAY,EAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAuB;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;QACrC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QAE3C,2FAA2F;QAC3F,0DAA0D;QAC1D,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ;aAC3B,IAAI,CAAC,OAAO,CAAC;aACb,MAAM,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;aAChD,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;aAChD,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;aACzC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;QAExC,2EAA2E;QAC3E,yCAAyC;QACzC,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,UAAU,GAAG,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,UAAU,GAAG,UAAU,CAAC,EAAE,CAAC,IAAA,oBAAO,EAAC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,UAAU,CAAC;QAChD,IAAI,KAAK;YAAE,MAAM,IAAA,0BAAiB,EAAC,KAAK,CAAC,CAAC;QAE1C,OAAO,IAAA,sBAAS,EAAc,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ;aACxC,IAAI,CAAC,OAAO,CAAC;aACb,MAAM,CAAC,GAAG,CAAC;aACX,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;aACpB,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;aAChD,MAAM,EAAE,CAAC;QACZ,IAAI,KAAK;YAAE,MAAM,IAAA,0BAAiB,EAAC,KAAK,CAAC,CAAC;QAE1C,OAAO,IAAA,yBAAiB,EAAC,IAA2B,CAAuB,CAAC;IAC9E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,MAAsB;QACvC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ;aACxC,IAAI,CAAC,eAAe,CAAC;aACrB,MAAM,CAAC,GAAG,CAAC;aACX,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;aACpB,MAAM,EAAE,CAAC;QACZ,IAAI,KAAK;YAAE,MAAM,IAAA,0BAAiB,EAAC,KAAK,CAAC,CAAC;QAE1C,OAAO,IAA+B,CAAC;IACzC,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,WAAW;QACf,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ;aACzC,IAAI,CAAC,OAAO,CAAC;aACb,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;aAChD,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;aAChD,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtB,IAAI,KAAK;YAAE,MAAM,IAAA,0BAAiB,EAAC,KAAK,CAAC,CAAC;QAE1C,OAAO,KAAK,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ;aACxC,IAAI,CAAC,OAAO,CAAC;aACb,MAAM,CAAC,QAAQ,CAAC;aAChB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;aACpB,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;aAChD,MAAM,EAAE,CAAC;QACZ,IAAI,KAAK;YAAE,MAAM,IAAA,0BAAiB,EAAC,KAAK,CAAC,CAAC;QAE1C,OAAQ,IAA4B,CAAC,MAAM,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,KAAe;QAC1C,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;YAC9B,GAAG,KAAK;YACR,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;SAClC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,IAAU;QAC9C,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,qBAAa,EAAC,IAAA,wBAAgB,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,IAAA,wBAAgB,EAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAElF,MAAM,QAAQ,GAAG,IAAA,8BAAsB,EAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAEnF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO;aAC1C,IAAI,CAAC,+BAAuB,CAAC;aAC7B,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,KAAK;YAAE,MAAM,IAAA,wBAAe,EAAC,KAAK,EAAE,mCAAmC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAExF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACpC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,+BAAuB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI;iBACvF,SAAS;SACb,CAAC,CAAC;QAEH,IAAI,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,+BAAuB,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/E,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,MAAe;QAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,SAAwB;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;CACF;AAxJD,sCAwJC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Storage bucket every profile picture lives in. Public-read; writes are policy-scoped. */
|
|
2
|
+
export declare const PROFILE_PICTURES_BUCKET = "profile-pictures";
|
|
3
|
+
/**
|
|
4
|
+
* Where a member's avatar lives in the `profile-pictures` bucket.
|
|
5
|
+
*
|
|
6
|
+
* `organizationId/userId/timestamp-file` — the organization leads so the storage policy can
|
|
7
|
+
* scope by tenant, and the user id follows so it can scope by owner. Neither segment comes
|
|
8
|
+
* from the client.
|
|
9
|
+
*
|
|
10
|
+
* The timestamp is what makes each upload a *new* key. The bucket is public, so the stored
|
|
11
|
+
* URL is served straight from the CDN with a year-long cache; overwriting a stable key in
|
|
12
|
+
* place would leave every viewer looking at the old avatar. The previous object is removed
|
|
13
|
+
* once the new URL is on the row.
|
|
14
|
+
*/
|
|
15
|
+
export declare const profileImagePath: (organizationId: string, userId: string, name: string, extension: string) => string;
|
|
16
|
+
/**
|
|
17
|
+
* The object key behind a stored `users.profile_image` URL, so the previous avatar can be
|
|
18
|
+
* removed when a new one replaces it.
|
|
19
|
+
*
|
|
20
|
+
* Returns null for anything that is not one of our own public URLs — the column also holds
|
|
21
|
+
* whatever `raw_user_meta_data` carried at signup (a Google or Gravatar URL), and those are
|
|
22
|
+
* not ours to delete.
|
|
23
|
+
*/
|
|
24
|
+
export declare const profileImageObjectPath: (profileImage: unknown) => string | null;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.profileImageObjectPath = exports.profileImagePath = exports.PROFILE_PICTURES_BUCKET = void 0;
|
|
4
|
+
/** Storage bucket every profile picture lives in. Public-read; writes are policy-scoped. */
|
|
5
|
+
exports.PROFILE_PICTURES_BUCKET = 'profile-pictures';
|
|
6
|
+
/**
|
|
7
|
+
* Where a member's avatar lives in the `profile-pictures` bucket.
|
|
8
|
+
*
|
|
9
|
+
* `organizationId/userId/timestamp-file` — the organization leads so the storage policy can
|
|
10
|
+
* scope by tenant, and the user id follows so it can scope by owner. Neither segment comes
|
|
11
|
+
* from the client.
|
|
12
|
+
*
|
|
13
|
+
* The timestamp is what makes each upload a *new* key. The bucket is public, so the stored
|
|
14
|
+
* URL is served straight from the CDN with a year-long cache; overwriting a stable key in
|
|
15
|
+
* place would leave every viewer looking at the old avatar. The previous object is removed
|
|
16
|
+
* once the new URL is on the row.
|
|
17
|
+
*/
|
|
18
|
+
const profileImagePath = (organizationId, userId, name, extension) => `${organizationId}/${userId}/${Date.now()}-${name}${extension ? `.${extension}` : ''}`;
|
|
19
|
+
exports.profileImagePath = profileImagePath;
|
|
20
|
+
/**
|
|
21
|
+
* The object key behind a stored `users.profile_image` URL, so the previous avatar can be
|
|
22
|
+
* removed when a new one replaces it.
|
|
23
|
+
*
|
|
24
|
+
* Returns null for anything that is not one of our own public URLs — the column also holds
|
|
25
|
+
* whatever `raw_user_meta_data` carried at signup (a Google or Gravatar URL), and those are
|
|
26
|
+
* not ours to delete.
|
|
27
|
+
*/
|
|
28
|
+
const profileImageObjectPath = (profileImage) => {
|
|
29
|
+
if (typeof profileImage !== 'string')
|
|
30
|
+
return null;
|
|
31
|
+
const marker = `/storage/v1/object/public/${exports.PROFILE_PICTURES_BUCKET}/`;
|
|
32
|
+
const index = profileImage.indexOf(marker);
|
|
33
|
+
if (index === -1)
|
|
34
|
+
return null;
|
|
35
|
+
const path = profileImage.slice(index + marker.length).split('?')[0];
|
|
36
|
+
return path ? decodeURIComponent(path) : null;
|
|
37
|
+
};
|
|
38
|
+
exports.profileImageObjectPath = profileImageObjectPath;
|
|
39
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/users/paths.ts"],"names":[],"mappings":";;;AAAA,4FAA4F;AAC/E,QAAA,uBAAuB,GAAG,kBAAkB,CAAC;AAE1D;;;;;;;;;;;GAWG;AACI,MAAM,gBAAgB,GAAG,CAC9B,cAAsB,EACtB,MAAc,EACd,IAAY,EACZ,SAAiB,EACT,EAAE,CACV,GAAG,cAAc,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAN5E,QAAA,gBAAgB,oBAM4D;AAEzF;;;;;;;GAOG;AACI,MAAM,sBAAsB,GAAG,CAAC,YAAqB,EAAiB,EAAE;IAC7E,IAAI,OAAO,YAAY,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAElD,MAAM,MAAM,GAAG,6BAA6B,+BAAuB,GAAG,CAAC;IACvE,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC,CAAC;AATW,QAAA,sBAAsB,0BASjC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@managemint-solutions/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"description": "Typed Supabase data-access SDK for ManageMint Solutions",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "Scott Bebington <scottbebington@gmail.com>",
|
|
@@ -37,6 +37,9 @@
|
|
|
37
37
|
"ts"
|
|
38
38
|
],
|
|
39
39
|
"rootDir": "src",
|
|
40
|
+
"setupFiles": [
|
|
41
|
+
"reflect-metadata"
|
|
42
|
+
],
|
|
40
43
|
"testRegex": ".*\\.spec\\.ts$",
|
|
41
44
|
"transform": {
|
|
42
45
|
"^.+\\.(t|j)s$": "ts-jest"
|
|
@@ -44,13 +47,14 @@
|
|
|
44
47
|
"testEnvironment": "node"
|
|
45
48
|
},
|
|
46
49
|
"dependencies": {
|
|
47
|
-
"@managemint-solutions/entities": "^1.
|
|
50
|
+
"@managemint-solutions/entities": "^1.5.0"
|
|
48
51
|
},
|
|
49
52
|
"peerDependencies": {
|
|
50
53
|
"@nestjs/common": "^11.0.0",
|
|
51
54
|
"@supabase/supabase-js": "^2.103.0",
|
|
52
55
|
"class-transformer": "^0.5.1",
|
|
53
|
-
"class-validator": "^0.15.0"
|
|
56
|
+
"class-validator": "^0.15.0",
|
|
57
|
+
"reflect-metadata": "^0.2.0"
|
|
54
58
|
},
|
|
55
59
|
"peerDependenciesMeta": {
|
|
56
60
|
"@nestjs/common": {
|
|
@@ -66,6 +70,7 @@
|
|
|
66
70
|
"class-transformer": "^0.5.1",
|
|
67
71
|
"class-validator": "^0.15.1",
|
|
68
72
|
"jest": "^30.0.0",
|
|
73
|
+
"reflect-metadata": "^0.2.2",
|
|
69
74
|
"ts-jest": "^29.2.5",
|
|
70
75
|
"typescript": "^5.7.3"
|
|
71
76
|
}
|