@managemint-solutions/sdk 0.17.0 → 0.18.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/audit/index.d.ts +23 -2
- package/dist/audit/index.js +56 -21
- package/dist/audit/index.js.map +1 -1
- package/dist/auth-client/index.d.ts +1 -6
- package/dist/auth-client/index.js +3 -18
- package/dist/auth-client/index.js.map +1 -1
- package/dist/auth.d.ts +36 -1
- package/dist/auth.js +52 -22
- package/dist/auth.js.map +1 -1
- package/dist/billing/index.d.ts +0 -1
- package/dist/billing/index.js +2 -12
- package/dist/billing/index.js.map +1 -1
- package/dist/client.d.ts +16 -1
- package/dist/client.js +8 -6
- package/dist/client.js.map +1 -1
- package/dist/clients/index.js +13 -75
- package/dist/clients/index.js.map +1 -1
- package/dist/errors.d.ts +4 -1
- package/dist/errors.js +7 -58
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +48 -22
- package/dist/index.js +116 -36
- package/dist/index.js.map +1 -1
- package/dist/nest/index.d.ts +26 -3
- package/dist/nest/index.js +54 -15
- package/dist/nest/index.js.map +1 -1
- package/dist/notifications/index.d.ts +0 -1
- package/dist/notifications/index.js +4 -16
- package/dist/notifications/index.js.map +1 -1
- package/dist/organization-invites/index.d.ts +29 -0
- package/dist/organization-invites/index.js +48 -0
- package/dist/organization-invites/index.js.map +1 -0
- package/dist/organizations/index.js +4 -9
- package/dist/organizations/index.js.map +1 -1
- package/dist/permissions/index.d.ts +8 -0
- package/dist/permissions/index.js +16 -1
- package/dist/permissions/index.js.map +1 -1
- package/dist/projects/index.js +12 -75
- package/dist/projects/index.js.map +1 -1
- package/dist/service-client/index.d.ts +2 -0
- package/dist/service-client/index.js +7 -6
- package/dist/service-client/index.js.map +1 -1
- package/dist/supporting-files/index.js +31 -15
- package/dist/supporting-files/index.js.map +1 -1
- package/dist/supporting-files/paths.d.ts +19 -5
- package/dist/supporting-files/paths.js +46 -10
- package/dist/supporting-files/paths.js.map +1 -1
- package/dist/tasks/index.js +7 -33
- package/dist/tasks/index.js.map +1 -1
- package/dist/transforms.d.ts +43 -0
- package/dist/transforms.js +73 -2
- package/dist/transforms.js.map +1 -1
- package/dist/users/index.js +4 -14
- package/dist/users/index.js.map +1 -1
- package/package.json +6 -2
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createSupabaseServiceClient = exports.SupabaseServiceClient = exports.SupabaseOrganizationScope = void 0;
|
|
4
|
-
const
|
|
4
|
+
const auth_1 = require("../auth");
|
|
5
5
|
const audit_1 = require("../audit");
|
|
6
6
|
const enum_1 = require("@managemint-solutions/entities/audit-trail/enum");
|
|
7
7
|
const billing_1 = require("../billing");
|
|
8
8
|
const notifications_1 = require("../notifications");
|
|
9
9
|
const errors_1 = require("../errors");
|
|
10
|
+
const organization_invites_1 = require("../organization-invites");
|
|
10
11
|
const organizations_1 = require("../organizations");
|
|
11
12
|
const permissions_1 = require("../permissions");
|
|
12
13
|
const users_1 = require("../users");
|
|
@@ -21,6 +22,7 @@ class SupabaseOrganizationScope {
|
|
|
21
22
|
actor;
|
|
22
23
|
audit;
|
|
23
24
|
billing;
|
|
25
|
+
invites;
|
|
24
26
|
organizations;
|
|
25
27
|
permissions;
|
|
26
28
|
users;
|
|
@@ -29,6 +31,7 @@ class SupabaseOrganizationScope {
|
|
|
29
31
|
this.actor = actor;
|
|
30
32
|
this.audit = new audit_1.AuditResource(supabase, actor, onAuditError);
|
|
31
33
|
this.billing = new billing_1.BillingResource(supabase, actor, this.audit);
|
|
34
|
+
this.invites = new organization_invites_1.OrganizationInvitesResource(supabase, actor);
|
|
32
35
|
this.organizations = new organizations_1.OrganizationsResource(supabase, actor, this.audit);
|
|
33
36
|
this.permissions = new permissions_1.PermissionsResource(supabase, actor, this.audit);
|
|
34
37
|
this.users = new users_1.UsersResource(supabase, actor, this.audit);
|
|
@@ -62,9 +65,7 @@ class SupabaseServiceClient {
|
|
|
62
65
|
resendEvents;
|
|
63
66
|
constructor(config) {
|
|
64
67
|
this.config = config;
|
|
65
|
-
this.supabase = (0,
|
|
66
|
-
auth: { persistSession: false, autoRefreshToken: false, detectSessionInUrl: false },
|
|
67
|
-
});
|
|
68
|
+
this.supabase = (0, auth_1.createRawClient)(config.url, config.serviceRoleKey);
|
|
68
69
|
this.paystackEvents = new webhook_events_1.WebhookEventsResource(this.supabase, 'paystack_webhook_events');
|
|
69
70
|
this.resendEvents = new webhook_events_1.WebhookEventsResource(this.supabase, 'resend_webhook_events');
|
|
70
71
|
this.signup = new organizations_1.OrganizationSignupResource(this.supabase, (organizationId) => this.forOrganization(organizationId).audit);
|
|
@@ -96,7 +97,7 @@ class SupabaseServiceClient {
|
|
|
96
97
|
.maybeSingle();
|
|
97
98
|
if (error)
|
|
98
99
|
throw (0, errors_1.mapPostgrestError)(error);
|
|
99
|
-
return (data
|
|
100
|
+
return data ? (0, audit_1.withoutInternalId)(data) : null;
|
|
100
101
|
}
|
|
101
102
|
/**
|
|
102
103
|
* A ledger row by id alone. Also unscoped by necessity: a `charge.success` carries the
|
|
@@ -110,7 +111,7 @@ class SupabaseServiceClient {
|
|
|
110
111
|
.maybeSingle();
|
|
111
112
|
if (error)
|
|
112
113
|
throw (0, errors_1.mapPostgrestError)(error);
|
|
113
|
-
return (data
|
|
114
|
+
return data ? (0, audit_1.withoutInternalId)(data) : null;
|
|
114
115
|
}
|
|
115
116
|
}
|
|
116
117
|
exports.SupabaseServiceClient = SupabaseServiceClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service-client/index.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service-client/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,9 +27,15 @@ const BUCKET = 'supporting-files';
|
|
|
27
27
|
const SIGNED_URL_TTL_SECONDS = 300;
|
|
28
28
|
/** Uploads run concurrently in batches of this size. */
|
|
29
29
|
const UPLOAD_BATCH_SIZE = 5;
|
|
30
|
+
/** The `name`/`extension` pair rendered back into the file name it was split from. */
|
|
31
|
+
const fileNameOf = (file) => file.extension ? `${file.name}.${file.extension}` : file.name;
|
|
30
32
|
// The public contract is the shared SupportingFileEntity from @managemint-solutions/entities; the
|
|
31
33
|
// casts at the returns declare the shape the select strings below produce (the columns are
|
|
32
34
|
// defined in the api's supabase/migrations).
|
|
35
|
+
//
|
|
36
|
+
// Object keys are `organizationId/entityType/entityId/file` — the organization leads so a storage
|
|
37
|
+
// policy can scope by tenant. A data migration renames the pre-existing objects, which have no
|
|
38
|
+
// organization segment, into that prefix.
|
|
33
39
|
class SupportingFilesResource {
|
|
34
40
|
supabase;
|
|
35
41
|
auth;
|
|
@@ -53,7 +59,7 @@ class SupportingFilesResource {
|
|
|
53
59
|
throw (0, errors_1.mapPostgrestError)(error);
|
|
54
60
|
const { data: signed, error: signedError } = await this.supabase.storage
|
|
55
61
|
.from(BUCKET)
|
|
56
|
-
.createSignedUrl((0, paths_1.storagePath)(data.entity_type, data.entity_id, data.name, data.extension), SIGNED_URL_TTL_SECONDS);
|
|
62
|
+
.createSignedUrl((0, paths_1.storagePath)(this.auth.organization_id, data.entity_type, data.entity_id, data.name, data.extension), SIGNED_URL_TTL_SECONDS);
|
|
57
63
|
if (signedError)
|
|
58
64
|
throw (0, errors_1.mapStorageError)(signedError);
|
|
59
65
|
return { url: signed.signedUrl, ttl: SIGNED_URL_TTL_SECONDS };
|
|
@@ -79,25 +85,31 @@ class SupportingFilesResource {
|
|
|
79
85
|
.eq('organization_id', this.auth.organization_id);
|
|
80
86
|
if (existingError)
|
|
81
87
|
throw (0, errors_1.mapPostgrestError)(existingError);
|
|
82
|
-
const existingFileNames = existing.map(
|
|
88
|
+
const existingFileNames = existing.map(fileNameOf);
|
|
89
|
+
// Each client name is validated once here, and the object key, the duplicate check and the
|
|
90
|
+
// row are all built from that same split — so what is stored is what presign and remove
|
|
91
|
+
// rebuild later.
|
|
92
|
+
const uploads = input.files.map((file) => ({
|
|
93
|
+
file,
|
|
94
|
+
...(0, paths_1.splitFileName)((0, paths_1.sanitizeFileName)(file.name)),
|
|
95
|
+
}));
|
|
83
96
|
// Every file is written to the bucket, duplicates included — an upsert refreshes the object.
|
|
84
|
-
for (let index = 0; index <
|
|
85
|
-
await Promise.all(
|
|
97
|
+
for (let index = 0; index < uploads.length; index += UPLOAD_BATCH_SIZE) {
|
|
98
|
+
await Promise.all(uploads.slice(index, index + UPLOAD_BATCH_SIZE).map(async ({ file, name, extension }) => {
|
|
86
99
|
const { error } = await this.supabase.storage
|
|
87
100
|
.from(BUCKET)
|
|
88
|
-
.upload(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
if (error)
|
|
93
|
-
throw (0, errors_1.mapStorageError)(error, `Failed to upload file: ${file.name}`);
|
|
101
|
+
.upload((0, paths_1.storagePath)(this.auth.organization_id, entity, entityId, name, extension), file, { cacheControl: '3600', upsert: true });
|
|
102
|
+
if (error) {
|
|
103
|
+
throw (0, errors_1.mapStorageError)(error, `Failed to upload file: ${fileNameOf({ name, extension })}`);
|
|
104
|
+
}
|
|
94
105
|
}));
|
|
95
106
|
}
|
|
96
107
|
// Only files without an existing row get one — the rest were refreshed in place above.
|
|
97
|
-
const newFiles =
|
|
108
|
+
const newFiles = uploads.filter((file) => !existingFileNames.includes(fileNameOf(file)));
|
|
98
109
|
if (newFiles.length > 0) {
|
|
99
|
-
await this.table.insertMany(newFiles.map((
|
|
100
|
-
|
|
110
|
+
await this.table.insertMany(newFiles.map(({ name, extension }) => ({
|
|
111
|
+
name,
|
|
112
|
+
extension,
|
|
101
113
|
entity_type: entity,
|
|
102
114
|
entity_id: entityId,
|
|
103
115
|
organization_id: this.auth.organization_id,
|
|
@@ -113,10 +125,14 @@ class SupportingFilesResource {
|
|
|
113
125
|
const { error: storageError } = await this.supabase.storage
|
|
114
126
|
.from(BUCKET)
|
|
115
127
|
.remove([
|
|
116
|
-
(0, paths_1.storagePath)(data.entity_type, data.entity_id, data.name, data.extension),
|
|
128
|
+
(0, paths_1.storagePath)(this.auth.organization_id, data.entity_type, data.entity_id, data.name, data.extension),
|
|
117
129
|
]);
|
|
118
130
|
if (storageError) {
|
|
119
|
-
|
|
131
|
+
const fileName = fileNameOf({
|
|
132
|
+
name: data.name,
|
|
133
|
+
extension: data.extension,
|
|
134
|
+
});
|
|
135
|
+
throw (0, errors_1.mapStorageError)(storageError, `Failed to delete file: ${fileName}`);
|
|
120
136
|
}
|
|
121
137
|
}
|
|
122
138
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/supporting-files/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAMA,0EAAuF;AAEvF,oCAA+E;AAE/E,sCAA+D;AAC/D,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/supporting-files/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The client-supplied file name, checked before it is allowed anywhere near an object key.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* The name is half of the key, so a separator or a `..` in it would let an upload escape its
|
|
5
|
+
* entity's folder — and, now that the key starts with the organization, its tenant's folder.
|
|
6
|
+
* Anything that is not a plain file name is rejected outright rather than rewritten, so what the
|
|
7
|
+
* `supporting_files` row records is exactly what was stored.
|
|
8
|
+
*/
|
|
9
|
+
export declare const sanitizeFileName: (fileName: string) => string;
|
|
10
|
+
/**
|
|
11
|
+
* Splits an uploaded file name into the `name` / `extension` columns, on the *last* dot — so
|
|
12
|
+
* `archive.tar.gz` is name `archive.tar`, extension `gz`, and `storagePath` rebuilds the key it
|
|
13
|
+
* was stored under. A name with no dot has no extension.
|
|
6
14
|
*/
|
|
7
15
|
export declare const splitFileName: (fileName: string) => {
|
|
8
16
|
name: string;
|
|
9
17
|
extension: string;
|
|
10
18
|
};
|
|
11
|
-
/**
|
|
12
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Where an object lives in the `supporting-files` bucket. The organization leads the key so a
|
|
21
|
+
* storage policy can scope objects by tenant — nothing below it is trusted for that.
|
|
22
|
+
*
|
|
23
|
+
* A data migration renames the existing objects (keyed `entity/entityId/file`) into their
|
|
24
|
+
* organization's prefix; keys written from here already carry it.
|
|
25
|
+
*/
|
|
26
|
+
export declare const storagePath: (organizationId: string, entityType: string, entityId: string, name: string, extension: string) => string;
|
|
@@ -1,18 +1,54 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.storagePath = exports.splitFileName = void 0;
|
|
3
|
+
exports.storagePath = exports.splitFileName = exports.sanitizeFileName = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
/** Longest object-key segment a file name may become. */
|
|
6
|
+
const MAX_FILE_NAME_LENGTH = 255;
|
|
7
|
+
/** What a file name may be made of — no separators, no control characters, no leading dot. */
|
|
8
|
+
const SAFE_FILE_NAME = /^[A-Za-z0-9][A-Za-z0-9 ._()\-]*$/;
|
|
9
|
+
const invalidFileName = () => new errors_1.SupabaseClientError({ status: 400, error: 'Storage Error', message: 'Invalid file name' });
|
|
4
10
|
/**
|
|
5
|
-
*
|
|
11
|
+
* The client-supplied file name, checked before it is allowed anywhere near an object key.
|
|
6
12
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
13
|
+
* The name is half of the key, so a separator or a `..` in it would let an upload escape its
|
|
14
|
+
* entity's folder — and, now that the key starts with the organization, its tenant's folder.
|
|
15
|
+
* Anything that is not a plain file name is rejected outright rather than rewritten, so what the
|
|
16
|
+
* `supporting_files` row records is exactly what was stored.
|
|
9
17
|
*/
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
18
|
+
const sanitizeFileName = (fileName) => {
|
|
19
|
+
const trimmed = fileName.trim();
|
|
20
|
+
if (trimmed === '' ||
|
|
21
|
+
trimmed.length > MAX_FILE_NAME_LENGTH ||
|
|
22
|
+
trimmed === '.' ||
|
|
23
|
+
trimmed === '..' ||
|
|
24
|
+
trimmed.includes('/') ||
|
|
25
|
+
trimmed.includes('\\') ||
|
|
26
|
+
trimmed.includes('\0') ||
|
|
27
|
+
!SAFE_FILE_NAME.test(trimmed)) {
|
|
28
|
+
throw invalidFileName();
|
|
29
|
+
}
|
|
30
|
+
return trimmed;
|
|
31
|
+
};
|
|
32
|
+
exports.sanitizeFileName = sanitizeFileName;
|
|
33
|
+
/**
|
|
34
|
+
* Splits an uploaded file name into the `name` / `extension` columns, on the *last* dot — so
|
|
35
|
+
* `archive.tar.gz` is name `archive.tar`, extension `gz`, and `storagePath` rebuilds the key it
|
|
36
|
+
* was stored under. A name with no dot has no extension.
|
|
37
|
+
*/
|
|
38
|
+
const splitFileName = (fileName) => {
|
|
39
|
+
const lastDot = fileName.lastIndexOf('.');
|
|
40
|
+
if (lastDot <= 0)
|
|
41
|
+
return { name: fileName, extension: '' };
|
|
42
|
+
return { name: fileName.slice(0, lastDot), extension: fileName.slice(lastDot + 1) };
|
|
43
|
+
};
|
|
14
44
|
exports.splitFileName = splitFileName;
|
|
15
|
-
/**
|
|
16
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Where an object lives in the `supporting-files` bucket. The organization leads the key so a
|
|
47
|
+
* storage policy can scope objects by tenant — nothing below it is trusted for that.
|
|
48
|
+
*
|
|
49
|
+
* A data migration renames the existing objects (keyed `entity/entityId/file`) into their
|
|
50
|
+
* organization's prefix; keys written from here already carry it.
|
|
51
|
+
*/
|
|
52
|
+
const storagePath = (organizationId, entityType, entityId, name, extension) => `${organizationId}/${entityType}/${entityId}/${name}${extension ? `.${extension}` : ''}`;
|
|
17
53
|
exports.storagePath = storagePath;
|
|
18
54
|
//# sourceMappingURL=paths.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/supporting-files/paths.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/supporting-files/paths.ts"],"names":[],"mappings":";;;AAAA,sCAAgD;AAEhD,yDAAyD;AACzD,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,8FAA8F;AAC9F,MAAM,cAAc,GAAG,kCAAkC,CAAC;AAE1D,MAAM,eAAe,GAAG,GAAwB,EAAE,CAChD,IAAI,4BAAmB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;AAEjG;;;;;;;GAOG;AACI,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAU,EAAE;IAC3D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEhC,IACE,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,MAAM,GAAG,oBAAoB;QACrC,OAAO,KAAK,GAAG;QACf,OAAO,KAAK,IAAI;QAChB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAC7B,CAAC;QACD,MAAM,eAAe,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAjBW,QAAA,gBAAgB,oBAiB3B;AAEF;;;;GAIG;AACI,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAuC,EAAE;IACrF,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAE3D,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC;AACtF,CAAC,CAAC;AALW,QAAA,aAAa,iBAKxB;AAEF;;;;;;GAMG;AACI,MAAM,WAAW,GAAG,CACzB,cAAsB,EACtB,UAAkB,EAClB,QAAgB,EAChB,IAAY,EACZ,SAAiB,EACT,EAAE,CACV,GAAG,cAAc,IAAI,UAAU,IAAI,QAAQ,IAAI,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAP9E,QAAA,WAAW,eAOmE"}
|
package/dist/tasks/index.js
CHANGED
|
@@ -18,6 +18,7 @@ exports.TasksResource = 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 transforms_1 = require("../transforms");
|
|
21
22
|
__exportStar(require("./dto"), exports);
|
|
22
23
|
// The public contract is the shared TaskSummary / TaskEntity from @managemint-solutions/entities;
|
|
23
24
|
// the casts at the returns declare the shape the select strings below produce (the columns are
|
|
@@ -94,8 +95,7 @@ class TasksResource {
|
|
|
94
95
|
.order('created_at', { ascending: false })
|
|
95
96
|
.range(offset, offset + pageSize - 1);
|
|
96
97
|
if (trimmedSearch) {
|
|
97
|
-
|
|
98
|
-
tasksQuery = tasksQuery.or(`name.ilike.%${escapedSearch}%,description.ilike.%${escapedSearch}%`);
|
|
98
|
+
tasksQuery = tasksQuery.or((0, transforms_1.orIlike)(['name', 'description'], trimmedSearch));
|
|
99
99
|
}
|
|
100
100
|
if (query.client_id) {
|
|
101
101
|
tasksQuery = tasksQuery.eq('client_id', query.client_id);
|
|
@@ -133,17 +133,7 @@ class TasksResource {
|
|
|
133
133
|
const { data, error, count } = await tasksQuery;
|
|
134
134
|
if (error)
|
|
135
135
|
throw (0, errors_1.mapPostgrestError)(error);
|
|
136
|
-
|
|
137
|
-
const totalPages = totalEstimated > 0 ? Math.ceil(totalEstimated / pageSize) : 0;
|
|
138
|
-
return {
|
|
139
|
-
results: (data ?? []),
|
|
140
|
-
page,
|
|
141
|
-
per_page: pageSize,
|
|
142
|
-
count: totalEstimated,
|
|
143
|
-
total_pages: totalPages,
|
|
144
|
-
has_next_page: page < totalPages,
|
|
145
|
-
has_previous_page: page > 1,
|
|
146
|
-
};
|
|
136
|
+
return (0, transforms_1.toMmsList)(data, page, pageSize, count);
|
|
147
137
|
}
|
|
148
138
|
async getById(taskId) {
|
|
149
139
|
const { data, error } = await this.supabase
|
|
@@ -176,36 +166,20 @@ class TasksResource {
|
|
|
176
166
|
return this.getById(taskId);
|
|
177
167
|
}
|
|
178
168
|
async archive(taskId) {
|
|
179
|
-
await this.table.transition(taskId, enum_1.AuditTrailAction.ARCHIVE,
|
|
180
|
-
archived: true,
|
|
181
|
-
archived_at: new Date().toISOString(),
|
|
182
|
-
archived_by: this.auth.mms_id,
|
|
183
|
-
});
|
|
169
|
+
await this.table.transition(taskId, enum_1.AuditTrailAction.ARCHIVE, (0, transforms_1.archivedPatch)(this.auth.mms_id));
|
|
184
170
|
return this.getById(taskId);
|
|
185
171
|
}
|
|
186
172
|
async unarchive(taskId) {
|
|
187
|
-
await this.table.transition(taskId, enum_1.AuditTrailAction.UNARCHIVE,
|
|
188
|
-
archived: false,
|
|
189
|
-
unarchived_at: new Date().toISOString(),
|
|
190
|
-
unarchived_by: this.auth.mms_id,
|
|
191
|
-
});
|
|
173
|
+
await this.table.transition(taskId, enum_1.AuditTrailAction.UNARCHIVE, (0, transforms_1.unarchivedPatch)(this.auth.mms_id));
|
|
192
174
|
return this.getById(taskId);
|
|
193
175
|
}
|
|
194
176
|
async restore(taskId) {
|
|
195
|
-
await this.table.transition(taskId, enum_1.AuditTrailAction.RESTORE,
|
|
196
|
-
deleted: false,
|
|
197
|
-
restored_at: new Date().toISOString(),
|
|
198
|
-
restored_by: this.auth.mms_id,
|
|
199
|
-
});
|
|
177
|
+
await this.table.transition(taskId, enum_1.AuditTrailAction.RESTORE, (0, transforms_1.restoredPatch)(this.auth.mms_id));
|
|
200
178
|
return this.getById(taskId);
|
|
201
179
|
}
|
|
202
180
|
/** Soft delete — the row stays, flagged `deleted`, and `restore()` brings it back. */
|
|
203
181
|
async remove(taskId) {
|
|
204
|
-
await this.table.transition(taskId, enum_1.AuditTrailAction.DELETE,
|
|
205
|
-
deleted: true,
|
|
206
|
-
deleted_at: new Date().toISOString(),
|
|
207
|
-
deleted_by: this.auth.mms_id,
|
|
208
|
-
});
|
|
182
|
+
await this.table.transition(taskId, enum_1.AuditTrailAction.DELETE, (0, transforms_1.deletedPatch)(this.auth.mms_id));
|
|
209
183
|
}
|
|
210
184
|
}
|
|
211
185
|
exports.TasksResource = TasksResource;
|
package/dist/tasks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,0EAGyD;AAEzD,oCAA+E;AAE/E,sCAA8C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":"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"}
|
package/dist/transforms.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { MmsList } from '@managemint-solutions/entities/common';
|
|
1
2
|
/**
|
|
2
3
|
* The `client_id` / `project_id` list filters accept either a plain UUID v4 or the base64-JSON
|
|
3
4
|
* option value the portal's selects send (`{ mms_id }`, or `{ id }` as a fallback). Anything that
|
|
@@ -5,6 +6,16 @@
|
|
|
5
6
|
* anything, so it becomes `null` and the filter is skipped.
|
|
6
7
|
*/
|
|
7
8
|
export declare const parseEntityIdFilter: (value: unknown) => string | null;
|
|
9
|
+
/**
|
|
10
|
+
* A `%value%` ilike pattern, double-quoted for PostgREST's `or=(...)` grammar so `,`, `(`, `)`,
|
|
11
|
+
* `.`, `"` and `\` in the search stay literal instead of being read as more filters. Inside the
|
|
12
|
+
* quotes only `"` and `\` need escaping, which is what PostgREST defines — the `\,` the list
|
|
13
|
+
* endpoints used to emit was never an escape at all. LIKE's own wildcards `%` and `_` are left
|
|
14
|
+
* alone and still match as wildcards; they only widen the caller's own search, never its scope.
|
|
15
|
+
*/
|
|
16
|
+
export declare const ilikeContains: (value: string) => string;
|
|
17
|
+
/** The `or=(...)` argument matching `search` against any of `columns` — `name.ilike."%x%",…`. */
|
|
18
|
+
export declare const orIlike: (columns: readonly string[], search: string) => string;
|
|
8
19
|
/**
|
|
9
20
|
* `date` columns take an ISO string. The shared `CreateProjectDto`/`UpdateProjectDto` types
|
|
10
21
|
* declare `Date`, but over the wire the value is the validated `@IsDateString` string — which
|
|
@@ -12,3 +23,35 @@ export declare const parseEntityIdFilter: (value: unknown) => string | null;
|
|
|
12
23
|
* real `Date` (a portal caller) is serialized.
|
|
13
24
|
*/
|
|
14
25
|
export declare const toDateInput: (value: Date | string | null | undefined) => string | null | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* The `user_profiles` embed the detail selects name column by column, parentheses included. Its
|
|
28
|
+
* indentation is part of the string so the select strings it is spliced into read as they did
|
|
29
|
+
* when each one spelled the columns out.
|
|
30
|
+
*/
|
|
31
|
+
export declare const USER_PROFILE_EMBED: "(\n mms_id,\n name,\n surname,\n email,\n profile_image\n )";
|
|
32
|
+
/**
|
|
33
|
+
* The `MmsList` envelope every paginated read returns. `rows` is `unknown` because each select
|
|
34
|
+
* string produces its own row shape — the caller's `T` is what declares it. `count` is
|
|
35
|
+
* PostgREST's estimate, so an empty page reports 0 total pages rather than 1.
|
|
36
|
+
*/
|
|
37
|
+
export declare const toMmsList: <T>(rows: unknown, page: number, pageSize: number, count: number | null) => MmsList<T>;
|
|
38
|
+
export declare const archivedPatch: (by: string) => {
|
|
39
|
+
archived: boolean;
|
|
40
|
+
archived_at: string;
|
|
41
|
+
archived_by: string;
|
|
42
|
+
};
|
|
43
|
+
export declare const unarchivedPatch: (by: string) => {
|
|
44
|
+
archived: boolean;
|
|
45
|
+
unarchived_at: string;
|
|
46
|
+
unarchived_by: string;
|
|
47
|
+
};
|
|
48
|
+
export declare const deletedPatch: (by: string) => {
|
|
49
|
+
deleted: boolean;
|
|
50
|
+
deleted_at: string;
|
|
51
|
+
deleted_by: string;
|
|
52
|
+
};
|
|
53
|
+
export declare const restoredPatch: (by: string) => {
|
|
54
|
+
deleted: boolean;
|
|
55
|
+
restored_at: string;
|
|
56
|
+
restored_by: string;
|
|
57
|
+
};
|
package/dist/transforms.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Small conversions shared by the DTOs' `@Transform`s
|
|
2
|
+
// Small conversions shared by the DTOs' `@Transform`s, the resources' write payloads, their
|
|
3
|
+
// select strings and their list results.
|
|
3
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.toDateInput = exports.parseEntityIdFilter = void 0;
|
|
5
|
+
exports.restoredPatch = exports.deletedPatch = exports.unarchivedPatch = exports.archivedPatch = exports.toMmsList = exports.USER_PROFILE_EMBED = exports.toDateInput = exports.orIlike = exports.ilikeContains = exports.parseEntityIdFilter = void 0;
|
|
5
6
|
const UUID_V4 = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
6
7
|
/**
|
|
7
8
|
* The `client_id` / `project_id` list filters accept either a plain UUID v4 or the base64-JSON
|
|
@@ -27,6 +28,18 @@ const parseEntityIdFilter = (value) => {
|
|
|
27
28
|
}
|
|
28
29
|
};
|
|
29
30
|
exports.parseEntityIdFilter = parseEntityIdFilter;
|
|
31
|
+
/**
|
|
32
|
+
* A `%value%` ilike pattern, double-quoted for PostgREST's `or=(...)` grammar so `,`, `(`, `)`,
|
|
33
|
+
* `.`, `"` and `\` in the search stay literal instead of being read as more filters. Inside the
|
|
34
|
+
* quotes only `"` and `\` need escaping, which is what PostgREST defines — the `\,` the list
|
|
35
|
+
* endpoints used to emit was never an escape at all. LIKE's own wildcards `%` and `_` are left
|
|
36
|
+
* alone and still match as wildcards; they only widen the caller's own search, never its scope.
|
|
37
|
+
*/
|
|
38
|
+
const ilikeContains = (value) => `"%${value.replace(/[\\"]/g, '\\$&')}%"`;
|
|
39
|
+
exports.ilikeContains = ilikeContains;
|
|
40
|
+
/** The `or=(...)` argument matching `search` against any of `columns` — `name.ilike."%x%",…`. */
|
|
41
|
+
const orIlike = (columns, search) => columns.map((column) => `${column}.ilike.${(0, exports.ilikeContains)(search)}`).join(',');
|
|
42
|
+
exports.orIlike = orIlike;
|
|
30
43
|
/**
|
|
31
44
|
* `date` columns take an ISO string. The shared `CreateProjectDto`/`UpdateProjectDto` types
|
|
32
45
|
* declare `Date`, but over the wire the value is the validated `@IsDateString` string — which
|
|
@@ -35,4 +48,62 @@ exports.parseEntityIdFilter = parseEntityIdFilter;
|
|
|
35
48
|
*/
|
|
36
49
|
const toDateInput = (value) => value instanceof Date ? value.toISOString() : value;
|
|
37
50
|
exports.toDateInput = toDateInput;
|
|
51
|
+
/**
|
|
52
|
+
* The `user_profiles` embed the detail selects name column by column, parentheses included. Its
|
|
53
|
+
* indentation is part of the string so the select strings it is spliced into read as they did
|
|
54
|
+
* when each one spelled the columns out.
|
|
55
|
+
*/
|
|
56
|
+
exports.USER_PROFILE_EMBED = `(
|
|
57
|
+
mms_id,
|
|
58
|
+
name,
|
|
59
|
+
surname,
|
|
60
|
+
email,
|
|
61
|
+
profile_image
|
|
62
|
+
)`;
|
|
63
|
+
/**
|
|
64
|
+
* The `MmsList` envelope every paginated read returns. `rows` is `unknown` because each select
|
|
65
|
+
* string produces its own row shape — the caller's `T` is what declares it. `count` is
|
|
66
|
+
* PostgREST's estimate, so an empty page reports 0 total pages rather than 1.
|
|
67
|
+
*/
|
|
68
|
+
const toMmsList = (rows, page, pageSize, count) => {
|
|
69
|
+
const totalEstimated = count ?? 0;
|
|
70
|
+
const totalPages = totalEstimated > 0 ? Math.ceil(totalEstimated / pageSize) : 0;
|
|
71
|
+
return {
|
|
72
|
+
results: (rows ?? []),
|
|
73
|
+
page,
|
|
74
|
+
per_page: pageSize,
|
|
75
|
+
count: totalEstimated,
|
|
76
|
+
total_pages: totalPages,
|
|
77
|
+
has_next_page: page < totalPages,
|
|
78
|
+
has_previous_page: page > 1,
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
exports.toMmsList = toMmsList;
|
|
82
|
+
// The soft archive/delete patches projects, tasks and clients all write: the flag the transition
|
|
83
|
+
// sets, plus the who/when stamps named after it. `unarchived`/`restored` clear the flag their
|
|
84
|
+
// counterpart set and stamp their own columns — the earlier ones stay as the history.
|
|
85
|
+
const archivedPatch = (by) => ({
|
|
86
|
+
archived: true,
|
|
87
|
+
archived_at: new Date().toISOString(),
|
|
88
|
+
archived_by: by,
|
|
89
|
+
});
|
|
90
|
+
exports.archivedPatch = archivedPatch;
|
|
91
|
+
const unarchivedPatch = (by) => ({
|
|
92
|
+
archived: false,
|
|
93
|
+
unarchived_at: new Date().toISOString(),
|
|
94
|
+
unarchived_by: by,
|
|
95
|
+
});
|
|
96
|
+
exports.unarchivedPatch = unarchivedPatch;
|
|
97
|
+
const deletedPatch = (by) => ({
|
|
98
|
+
deleted: true,
|
|
99
|
+
deleted_at: new Date().toISOString(),
|
|
100
|
+
deleted_by: by,
|
|
101
|
+
});
|
|
102
|
+
exports.deletedPatch = deletedPatch;
|
|
103
|
+
const restoredPatch = (by) => ({
|
|
104
|
+
deleted: false,
|
|
105
|
+
restored_at: new Date().toISOString(),
|
|
106
|
+
restored_by: by,
|
|
107
|
+
});
|
|
108
|
+
exports.restoredPatch = restoredPatch;
|
|
38
109
|
//# sourceMappingURL=transforms.js.map
|
package/dist/transforms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transforms.js","sourceRoot":"","sources":["../src/transforms.ts"],"names":[],"mappings":";AAAA,
|
|
1
|
+
{"version":3,"file":"transforms.js","sourceRoot":"","sources":["../src/transforms.ts"],"names":[],"mappings":"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"}
|
package/dist/users/index.js
CHANGED
|
@@ -18,6 +18,7 @@ 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 transforms_1 = require("../transforms");
|
|
21
22
|
__exportStar(require("./dto"), exports);
|
|
22
23
|
const USERS_TABLE = {
|
|
23
24
|
table: 'users',
|
|
@@ -52,23 +53,12 @@ class UsersResource {
|
|
|
52
53
|
usersQuery = usersQuery.in('active', query.active_in);
|
|
53
54
|
}
|
|
54
55
|
if (trimmedSearch) {
|
|
55
|
-
|
|
56
|
-
usersQuery = usersQuery.or(`name.ilike.%${escapedSearch}%,surname.ilike.%${escapedSearch}%,email.ilike.%${escapedSearch}%`);
|
|
56
|
+
usersQuery = usersQuery.or((0, transforms_1.orIlike)(['name', 'surname', 'email'], trimmedSearch));
|
|
57
57
|
}
|
|
58
58
|
const { data, error, count } = await usersQuery;
|
|
59
59
|
if (error)
|
|
60
60
|
throw (0, errors_1.mapPostgrestError)(error);
|
|
61
|
-
|
|
62
|
-
const totalPages = totalEstimated > 0 ? Math.ceil(totalEstimated / pageSize) : 0;
|
|
63
|
-
return {
|
|
64
|
-
results: (data ?? []),
|
|
65
|
-
page,
|
|
66
|
-
per_page: pageSize,
|
|
67
|
-
count: totalEstimated,
|
|
68
|
-
total_pages: totalPages,
|
|
69
|
-
has_next_page: page < totalPages,
|
|
70
|
-
has_previous_page: page > 1,
|
|
71
|
-
};
|
|
61
|
+
return (0, transforms_1.toMmsList)(data, page, pageSize, count);
|
|
72
62
|
}
|
|
73
63
|
async getRow(userId) {
|
|
74
64
|
const { data, error } = await this.supabase
|
|
@@ -79,7 +69,7 @@ class UsersResource {
|
|
|
79
69
|
.single();
|
|
80
70
|
if (error)
|
|
81
71
|
throw (0, errors_1.mapPostgrestError)(error);
|
|
82
|
-
return data;
|
|
72
|
+
return (0, audit_1.withoutInternalId)(data);
|
|
83
73
|
}
|
|
84
74
|
/**
|
|
85
75
|
* The public profile behind a `*_by` / `manager_id` column. `user_profiles` is a
|
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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/users/index.ts"],"names":[],"mappings":"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"}
|