@lenne.tech/nest-server 12.1.1 → 12.2.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/.claude/rules/architecture.md +1 -0
- package/.claude/rules/configurable-features.md +1 -0
- package/.claude/rules/package-management.md +16 -1
- package/.claude/rules/persistence.md +26 -0
- package/.claude/rules/testing.md +79 -14
- package/CLAUDE.md +2 -1
- package/FRAMEWORK-API.md +17 -2
- package/README.md +18 -0
- package/dist/core/common/interfaces/server-options.interface.d.ts +41 -0
- package/dist/core/common/interfaces/service-options.interface.d.ts +3 -0
- package/dist/core/common/persistence/core-persistence.module.js +12 -2
- package/dist/core/common/persistence/core-persistence.module.js.map +1 -1
- package/dist/core/common/persistence/data-source.runtime.js +4 -2
- package/dist/core/common/persistence/data-source.runtime.js.map +1 -1
- package/dist/core/common/persistence/data-store.interface.d.ts +24 -9
- package/dist/core/common/persistence/id-format.d.ts +2 -0
- package/dist/core/common/persistence/id-format.js +14 -0
- package/dist/core/common/persistence/id-format.js.map +1 -1
- package/dist/core/common/persistence/model-descriptor.interface.d.ts +6 -0
- package/dist/core/common/persistence/model-metadata.registry.d.ts +2 -1
- package/dist/core/common/persistence/model-metadata.registry.js +20 -2
- package/dist/core/common/persistence/model-metadata.registry.js.map +1 -1
- package/dist/core/common/persistence/mongo/sync-schema.plugin.d.ts +18 -0
- package/dist/core/common/persistence/mongo/sync-schema.plugin.js +368 -0
- package/dist/core/common/persistence/mongo/sync-schema.plugin.js.map +1 -0
- package/dist/core/common/persistence/mongoose-data-store.d.ts +19 -9
- package/dist/core/common/persistence/mongoose-data-store.js +107 -31
- package/dist/core/common/persistence/mongoose-data-store.js.map +1 -1
- package/dist/core/common/persistence/persisted-model.decorator.d.ts +3 -0
- package/dist/core/common/persistence/persisted-model.decorator.js +9 -0
- package/dist/core/common/persistence/persisted-model.decorator.js.map +1 -1
- package/dist/core/common/persistence/policies/sync.policy.d.ts +17 -0
- package/dist/core/common/persistence/policies/sync.policy.js +77 -0
- package/dist/core/common/persistence/policies/sync.policy.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-data-store.d.ts +12 -8
- package/dist/core/common/persistence/sql/mysql/mysql-data-store.js +82 -29
- package/dist/core/common/persistence/sql/mysql/mysql-data-store.js.map +1 -1
- package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.d.ts +10 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.js +61 -4
- package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.js.map +1 -1
- package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.js +101 -4
- package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.js.map +1 -1
- package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.d.ts +10 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.js +41 -2
- package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.js.map +1 -1
- package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.js +98 -10
- package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.js.map +1 -1
- package/dist/core/common/persistence/sql/sql-data-store.d.ts +38 -14
- package/dist/core/common/persistence/sql/sql-data-store.js +212 -38
- package/dist/core/common/persistence/sql/sql-data-store.js.map +1 -1
- package/dist/core/common/persistence/sql/sql-errors.d.ts +2 -1
- package/dist/core/common/persistence/sql/sql-errors.js +3 -1
- package/dist/core/common/persistence/sql/sql-errors.js.map +1 -1
- package/dist/core/common/persistence/sync-access.registry.d.ts +17 -0
- package/dist/core/common/persistence/sync-access.registry.js +8 -0
- package/dist/core/common/persistence/sync-access.registry.js.map +1 -0
- package/dist/core/common/persistence/sync-model.d.ts +29 -0
- package/dist/core/common/persistence/sync-model.js +138 -0
- package/dist/core/common/persistence/sync-model.js.map +1 -0
- package/dist/core/common/services/crud.service.d.ts +13 -1
- package/dist/core/common/services/crud.service.js +174 -16
- package/dist/core/common/services/crud.service.js.map +1 -1
- package/dist/core/modules/error-code/error-codes.d.ts +54 -0
- package/dist/core/modules/error-code/error-codes.js +48 -0
- package/dist/core/modules/error-code/error-codes.js.map +1 -1
- package/dist/core/modules/migrate/sql-migration.helper.d.ts +15 -1
- package/dist/core/modules/migrate/sql-migration.helper.js +90 -5
- package/dist/core/modules/migrate/sql-migration.helper.js.map +1 -1
- package/dist/core/modules/sync/core-sync-base.controller.d.ts +7 -0
- package/dist/core/modules/sync/core-sync-base.controller.js +44 -0
- package/dist/core/modules/sync/core-sync-base.controller.js.map +1 -0
- package/dist/core/modules/sync/core-sync-cursor.d.ts +19 -0
- package/dist/core/modules/sync/core-sync-cursor.js +77 -0
- package/dist/core/modules/sync/core-sync-cursor.js.map +1 -0
- package/dist/core/modules/sync/core-sync-hints.controller.d.ts +4 -0
- package/dist/core/modules/sync/core-sync-hints.controller.js +55 -0
- package/dist/core/modules/sync/core-sync-hints.controller.js.map +1 -0
- package/dist/core/modules/sync/core-sync-hints.service.d.ts +28 -0
- package/dist/core/modules/sync/core-sync-hints.service.js +155 -0
- package/dist/core/modules/sync/core-sync-hints.service.js.map +1 -0
- package/dist/core/modules/sync/core-sync-infrastructure.models.d.ts +2 -0
- package/dist/core/modules/sync/core-sync-infrastructure.models.js +17 -0
- package/dist/core/modules/sync/core-sync-infrastructure.models.js.map +1 -0
- package/dist/core/modules/sync/core-sync-mutation.store.d.ts +43 -0
- package/dist/core/modules/sync/core-sync-mutation.store.js +88 -0
- package/dist/core/modules/sync/core-sync-mutation.store.js.map +1 -0
- package/dist/core/modules/sync/core-sync-state.store.d.ts +18 -0
- package/dist/core/modules/sync/core-sync-state.store.js +64 -0
- package/dist/core/modules/sync/core-sync-state.store.js.map +1 -0
- package/dist/core/modules/sync/core-sync.constants.d.ts +28 -0
- package/dist/core/modules/sync/core-sync.constants.js +23 -0
- package/dist/core/modules/sync/core-sync.constants.js.map +1 -0
- package/dist/core/modules/sync/core-sync.controller.d.ts +8 -0
- package/dist/core/modules/sync/core-sync.controller.js +79 -0
- package/dist/core/modules/sync/core-sync.controller.js.map +1 -0
- package/dist/core/modules/sync/core-sync.decorators.d.ts +12 -0
- package/dist/core/modules/sync/core-sync.decorators.js +28 -0
- package/dist/core/modules/sync/core-sync.decorators.js.map +1 -0
- package/dist/core/modules/sync/core-sync.module.d.ts +16 -0
- package/dist/core/modules/sync/core-sync.module.js +50 -0
- package/dist/core/modules/sync/core-sync.module.js.map +1 -0
- package/dist/core/modules/sync/core-sync.resolver.d.ts +9 -0
- package/dist/core/modules/sync/core-sync.resolver.js +46 -0
- package/dist/core/modules/sync/core-sync.resolver.js.map +1 -0
- package/dist/core/modules/sync/core-sync.service.d.ts +142 -0
- package/dist/core/modules/sync/core-sync.service.js +1208 -0
- package/dist/core/modules/sync/core-sync.service.js.map +1 -0
- package/dist/core/modules/sync/interfaces/core-sync.interfaces.d.ts +56 -0
- package/dist/core/modules/sync/interfaces/core-sync.interfaces.js +2 -0
- package/dist/core/modules/sync/interfaces/core-sync.interfaces.js.map +1 -0
- package/dist/core/modules/sync/models/core-sync-hint.model.d.ts +4 -0
- package/dist/core/modules/sync/models/core-sync-hint.model.js +30 -0
- package/dist/core/modules/sync/models/core-sync-hint.model.js.map +1 -0
- package/dist/core/modules/tenant/core-tenant.guard.js +4 -0
- package/dist/core/modules/tenant/core-tenant.guard.js.map +1 -1
- package/dist/core.module.js +14 -0
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +16 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/server/modules/error-code/error-codes.d.ts +6 -0
- package/dist/server/modules/sync-note/inputs/sync-note-create.input.d.ts +4 -0
- package/dist/server/modules/sync-note/inputs/sync-note-create.input.js +27 -0
- package/dist/server/modules/sync-note/inputs/sync-note-create.input.js.map +1 -0
- package/dist/server/modules/sync-note/inputs/sync-note.input.d.ts +6 -0
- package/dist/server/modules/sync-note/inputs/sync-note.input.js +37 -0
- package/dist/server/modules/sync-note/inputs/sync-note.input.js.map +1 -0
- package/dist/server/modules/sync-note/sync-note.model.d.ts +10 -0
- package/dist/server/modules/sync-note/sync-note.model.js +73 -0
- package/dist/server/modules/sync-note/sync-note.model.js.map +1 -0
- package/dist/server/modules/sync-note/sync-note.module.d.ts +2 -0
- package/dist/server/modules/sync-note/sync-note.module.js +21 -0
- package/dist/server/modules/sync-note/sync-note.module.js.map +1 -0
- package/dist/server/modules/sync-note/sync-note.service.d.ts +10 -0
- package/dist/server/modules/sync-note/sync-note.service.js +35 -0
- package/dist/server/modules/sync-note/sync-note.service.js.map +1 -0
- package/docs/REQUEST-LIFECYCLE.md +1 -0
- package/docs/offline-sync-protocol.md +96 -62
- package/docs/security-overrides.md +14 -0
- package/migration-guides/12.1.x-to-12.2.x.md +154 -0
- package/package.json +4 -2
- package/src/core/common/interfaces/server-options.interface.ts +149 -0
- package/src/core/common/interfaces/service-options.interface.ts +15 -0
- package/src/core/common/persistence/core-persistence.module.ts +21 -2
- package/src/core/common/persistence/data-source.runtime.ts +5 -2
- package/src/core/common/persistence/data-store.interface.ts +65 -12
- package/src/core/common/persistence/id-format.ts +26 -0
- package/src/core/common/persistence/model-descriptor.interface.ts +12 -0
- package/src/core/common/persistence/model-metadata.registry.ts +31 -2
- package/src/core/common/persistence/mongo/sync-schema.plugin.ts +508 -0
- package/src/core/common/persistence/mongoose-data-store.ts +171 -35
- package/src/core/common/persistence/persisted-model.decorator.ts +26 -0
- package/src/core/common/persistence/policies/sync.policy.ts +121 -0
- package/src/core/common/persistence/sql/mysql/mysql-data-store.ts +108 -30
- package/src/core/common/persistence/sql/mysql/mysql-schema.compiler.ts +107 -4
- package/src/core/common/persistence/sql/mysql/mysql-schema.migrator.ts +129 -3
- package/src/core/common/persistence/sql/postgres/postgres-schema.compiler.ts +74 -2
- package/src/core/common/persistence/sql/postgres/postgres-schema.migrator.ts +139 -7
- package/src/core/common/persistence/sql/sql-data-store.ts +325 -44
- package/src/core/common/persistence/sql/sql-errors.ts +5 -1
- package/src/core/common/persistence/sync-access.registry.ts +50 -0
- package/src/core/common/persistence/sync-model.ts +270 -0
- package/src/core/common/services/crud.service.ts +257 -19
- package/src/core/modules/error-code/error-codes.ts +59 -0
- package/src/core/modules/migrate/sql-migration.helper.ts +141 -7
- package/src/core/modules/sync/INTEGRATION-CHECKLIST.md +95 -0
- package/src/core/modules/sync/README.md +188 -0
- package/src/core/modules/sync/SECURITY.md +65 -0
- package/src/core/modules/sync/core-sync-base.controller.ts +43 -0
- package/src/core/modules/sync/core-sync-cursor.ts +117 -0
- package/src/core/modules/sync/core-sync-hints.controller.ts +52 -0
- package/src/core/modules/sync/core-sync-hints.service.ts +178 -0
- package/src/core/modules/sync/core-sync-infrastructure.models.ts +40 -0
- package/src/core/modules/sync/core-sync-mutation.store.ts +146 -0
- package/src/core/modules/sync/core-sync-state.store.ts +89 -0
- package/src/core/modules/sync/core-sync.constants.ts +51 -0
- package/src/core/modules/sync/core-sync.controller.ts +68 -0
- package/src/core/modules/sync/core-sync.decorators.ts +84 -0
- package/src/core/modules/sync/core-sync.module.ts +75 -0
- package/src/core/modules/sync/core-sync.resolver.ts +35 -0
- package/src/core/modules/sync/core-sync.service.ts +1728 -0
- package/src/core/modules/sync/interfaces/core-sync.interfaces.ts +85 -0
- package/src/core/modules/sync/models/core-sync-hint.model.ts +18 -0
- package/src/core/modules/tenant/core-tenant.guard.ts +8 -0
- package/src/core.module.ts +25 -0
- package/src/index.ts +21 -0
- package/src/server/modules/sync-note/inputs/sync-note-create.input.ts +14 -0
- package/src/server/modules/sync-note/inputs/sync-note.input.ts +23 -0
- package/src/server/modules/sync-note/sync-note.model.ts +77 -0
- package/src/server/modules/sync-note/sync-note.module.ts +16 -0
- package/src/server/modules/sync-note/sync-note.service.ts +25 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { InputType } from '@nestjs/graphql';
|
|
11
|
+
import { Restricted } from '../../../../core/common/decorators/restricted.decorator.js';
|
|
12
|
+
import { UnifiedField } from '../../../../core/common/decorators/unified-field.decorator.js';
|
|
13
|
+
import { RoleEnum } from '../../../../core/common/enums/role.enum.js';
|
|
14
|
+
import { SyncNoteInput } from './sync-note.input.js';
|
|
15
|
+
let SyncNoteCreateInput = class SyncNoteCreateInput extends SyncNoteInput {
|
|
16
|
+
title = undefined;
|
|
17
|
+
};
|
|
18
|
+
__decorate([
|
|
19
|
+
UnifiedField({ description: 'Title of the note', roles: RoleEnum.S_EVERYONE }),
|
|
20
|
+
__metadata("design:type", String)
|
|
21
|
+
], SyncNoteCreateInput.prototype, "title", void 0);
|
|
22
|
+
SyncNoteCreateInput = __decorate([
|
|
23
|
+
InputType({ description: 'Input to create a synchronized note' }),
|
|
24
|
+
Restricted(RoleEnum.ADMIN)
|
|
25
|
+
], SyncNoteCreateInput);
|
|
26
|
+
export { SyncNoteCreateInput };
|
|
27
|
+
//# sourceMappingURL=sync-note-create.input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-note-create.input.js","sourceRoot":"","sources":["../../../../../src/server/modules/sync-note/inputs/sync-note-create.input.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,4DAA4D,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,+DAA+D,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK9C,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,aAAa;IAE3C,KAAK,GAAW,SAAS,CAAC;CACpC,CAAA;AADU;IADR,YAAY,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;;kDAC5C;AAFxB,mBAAmB;IAF/B,SAAS,CAAC,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC;IACjE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;GACd,mBAAmB,CAG/B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { InputType } from '@nestjs/graphql';
|
|
11
|
+
import { Restricted } from '../../../../core/common/decorators/restricted.decorator.js';
|
|
12
|
+
import { UnifiedField } from '../../../../core/common/decorators/unified-field.decorator.js';
|
|
13
|
+
import { RoleEnum } from '../../../../core/common/enums/role.enum.js';
|
|
14
|
+
import { CoreInput } from '../../../../core/common/inputs/core-input.input.js';
|
|
15
|
+
let SyncNoteInput = class SyncNoteInput extends CoreInput {
|
|
16
|
+
body = undefined;
|
|
17
|
+
priority = undefined;
|
|
18
|
+
title = undefined;
|
|
19
|
+
};
|
|
20
|
+
__decorate([
|
|
21
|
+
UnifiedField({ description: 'Text of the note', isOptional: true, roles: RoleEnum.S_EVERYONE }),
|
|
22
|
+
__metadata("design:type", String)
|
|
23
|
+
], SyncNoteInput.prototype, "body", void 0);
|
|
24
|
+
__decorate([
|
|
25
|
+
UnifiedField({ description: 'Priority of the note', isOptional: true, roles: RoleEnum.S_EVERYONE }),
|
|
26
|
+
__metadata("design:type", Number)
|
|
27
|
+
], SyncNoteInput.prototype, "priority", void 0);
|
|
28
|
+
__decorate([
|
|
29
|
+
UnifiedField({ description: 'Title of the note', isOptional: true, roles: RoleEnum.S_EVERYONE }),
|
|
30
|
+
__metadata("design:type", String)
|
|
31
|
+
], SyncNoteInput.prototype, "title", void 0);
|
|
32
|
+
SyncNoteInput = __decorate([
|
|
33
|
+
InputType({ description: 'Input to change a synchronized note' }),
|
|
34
|
+
Restricted(RoleEnum.ADMIN)
|
|
35
|
+
], SyncNoteInput);
|
|
36
|
+
export { SyncNoteInput };
|
|
37
|
+
//# sourceMappingURL=sync-note.input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-note.input.js","sourceRoot":"","sources":["../../../../../src/server/modules/sync-note/inputs/sync-note.input.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,4DAA4D,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,+DAA+D,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,oDAAoD,CAAC;AAQxE,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,SAAS;IAE1C,IAAI,GAAY,SAAS,CAAC;IAG1B,QAAQ,GAAY,SAAS,CAAC;IAG9B,KAAK,GAAY,SAAS,CAAC;CAC5B,CAAA;AAPC;IADC,YAAY,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;;2CACtE;AAG1B;IADC,YAAY,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;;+CACtE;AAG9B;IADC,YAAY,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;;4CACtE;AARhB,aAAa;IAFzB,SAAS,CAAC,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC;IACjE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;GACd,aAAa,CASzB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Types } from 'mongoose';
|
|
2
|
+
import { CorePersistenceModel } from '../../../core/common/models/core-persistence.model.js';
|
|
3
|
+
export declare class SyncNote extends CorePersistenceModel {
|
|
4
|
+
body?: string;
|
|
5
|
+
createdBy?: string | Types.ObjectId;
|
|
6
|
+
priority?: number;
|
|
7
|
+
title?: string;
|
|
8
|
+
securityCheck(user: any, force?: boolean): this;
|
|
9
|
+
}
|
|
10
|
+
export declare const SyncNoteSchema: any;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { ObjectType } from '@nestjs/graphql';
|
|
11
|
+
import { Restricted } from '../../../core/common/decorators/restricted.decorator.js';
|
|
12
|
+
import { UnifiedField } from '../../../core/common/decorators/unified-field.decorator.js';
|
|
13
|
+
import { RoleEnum } from '../../../core/common/enums/role.enum.js';
|
|
14
|
+
import { equalIds } from '../../../core/common/helpers/id.helper.js';
|
|
15
|
+
import { CorePersistenceModel } from '../../../core/common/models/core-persistence.model.js';
|
|
16
|
+
import { objectIdType, Schema as MongooseSchema, SchemaFactory, } from '../../../core/common/persistence/mongo/mongoose-compat.js';
|
|
17
|
+
import { PersistedModel } from '../../../core/common/persistence/persisted-model.decorator.js';
|
|
18
|
+
import { SyncField } from '../../../core/modules/sync/core-sync.decorators.js';
|
|
19
|
+
let SyncNote = class SyncNote extends CorePersistenceModel {
|
|
20
|
+
body = undefined;
|
|
21
|
+
createdBy = undefined;
|
|
22
|
+
priority = undefined;
|
|
23
|
+
title = undefined;
|
|
24
|
+
securityCheck(user, force) {
|
|
25
|
+
if (force || user?.hasRole?.([RoleEnum.ADMIN]) || (user?.id && equalIds(this.createdBy, user))) {
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
__decorate([
|
|
32
|
+
UnifiedField({ description: 'Text of the note', isOptional: true, mongoose: true, roles: RoleEnum.S_EVERYONE }),
|
|
33
|
+
__metadata("design:type", String)
|
|
34
|
+
], SyncNote.prototype, "body", void 0);
|
|
35
|
+
__decorate([
|
|
36
|
+
UnifiedField({
|
|
37
|
+
description: 'ID of the user who created the note',
|
|
38
|
+
isOptional: true,
|
|
39
|
+
mongoose: { type: objectIdType() },
|
|
40
|
+
roles: RoleEnum.S_EVERYONE,
|
|
41
|
+
swaggerApiOptions: { type: String },
|
|
42
|
+
type: () => String,
|
|
43
|
+
}),
|
|
44
|
+
__metadata("design:type", Object)
|
|
45
|
+
], SyncNote.prototype, "createdBy", void 0);
|
|
46
|
+
__decorate([
|
|
47
|
+
SyncField('reject'),
|
|
48
|
+
UnifiedField({ description: 'Priority of the note', isOptional: true, mongoose: true, roles: RoleEnum.S_EVERYONE }),
|
|
49
|
+
__metadata("design:type", Number)
|
|
50
|
+
], SyncNote.prototype, "priority", void 0);
|
|
51
|
+
__decorate([
|
|
52
|
+
UnifiedField({ description: 'Title of the note', isOptional: true, mongoose: true, roles: RoleEnum.S_EVERYONE }),
|
|
53
|
+
__metadata("design:type", String)
|
|
54
|
+
], SyncNote.prototype, "title", void 0);
|
|
55
|
+
SyncNote = __decorate([
|
|
56
|
+
PersistedModel({
|
|
57
|
+
sync: {
|
|
58
|
+
roles: {
|
|
59
|
+
create: [RoleEnum.S_USER],
|
|
60
|
+
delete: [RoleEnum.ADMIN, RoleEnum.S_CREATOR],
|
|
61
|
+
pull: [RoleEnum.S_USER],
|
|
62
|
+
update: [RoleEnum.ADMIN, RoleEnum.S_CREATOR],
|
|
63
|
+
},
|
|
64
|
+
strategy: 'merge',
|
|
65
|
+
},
|
|
66
|
+
}),
|
|
67
|
+
MongooseSchema({ timestamps: true }),
|
|
68
|
+
ObjectType({ description: 'Note synchronized to offline clients' }),
|
|
69
|
+
Restricted(RoleEnum.ADMIN)
|
|
70
|
+
], SyncNote);
|
|
71
|
+
export { SyncNote };
|
|
72
|
+
export const SyncNoteSchema = SchemaFactory.createForClass(SyncNote);
|
|
73
|
+
//# sourceMappingURL=sync-note.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-note.model.js","sourceRoot":"","sources":["../../../../src/server/modules/sync-note/sync-note.model.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,MAAM,yDAAyD,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,4DAA4D,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,2CAA2C,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uDAAuD,CAAC;AAC7F,OAAO,EACL,YAAY,EACZ,MAAM,IAAI,cAAc,EACxB,aAAa,GACd,MAAM,2DAA2D,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,MAAM,oDAAoD,CAAC;AA8BxE,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,oBAAoB;IAEhD,IAAI,GAAY,SAAS,CAAC;IAW1B,SAAS,GAA6B,SAAS,CAAC;IAKhD,QAAQ,GAAY,SAAS,CAAC;IAG9B,KAAK,GAAY,SAAS,CAAC;IAGlB,aAAa,CAAC,IAAS,EAAE,KAAe;QAC/C,IAAI,KAAK,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAC/F,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF,CAAA;AA5BC;IADC,YAAY,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;;sCACtF;AAW1B;IARC,YAAY,CAAC;QACZ,WAAW,EAAE,qCAAqC;QAClD,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE;QAClC,KAAK,EAAE,QAAQ,CAAC,UAAU;QAC1B,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACnC,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM;KACnB,CAAC;;2CAC8C;AAKhD;IAFC,SAAS,CAAC,QAAQ,CAAC;IACnB,YAAY,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;;0CACtF;AAG9B;IADC,YAAY,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;;uCACtF;AArBhB,QAAQ;IAdpB,cAAc,CAAC;QACd,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACzB,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC;gBAC5C,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACvB,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC;aAC7C;YACD,QAAQ,EAAE,OAAO;SAClB;KACF,CAAC;IACD,cAAc,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACpC,UAAU,CAAC,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;IACnE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;GACd,QAAQ,CA8BpB;;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Module } from '@nestjs/common';
|
|
8
|
+
import { CorePersistenceModule } from '../../../core/common/persistence/core-persistence.module.js';
|
|
9
|
+
import { SyncNote, SyncNoteSchema } from './sync-note.model.js';
|
|
10
|
+
import { SyncNoteService } from './sync-note.service.js';
|
|
11
|
+
let SyncNoteModule = class SyncNoteModule {
|
|
12
|
+
};
|
|
13
|
+
SyncNoteModule = __decorate([
|
|
14
|
+
Module({
|
|
15
|
+
exports: [SyncNoteService],
|
|
16
|
+
imports: [CorePersistenceModule.forFeature([{ model: SyncNote, name: SyncNote.name, schema: SyncNoteSchema }])],
|
|
17
|
+
providers: [SyncNoteService],
|
|
18
|
+
})
|
|
19
|
+
], SyncNoteModule);
|
|
20
|
+
export { SyncNoteModule };
|
|
21
|
+
//# sourceMappingURL=sync-note.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-note.module.js","sourceRoot":"","sources":["../../../../src/server/modules/sync-note/sync-note.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AACpG,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAWlD,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,cAAc;IAL1B,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,eAAe,CAAC;QAC1B,OAAO,EAAE,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QAC/G,SAAS,EAAE,CAAC,eAAe,CAAC;KAC7B,CAAC;GACW,cAAc,CAAG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DataStore } from '../../../core/common/persistence/data-store.interface.js';
|
|
2
|
+
import { ConfigService } from '../../../core/common/services/config.service.js';
|
|
3
|
+
import { CrudService } from '../../../core/common/services/crud.service.js';
|
|
4
|
+
import { SyncNoteCreateInput } from './inputs/sync-note-create.input.js';
|
|
5
|
+
import { SyncNoteInput } from './inputs/sync-note.input.js';
|
|
6
|
+
import { SyncNote } from './sync-note.model.js';
|
|
7
|
+
export declare class SyncNoteService extends CrudService<SyncNote, SyncNoteCreateInput, SyncNoteInput> {
|
|
8
|
+
protected readonly configService: ConfigService;
|
|
9
|
+
constructor(configService: ConfigService, store: DataStore<SyncNote>);
|
|
10
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { Injectable } from '@nestjs/common';
|
|
14
|
+
import { InjectStore } from '../../../core/common/persistence/inject-store.decorator.js';
|
|
15
|
+
import { ConfigService } from '../../../core/common/services/config.service.js';
|
|
16
|
+
import { CrudService } from '../../../core/common/services/crud.service.js';
|
|
17
|
+
import { SyncService } from '../../../core/modules/sync/core-sync.decorators.js';
|
|
18
|
+
import { SyncNoteCreateInput } from './inputs/sync-note-create.input.js';
|
|
19
|
+
import { SyncNoteInput } from './inputs/sync-note.input.js';
|
|
20
|
+
import { SyncNote } from './sync-note.model.js';
|
|
21
|
+
let SyncNoteService = class SyncNoteService extends CrudService {
|
|
22
|
+
configService;
|
|
23
|
+
constructor(configService, store) {
|
|
24
|
+
super({ configService, dataStore: store, mainModelConstructor: SyncNote });
|
|
25
|
+
this.configService = configService;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
SyncNoteService = __decorate([
|
|
29
|
+
SyncService({ createInput: SyncNoteCreateInput, model: SyncNote, updateInput: SyncNoteInput }),
|
|
30
|
+
Injectable(),
|
|
31
|
+
__param(1, InjectStore(SyncNote)),
|
|
32
|
+
__metadata("design:paramtypes", [ConfigService, Object])
|
|
33
|
+
], SyncNoteService);
|
|
34
|
+
export { SyncNoteService };
|
|
35
|
+
//# sourceMappingURL=sync-note.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-note.service.js","sourceRoot":"","sources":["../../../../src/server/modules/sync-note/sync-note.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,4DAA4D,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,oDAAoD,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQzC,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,WAAyD;IAE9D;IAD9B,YAC8B,aAA4B,EACjC,KAA0B;QAEjD,KAAK,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,CAAC,CAAC;QAH/C,kBAAa,GAAb,aAAa,CAAe;IAI1D,CAAC;CACF,CAAA;AAPY,eAAe;IAF3B,WAAW,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;IAC9F,UAAU,EAAE;IAIR,WAAA,WAAW,CAAC,QAAQ,CAAC,CAAA;qCADqB,aAAa;GAF/C,eAAe,CAO3B"}
|
|
@@ -131,6 +131,7 @@ JWT-based authentication for existing projects:
|
|
|
131
131
|
| **Bulk Operations** | Batch create/update/delete |
|
|
132
132
|
| **Force Mode** | `force: true` bypasses all security checks |
|
|
133
133
|
| **Raw Mode** | `raw: true` skips prepareInput/prepareOutput |
|
|
134
|
+
| **Synchronized models** | `@PersistedModel({ sync })` (offline sync, 12.x): the store writes `version`, `deletedAt` and the change position on every write path (on MongoDB through `mongo/sync-schema.plugin.ts`, applied to these schemas only); `CrudService.delete()` and every port delete leave a tombstone, reads leave tombstones out unless `includeTombstones`, and `ServiceOptions.expectedVersion` makes `update()` / `delete()` one conditional statement (409 `VersionConflictError` on another version). Unique indexes apply to live records only. With the `sync` configuration (12.2.0) the sync module serves `GET/POST /sync/{model}` for models whose CrudService carries `@SyncService()`: `@Roles(S_USER)` on the route, the model's `sync.roles` passed as `serviceOptions.roles` on every CrudService call, every pulled record through `securityCheck()`, a header-less request scoped to the caller's memberships, the 410 resync body written by the controller itself (`src/core/modules/sync/README.md`). Change hints (`GET /sync/hints`, SSE, and the GraphQL subscription `syncHint`) carry `{ model, at }` only, sent from the CrudService's create / update / delete of such a model and delivered to a subscriber only with the model's pull roles and access to the tenant of the change; the SSE stream registers with the WebSocket re-check registry and ends on every invalidation or re-check, so the client reconnects with its current rights. An hourly purge removes tombstones past `sync.retention.tombstonesDays` after moving the retention horizon past them. What a client must delete on logout is in the module's `SECURITY.md`. See `.claude/rules/persistence.md` → "Synchronized models" |
|
|
134
135
|
|
|
135
136
|
### Models & Inputs
|
|
136
137
|
|