@orthacms/content-server 0.4.2 → 0.5.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/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -1
- package/dist/lib/content.module.d.ts.map +1 -1
- package/dist/lib/content.module.js +31 -1
- package/dist/lib/copilot/entry-proposal.applier.d.ts.map +1 -1
- package/dist/lib/copilot/entry-proposal.applier.js +5 -4
- package/dist/lib/docs/describe-content-api.d.ts +7 -0
- package/dist/lib/docs/describe-content-api.d.ts.map +1 -1
- package/dist/lib/docs/describe-content-api.js +177 -53
- package/dist/lib/docs/describe-views-api.d.ts +19 -0
- package/dist/lib/docs/describe-views-api.d.ts.map +1 -0
- package/dist/lib/docs/describe-views-api.js +76 -0
- package/dist/lib/docs/field-schema.d.ts.map +1 -1
- package/dist/lib/docs/field-schema.js +36 -2
- package/dist/lib/docs/openapi-writer.d.ts +49 -0
- package/dist/lib/docs/openapi-writer.d.ts.map +1 -0
- package/dist/lib/docs/openapi-writer.js +76 -0
- package/dist/lib/docs/public-api-schemas.d.ts +45 -0
- package/dist/lib/docs/public-api-schemas.d.ts.map +1 -0
- package/dist/lib/docs/public-api-schemas.js +377 -0
- package/dist/lib/docs/views-schemas.d.ts +22 -0
- package/dist/lib/docs/views-schemas.d.ts.map +1 -0
- package/dist/lib/docs/views-schemas.js +156 -0
- package/dist/lib/entries/application/use-cases/bulk-publish-entries.use-case.d.ts +8 -2
- package/dist/lib/entries/application/use-cases/bulk-publish-entries.use-case.d.ts.map +1 -1
- package/dist/lib/entries/application/use-cases/bulk-publish-entries.use-case.js +19 -4
- package/dist/lib/entries/application/use-cases/bulk-unpublish-entries.use-case.d.ts +2 -2
- package/dist/lib/entries/application/use-cases/bulk-unpublish-entries.use-case.d.ts.map +1 -1
- package/dist/lib/entries/application/use-cases/bulk-unpublish-entries.use-case.js +14 -4
- package/dist/lib/entries/application/use-cases/publish-entry.use-case.d.ts +6 -8
- package/dist/lib/entries/application/use-cases/publish-entry.use-case.d.ts.map +1 -1
- package/dist/lib/entries/application/use-cases/publish-entry.use-case.js +10 -4
- package/dist/lib/entries/application/use-cases/unpublish-entry.use-case.d.ts +2 -5
- package/dist/lib/entries/application/use-cases/unpublish-entry.use-case.d.ts.map +1 -1
- package/dist/lib/entries/application/use-cases/unpublish-entry.use-case.js +6 -1
- package/dist/lib/entries/domain/entry.d.ts +8 -1
- package/dist/lib/entries/domain/entry.d.ts.map +1 -1
- package/dist/lib/entries/domain/entry.js +12 -12
- package/dist/lib/entries/domain/events/entry-events.d.ts +47 -5
- package/dist/lib/entries/domain/events/entry-events.d.ts.map +1 -1
- package/dist/lib/entries/domain/events/entry-events.js +26 -10
- package/dist/lib/entries/entries.constants.d.ts +10 -2
- package/dist/lib/entries/entries.constants.d.ts.map +1 -1
- package/dist/lib/entries/entries.constants.js +11 -2
- package/dist/lib/entries/http/controllers/bulk-entries.controller.d.ts +2 -2
- package/dist/lib/entries/http/controllers/bulk-entries.controller.d.ts.map +1 -1
- package/dist/lib/entries/http/controllers/bulk-entries.controller.js +8 -6
- package/dist/lib/entries/http/controllers/create-entry.controller.d.ts.map +1 -1
- package/dist/lib/entries/http/controllers/create-entry.controller.js +1 -1
- package/dist/lib/entries/http/controllers/update-entry.controller.d.ts.map +1 -1
- package/dist/lib/entries/http/controllers/update-entry.controller.js +1 -1
- package/dist/lib/entries/http/dto/extension-bag.validator.d.ts +14 -0
- package/dist/lib/entries/http/dto/extension-bag.validator.d.ts.map +1 -0
- package/dist/lib/entries/http/dto/extension-bag.validator.js +42 -0
- package/dist/lib/entries/http/dto/save-entry.dto.d.ts +16 -0
- package/dist/lib/entries/http/dto/save-entry.dto.d.ts.map +1 -1
- package/dist/lib/entries/http/dto/save-entry.dto.js +30 -0
- package/dist/lib/entries/infrastructure/persistence/entry-writer.service.d.ts +50 -8
- package/dist/lib/entries/infrastructure/persistence/entry-writer.service.d.ts.map +1 -1
- package/dist/lib/entries/infrastructure/persistence/entry-writer.service.js +183 -32
- package/dist/lib/entries/infrastructure/persistence/relation-link.service.d.ts +38 -5
- package/dist/lib/entries/infrastructure/persistence/relation-link.service.d.ts.map +1 -1
- package/dist/lib/entries/infrastructure/persistence/relation-link.service.js +38 -6
- package/dist/lib/entries/infrastructure/queries/entries.service.d.ts +3 -1
- package/dist/lib/entries/infrastructure/queries/entries.service.d.ts.map +1 -1
- package/dist/lib/entries/infrastructure/queries/entries.service.js +17 -5
- package/dist/lib/entries/infrastructure/queries/entry-match.query.d.ts +82 -0
- package/dist/lib/entries/infrastructure/queries/entry-match.query.d.ts.map +1 -0
- package/dist/lib/entries/infrastructure/queries/entry-match.query.js +152 -0
- package/dist/lib/extension/entry-filter-provider.d.ts +79 -0
- package/dist/lib/extension/entry-filter-provider.d.ts.map +1 -0
- package/dist/lib/extension/entry-filter-provider.js +149 -0
- package/dist/lib/extension/entry-write-extension.d.ts +185 -0
- package/dist/lib/extension/entry-write-extension.d.ts.map +1 -0
- package/dist/lib/extension/entry-write-extension.js +182 -0
- package/dist/lib/extension/read-scope.d.ts +107 -0
- package/dist/lib/extension/read-scope.d.ts.map +1 -0
- package/dist/lib/extension/read-scope.js +131 -0
- package/dist/lib/insights/docs/describe-content-insights-api.d.ts +23 -0
- package/dist/lib/insights/docs/describe-content-insights-api.d.ts.map +1 -0
- package/dist/lib/insights/docs/describe-content-insights-api.js +329 -0
- package/dist/lib/mcp/content-tools.provider.d.ts.map +1 -1
- package/dist/lib/mcp/content-tools.provider.js +10 -9
- package/dist/lib/public-api/http/controllers/public-entry-writes.controller.d.ts +14 -13
- package/dist/lib/public-api/http/controllers/public-entry-writes.controller.d.ts.map +1 -1
- package/dist/lib/public-api/http/controllers/public-entry-writes.controller.js +62 -46
- package/dist/lib/public-api/http/guards/api-token-workspace.guard.d.ts.map +1 -1
- package/dist/lib/public-api/http/guards/api-token-workspace.guard.js +8 -0
- package/dist/lib/public-api/infrastructure/public-entries.query.d.ts +14 -1
- package/dist/lib/public-api/infrastructure/public-entries.query.d.ts.map +1 -1
- package/dist/lib/public-api/infrastructure/public-entries.query.js +20 -3
- package/dist/lib/public-api/infrastructure/public-entry-writes.service.d.ts +10 -9
- package/dist/lib/public-api/infrastructure/public-entry-writes.service.d.ts.map +1 -1
- package/dist/lib/public-api/infrastructure/public-entry-writes.service.js +23 -24
- package/dist/lib/public-api/infrastructure/public-expansion.query.d.ts +16 -4
- package/dist/lib/public-api/infrastructure/public-expansion.query.d.ts.map +1 -1
- package/dist/lib/public-api/infrastructure/public-expansion.query.js +29 -9
- package/dist/lib/public-api/infrastructure/token-actor.d.ts +37 -0
- package/dist/lib/public-api/infrastructure/token-actor.d.ts.map +1 -0
- package/dist/lib/public-api/infrastructure/token-actor.js +58 -0
- package/dist/lib/revisions/application/use-cases/restore-revision.use-case.d.ts.map +1 -1
- package/dist/lib/revisions/application/use-cases/restore-revision.use-case.js +23 -1
- package/dist/lib/revisions/infrastructure/persistence/revision-snapshot.d.ts +7 -1
- package/dist/lib/revisions/infrastructure/persistence/revision-snapshot.d.ts.map +1 -1
- package/dist/lib/revisions/infrastructure/persistence/revision-snapshot.js +9 -2
- package/dist/lib/revisions/infrastructure/purge/revisions-workspace.purger.d.ts +28 -0
- package/dist/lib/revisions/infrastructure/purge/revisions-workspace.purger.d.ts.map +1 -0
- package/dist/lib/revisions/infrastructure/purge/revisions-workspace.purger.js +52 -0
- package/dist/lib/revisions/types/revision-view.d.ts +11 -0
- package/dist/lib/revisions/types/revision-view.d.ts.map +1 -1
- package/dist/lib/utils/content-plugin.d.ts.map +1 -1
- package/dist/lib/utils/content-plugin.js +10 -1
- package/dist/lib/utils/content-views-plugin.d.ts +28 -0
- package/dist/lib/utils/content-views-plugin.d.ts.map +1 -0
- package/dist/lib/utils/content-views-plugin.js +37 -0
- package/dist/lib/views/application/queries/saved-views.query.d.ts +16 -0
- package/dist/lib/views/application/queries/saved-views.query.d.ts.map +1 -0
- package/dist/lib/views/application/queries/saved-views.query.js +46 -0
- package/dist/lib/views/application/saved-view-access.service.d.ts +30 -0
- package/dist/lib/views/application/saved-view-access.service.d.ts.map +1 -0
- package/dist/lib/views/application/saved-view-access.service.js +55 -0
- package/dist/lib/views/application/use-cases/create-saved-view.use-case.d.ts +30 -0
- package/dist/lib/views/application/use-cases/create-saved-view.use-case.d.ts.map +1 -0
- package/dist/lib/views/application/use-cases/create-saved-view.use-case.js +81 -0
- package/dist/lib/views/application/use-cases/delete-saved-view.use-case.d.ts +18 -0
- package/dist/lib/views/application/use-cases/delete-saved-view.use-case.d.ts.map +1 -0
- package/dist/lib/views/application/use-cases/delete-saved-view.use-case.js +56 -0
- package/dist/lib/views/application/use-cases/set-default-view.use-case.d.ts +23 -0
- package/dist/lib/views/application/use-cases/set-default-view.use-case.d.ts.map +1 -0
- package/dist/lib/views/application/use-cases/set-default-view.use-case.js +51 -0
- package/dist/lib/views/application/use-cases/update-saved-view.use-case.d.ts +24 -0
- package/dist/lib/views/application/use-cases/update-saved-view.use-case.d.ts.map +1 -0
- package/dist/lib/views/application/use-cases/update-saved-view.use-case.js +90 -0
- package/dist/lib/views/application/view-scope.service.d.ts +25 -0
- package/dist/lib/views/application/view-scope.service.d.ts.map +1 -0
- package/dist/lib/views/application/view-scope.service.js +45 -0
- package/dist/lib/views/content-views.module.d.ts +22 -0
- package/dist/lib/views/content-views.module.d.ts.map +1 -0
- package/dist/lib/views/content-views.module.js +63 -0
- package/dist/lib/views/domain/errors/index.d.ts +6 -0
- package/dist/lib/views/domain/errors/index.d.ts.map +1 -0
- package/dist/lib/views/domain/errors/index.js +12 -0
- package/dist/lib/views/domain/errors/saved-view-forbidden.error.d.ts +10 -0
- package/dist/lib/views/domain/errors/saved-view-forbidden.error.d.ts.map +1 -0
- package/dist/lib/views/domain/errors/saved-view-forbidden.error.js +16 -0
- package/dist/lib/views/domain/errors/saved-view-limit-error.d.ts +9 -0
- package/dist/lib/views/domain/errors/saved-view-limit-error.d.ts.map +1 -0
- package/dist/lib/views/domain/errors/saved-view-limit-error.js +16 -0
- package/dist/lib/views/domain/errors/saved-view-name-taken.error.d.ts +5 -0
- package/dist/lib/views/domain/errors/saved-view-name-taken.error.d.ts.map +1 -0
- package/dist/lib/views/domain/errors/saved-view-name-taken.error.js +11 -0
- package/dist/lib/views/domain/errors/saved-view-not-found.error.d.ts +9 -0
- package/dist/lib/views/domain/errors/saved-view-not-found.error.d.ts.map +1 -0
- package/dist/lib/views/domain/errors/saved-view-not-found.error.js +15 -0
- package/dist/lib/views/domain/events/saved-view-events.d.ts +28 -0
- package/dist/lib/views/domain/events/saved-view-events.d.ts.map +1 -0
- package/dist/lib/views/domain/events/saved-view-events.js +38 -0
- package/dist/lib/views/domain/saved-view.d.ts +66 -0
- package/dist/lib/views/domain/saved-view.d.ts.map +1 -0
- package/dist/lib/views/domain/saved-view.js +18 -0
- package/dist/lib/views/domain/saved-view.repository.d.ts +77 -0
- package/dist/lib/views/domain/saved-view.repository.d.ts.map +1 -0
- package/dist/lib/views/domain/saved-view.repository.js +5 -0
- package/dist/lib/views/http/controllers/saved-views.controller.d.ts +45 -0
- package/dist/lib/views/http/controllers/saved-views.controller.d.ts.map +1 -0
- package/dist/lib/views/http/controllers/saved-views.controller.js +216 -0
- package/dist/lib/views/http/controllers/to-http-error.d.ts +10 -0
- package/dist/lib/views/http/controllers/to-http-error.d.ts.map +1 -0
- package/dist/lib/views/http/controllers/to-http-error.js +26 -0
- package/dist/lib/views/http/dto/save-view.dto.d.ts +54 -0
- package/dist/lib/views/http/dto/save-view.dto.d.ts.map +1 -0
- package/dist/lib/views/http/dto/save-view.dto.js +230 -0
- package/dist/lib/views/http/dto/view-payload.validator.d.ts +20 -0
- package/dist/lib/views/http/dto/view-payload.validator.d.ts.map +1 -0
- package/dist/lib/views/http/dto/view-payload.validator.js +52 -0
- package/dist/lib/views/infrastructure/persistence/drizzle-saved-view.repository.d.ts +26 -0
- package/dist/lib/views/infrastructure/persistence/drizzle-saved-view.repository.d.ts.map +1 -0
- package/dist/lib/views/infrastructure/persistence/drizzle-saved-view.repository.js +135 -0
- package/dist/lib/views/infrastructure/schema/external-refs.d.ts +68 -0
- package/dist/lib/views/infrastructure/schema/external-refs.d.ts.map +1 -0
- package/dist/lib/views/infrastructure/schema/external-refs.js +29 -0
- package/dist/lib/views/infrastructure/schema/index.d.ts +8 -0
- package/dist/lib/views/infrastructure/schema/index.d.ts.map +1 -0
- package/dist/lib/views/infrastructure/schema/index.js +13 -0
- package/dist/lib/views/infrastructure/schema/saved-views.d.ts +275 -0
- package/dist/lib/views/infrastructure/schema/saved-views.d.ts.map +1 -0
- package/dist/lib/views/infrastructure/schema/saved-views.js +87 -0
- package/dist/lib/views/views.constants.d.ts +26 -0
- package/dist/lib/views/views.constants.d.ts.map +1 -0
- package/dist/lib/views/views.constants.js +28 -0
- package/dist/lib/views/views.tokens.d.ts +17 -0
- package/dist/lib/views/views.tokens.d.ts.map +1 -0
- package/dist/lib/views/views.tokens.js +21 -0
- package/migrations/0000_saved_views.sql +29 -0
- package/migrations/meta/0000_snapshot.json +256 -0
- package/migrations/meta/_journal.json +13 -0
- package/package.json +13 -12
- package/dist/lib/entries/controllers/bulk-entries.controller.d.ts +0 -26
- package/dist/lib/entries/controllers/bulk-entries.controller.d.ts.map +0 -1
- package/dist/lib/entries/controllers/create-entry.controller.d.ts +0 -20
- package/dist/lib/entries/controllers/create-entry.controller.d.ts.map +0 -1
- package/dist/lib/entries/controllers/delete-entry.controller.d.ts +0 -24
- package/dist/lib/entries/controllers/delete-entry.controller.d.ts.map +0 -1
- package/dist/lib/entries/controllers/get-entry.controller.d.ts +0 -34
- package/dist/lib/entries/controllers/get-entry.controller.d.ts.map +0 -1
- package/dist/lib/entries/controllers/list-entries.controller.d.ts +0 -20
- package/dist/lib/entries/controllers/list-entries.controller.d.ts.map +0 -1
- package/dist/lib/entries/controllers/publish-entry.controller.d.ts +0 -19
- package/dist/lib/entries/controllers/publish-entry.controller.d.ts.map +0 -1
- package/dist/lib/entries/controllers/resolve-type.d.ts +0 -9
- package/dist/lib/entries/controllers/resolve-type.d.ts.map +0 -1
- package/dist/lib/entries/controllers/update-entry.controller.d.ts +0 -18
- package/dist/lib/entries/controllers/update-entry.controller.d.ts.map +0 -1
- package/dist/lib/entries/dto/bulk-ids.dto.d.ts +0 -11
- package/dist/lib/entries/dto/bulk-ids.dto.d.ts.map +0 -1
- package/dist/lib/entries/dto/list-entries-query.dto.d.ts +0 -46
- package/dist/lib/entries/dto/list-entries-query.dto.d.ts.map +0 -1
- package/dist/lib/entries/dto/relation-delta-map.validator.d.ts +0 -19
- package/dist/lib/entries/dto/relation-delta-map.validator.d.ts.map +0 -1
- package/dist/lib/entries/dto/save-entry.dto.d.ts +0 -46
- package/dist/lib/entries/dto/save-entry.dto.d.ts.map +0 -1
- package/dist/lib/entries/infrastructure/persistence/field-selection.d.ts +0 -24
- package/dist/lib/entries/infrastructure/persistence/field-selection.d.ts.map +0 -1
- package/dist/lib/entries/infrastructure/queries/entry-filter-schema.d.ts +0 -40
- package/dist/lib/entries/infrastructure/queries/entry-filter-schema.d.ts.map +0 -1
- package/dist/lib/entries/services/entries.service.d.ts +0 -59
- package/dist/lib/entries/services/entries.service.d.ts.map +0 -1
- package/dist/lib/entries/services/entry-counter.service.d.ts +0 -31
- package/dist/lib/entries/services/entry-counter.service.d.ts.map +0 -1
- package/dist/lib/entries/services/entry-filter-schema.d.ts +0 -32
- package/dist/lib/entries/services/entry-filter-schema.d.ts.map +0 -1
- package/dist/lib/entries/services/entry-row.d.ts +0 -56
- package/dist/lib/entries/services/entry-row.d.ts.map +0 -1
- package/dist/lib/entries/services/entry-writer.service.d.ts +0 -193
- package/dist/lib/entries/services/entry-writer.service.d.ts.map +0 -1
- package/dist/lib/entries/services/relation-link.service.d.ts +0 -115
- package/dist/lib/entries/services/relation-link.service.d.ts.map +0 -1
- package/dist/lib/extension/per-locale-relation.d.ts +0 -18
- package/dist/lib/extension/per-locale-relation.d.ts.map +0 -1
- package/dist/lib/public/controllers/get-public-entry.controller.d.ts +0 -26
- package/dist/lib/public/controllers/get-public-entry.controller.d.ts.map +0 -1
- package/dist/lib/public/controllers/list-public-entries.controller.d.ts +0 -24
- package/dist/lib/public/controllers/list-public-entries.controller.d.ts.map +0 -1
- package/dist/lib/public/controllers/public-schema.controller.d.ts +0 -18
- package/dist/lib/public/controllers/public-schema.controller.d.ts.map +0 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var ContentViewsModule_1;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ContentViewsModule = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const common_1 = require("@nestjs/common");
|
|
7
|
+
const workspace_grants_query_1 = require("../content-types/queries/workspace-grants.query");
|
|
8
|
+
const views_tokens_1 = require("./views.tokens");
|
|
9
|
+
const saved_view_repository_1 = require("./domain/saved-view.repository");
|
|
10
|
+
const drizzle_saved_view_repository_1 = require("./infrastructure/persistence/drizzle-saved-view.repository");
|
|
11
|
+
const saved_views_query_1 = require("./application/queries/saved-views.query");
|
|
12
|
+
const saved_view_access_service_1 = require("./application/saved-view-access.service");
|
|
13
|
+
const view_scope_service_1 = require("./application/view-scope.service");
|
|
14
|
+
const create_saved_view_use_case_1 = require("./application/use-cases/create-saved-view.use-case");
|
|
15
|
+
const update_saved_view_use_case_1 = require("./application/use-cases/update-saved-view.use-case");
|
|
16
|
+
const delete_saved_view_use_case_1 = require("./application/use-cases/delete-saved-view.use-case");
|
|
17
|
+
const set_default_view_use_case_1 = require("./application/use-cases/set-default-view.use-case");
|
|
18
|
+
const saved_views_controller_1 = require("./http/controllers/saved-views.controller");
|
|
19
|
+
/**
|
|
20
|
+
* The saved-views module.
|
|
21
|
+
*
|
|
22
|
+
* A **second** module from this package rather than a branch of
|
|
23
|
+
* `ContentModule`, because it needs its own `ServerPlugin` entry — the contract
|
|
24
|
+
* carries exactly one `migrations` descriptor per plugin, and content's is
|
|
25
|
+
* already spent on the host-owned generated collection tables. Splitting the
|
|
26
|
+
* module keeps that seam honest: the views feature owns fixed tables it ships
|
|
27
|
+
* migrations for, and the content model's tables stay the host's.
|
|
28
|
+
*
|
|
29
|
+
* It provides the registry the plugin factory hands it under its **own** token
|
|
30
|
+
* (`VIEW_CONTENT_REGISTRY`), so `ViewScopeService` can resolve a scope without
|
|
31
|
+
* importing `ContentModule` — which would make the two plugins' load order
|
|
32
|
+
* load-bearing — and without two global modules both claiming
|
|
33
|
+
* `CONTENT_REGISTRY`.
|
|
34
|
+
*/
|
|
35
|
+
let ContentViewsModule = ContentViewsModule_1 = class ContentViewsModule {
|
|
36
|
+
static forRoot(registry) {
|
|
37
|
+
return {
|
|
38
|
+
module: ContentViewsModule_1,
|
|
39
|
+
global: true,
|
|
40
|
+
controllers: [saved_views_controller_1.SavedViewsController],
|
|
41
|
+
providers: [
|
|
42
|
+
{ provide: views_tokens_1.VIEW_CONTENT_REGISTRY, useValue: registry },
|
|
43
|
+
{
|
|
44
|
+
provide: saved_view_repository_1.SAVED_VIEW_REPOSITORY,
|
|
45
|
+
useClass: drizzle_saved_view_repository_1.DrizzleSavedViewRepository
|
|
46
|
+
},
|
|
47
|
+
workspace_grants_query_1.WorkspaceGrantsQuery,
|
|
48
|
+
saved_views_query_1.SavedViewsQuery,
|
|
49
|
+
saved_view_access_service_1.SavedViewAccessService,
|
|
50
|
+
view_scope_service_1.ViewScopeService,
|
|
51
|
+
create_saved_view_use_case_1.CreateSavedViewUseCase,
|
|
52
|
+
update_saved_view_use_case_1.UpdateSavedViewUseCase,
|
|
53
|
+
delete_saved_view_use_case_1.DeleteSavedViewUseCase,
|
|
54
|
+
set_default_view_use_case_1.SetDefaultViewUseCase
|
|
55
|
+
],
|
|
56
|
+
exports: [saved_views_query_1.SavedViewsQuery]
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
exports.ContentViewsModule = ContentViewsModule;
|
|
61
|
+
exports.ContentViewsModule = ContentViewsModule = ContentViewsModule_1 = tslib_1.__decorate([
|
|
62
|
+
(0, common_1.Module)({})
|
|
63
|
+
], ContentViewsModule);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Transport-agnostic domain errors for saved views. */
|
|
2
|
+
export { SavedViewNotFoundError } from './saved-view-not-found.error';
|
|
3
|
+
export { SavedViewForbiddenError } from './saved-view-forbidden.error';
|
|
4
|
+
export { SavedViewNameTakenError } from './saved-view-name-taken.error';
|
|
5
|
+
export { SavedViewLimitError } from './saved-view-limit-error';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/views/domain/errors/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SavedViewLimitError = exports.SavedViewNameTakenError = exports.SavedViewForbiddenError = exports.SavedViewNotFoundError = void 0;
|
|
4
|
+
/** Transport-agnostic domain errors for saved views. */
|
|
5
|
+
var saved_view_not_found_error_1 = require("./saved-view-not-found.error");
|
|
6
|
+
Object.defineProperty(exports, "SavedViewNotFoundError", { enumerable: true, get: function () { return saved_view_not_found_error_1.SavedViewNotFoundError; } });
|
|
7
|
+
var saved_view_forbidden_error_1 = require("./saved-view-forbidden.error");
|
|
8
|
+
Object.defineProperty(exports, "SavedViewForbiddenError", { enumerable: true, get: function () { return saved_view_forbidden_error_1.SavedViewForbiddenError; } });
|
|
9
|
+
var saved_view_name_taken_error_1 = require("./saved-view-name-taken.error");
|
|
10
|
+
Object.defineProperty(exports, "SavedViewNameTakenError", { enumerable: true, get: function () { return saved_view_name_taken_error_1.SavedViewNameTakenError; } });
|
|
11
|
+
var saved_view_limit_error_1 = require("./saved-view-limit-error");
|
|
12
|
+
Object.defineProperty(exports, "SavedViewLimitError", { enumerable: true, get: function () { return saved_view_limit_error_1.SavedViewLimitError; } });
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The caller may read the view but not perform this write — editing or deleting
|
|
3
|
+
* someone else's view, or sharing one without `views:share`. Distinct from
|
|
4
|
+
* {@link SavedViewNotFoundError} because the view's existence is already known
|
|
5
|
+
* to the caller (it is listed for them), so a 403 discloses nothing new.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SavedViewForbiddenError extends Error {
|
|
8
|
+
constructor(reason: string);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=saved-view-forbidden.error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saved-view-forbidden.error.d.ts","sourceRoot":"","sources":["../../../../../src/lib/views/domain/errors/saved-view-forbidden.error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;gBAClC,MAAM,EAAE,MAAM;CAI7B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SavedViewForbiddenError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* The caller may read the view but not perform this write — editing or deleting
|
|
6
|
+
* someone else's view, or sharing one without `views:share`. Distinct from
|
|
7
|
+
* {@link SavedViewNotFoundError} because the view's existence is already known
|
|
8
|
+
* to the caller (it is listed for them), so a 403 discloses nothing new.
|
|
9
|
+
*/
|
|
10
|
+
class SavedViewForbiddenError extends Error {
|
|
11
|
+
constructor(reason) {
|
|
12
|
+
super(reason);
|
|
13
|
+
this.name = 'SavedViewForbiddenError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.SavedViewForbiddenError = SavedViewForbiddenError;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The caller has hit {@link VIEW_MAX_PER_SCOPE} views for one workspace + scope.
|
|
3
|
+
* A bound rather than a business rule: it keeps one account from filling the
|
|
4
|
+
* table, and the number is far above any realistic list of saved slices.
|
|
5
|
+
*/
|
|
6
|
+
export declare class SavedViewLimitError extends Error {
|
|
7
|
+
constructor();
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=saved-view-limit-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saved-view-limit-error.d.ts","sourceRoot":"","sources":["../../../../../src/lib/views/domain/errors/saved-view-limit-error.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;;CAK7C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SavedViewLimitError = void 0;
|
|
4
|
+
const views_constants_1 = require("../../views.constants");
|
|
5
|
+
/**
|
|
6
|
+
* The caller has hit {@link VIEW_MAX_PER_SCOPE} views for one workspace + scope.
|
|
7
|
+
* A bound rather than a business rule: it keeps one account from filling the
|
|
8
|
+
* table, and the number is far above any realistic list of saved slices.
|
|
9
|
+
*/
|
|
10
|
+
class SavedViewLimitError extends Error {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(`You can save at most ${views_constants_1.VIEW_MAX_PER_SCOPE} views for one list.`);
|
|
13
|
+
this.name = 'SavedViewLimitError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.SavedViewLimitError = SavedViewLimitError;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saved-view-name-taken.error.d.ts","sourceRoot":"","sources":["../../../../../src/lib/views/domain/errors/saved-view-name-taken.error.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,qBAAa,uBAAwB,SAAQ,KAAK;gBAClC,IAAI,EAAE,MAAM;CAI3B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SavedViewNameTakenError = void 0;
|
|
4
|
+
/** The caller already holds a view by this name in the same workspace + scope. */
|
|
5
|
+
class SavedViewNameTakenError extends Error {
|
|
6
|
+
constructor(name) {
|
|
7
|
+
super(`You already have a view named "${name}" for this list.`);
|
|
8
|
+
this.name = 'SavedViewNameTakenError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.SavedViewNameTakenError = SavedViewNameTakenError;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A saved view the caller may not read, or that does not exist. One error for
|
|
3
|
+
* both so the API cannot be used to probe which views other people hold — the
|
|
4
|
+
* controller maps it to a 404 either way.
|
|
5
|
+
*/
|
|
6
|
+
export declare class SavedViewNotFoundError extends Error {
|
|
7
|
+
constructor(id: string);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=saved-view-not-found.error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saved-view-not-found.error.d.ts","sourceRoot":"","sources":["../../../../../src/lib/views/domain/errors/saved-view-not-found.error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACjC,EAAE,EAAE,MAAM;CAIzB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SavedViewNotFoundError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* A saved view the caller may not read, or that does not exist. One error for
|
|
6
|
+
* both so the API cannot be used to probe which views other people hold — the
|
|
7
|
+
* controller maps it to a 404 either way.
|
|
8
|
+
*/
|
|
9
|
+
class SavedViewNotFoundError extends Error {
|
|
10
|
+
constructor(id) {
|
|
11
|
+
super(`Saved view "${id}" was not found.`);
|
|
12
|
+
this.name = 'SavedViewNotFoundError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.SavedViewNotFoundError = SavedViewNotFoundError;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type DomainEvent } from '@orthacms/database';
|
|
2
|
+
/**
|
|
3
|
+
* The domain events a saved view raises.
|
|
4
|
+
*
|
|
5
|
+
* A view is a bookmark rather than a grant — it is replayed through the
|
|
6
|
+
* ordinary list query with the reader's own permissions, so it can never show
|
|
7
|
+
* anyone a row they could not already reach. That is why only three of the five
|
|
8
|
+
* write routes raise anything:
|
|
9
|
+
*
|
|
10
|
+
* - **Create, update and delete are recorded.** A `workspace`-visible view is
|
|
11
|
+
* shared state: it appears in every member's switcher, it is the thing a team
|
|
12
|
+
* agrees "the review queue" means, and deleting one takes it away from
|
|
13
|
+
* everybody. Sharing is even its own permission (`views:share`), which is the
|
|
14
|
+
* product saying this is not purely personal.
|
|
15
|
+
* - **Setting a personal default raises nothing, deliberately.** It is the
|
|
16
|
+
* reader's own landing choice — the same class of thing as `PUT
|
|
17
|
+
* /preferences` — and it is set by clicking a view. A row per click would be
|
|
18
|
+
* a usage metric wearing an audit row's clothes, and it would bury the three
|
|
19
|
+
* kinds above in a log that has no way to filter by "interesting".
|
|
20
|
+
*/
|
|
21
|
+
export declare const SAVED_VIEW_EVENT_KINDS: {
|
|
22
|
+
readonly CREATED: "saved_view.created";
|
|
23
|
+
readonly UPDATED: "saved_view.updated";
|
|
24
|
+
readonly DELETED: "saved_view.deleted";
|
|
25
|
+
};
|
|
26
|
+
/** Builds a saved-view {@link DomainEvent}, stamping the aggregate type + id. */
|
|
27
|
+
export declare function savedViewEvent(kind: string, viewId: string, payload: Record<string, unknown>): DomainEvent;
|
|
28
|
+
//# sourceMappingURL=saved-view-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saved-view-events.d.ts","sourceRoot":"","sources":["../../../../../src/lib/views/domain/events/saved-view-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEzE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,sBAAsB;;;;CAIzB,CAAC;AAEX,iFAAiF;AACjF,wBAAgB,cAAc,CAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,WAAW,CAOb"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SAVED_VIEW_EVENT_KINDS = void 0;
|
|
4
|
+
exports.savedViewEvent = savedViewEvent;
|
|
5
|
+
const database_1 = require("@orthacms/database");
|
|
6
|
+
/**
|
|
7
|
+
* The domain events a saved view raises.
|
|
8
|
+
*
|
|
9
|
+
* A view is a bookmark rather than a grant — it is replayed through the
|
|
10
|
+
* ordinary list query with the reader's own permissions, so it can never show
|
|
11
|
+
* anyone a row they could not already reach. That is why only three of the five
|
|
12
|
+
* write routes raise anything:
|
|
13
|
+
*
|
|
14
|
+
* - **Create, update and delete are recorded.** A `workspace`-visible view is
|
|
15
|
+
* shared state: it appears in every member's switcher, it is the thing a team
|
|
16
|
+
* agrees "the review queue" means, and deleting one takes it away from
|
|
17
|
+
* everybody. Sharing is even its own permission (`views:share`), which is the
|
|
18
|
+
* product saying this is not purely personal.
|
|
19
|
+
* - **Setting a personal default raises nothing, deliberately.** It is the
|
|
20
|
+
* reader's own landing choice — the same class of thing as `PUT
|
|
21
|
+
* /preferences` — and it is set by clicking a view. A row per click would be
|
|
22
|
+
* a usage metric wearing an audit row's clothes, and it would bury the three
|
|
23
|
+
* kinds above in a log that has no way to filter by "interesting".
|
|
24
|
+
*/
|
|
25
|
+
exports.SAVED_VIEW_EVENT_KINDS = {
|
|
26
|
+
CREATED: 'saved_view.created',
|
|
27
|
+
UPDATED: 'saved_view.updated',
|
|
28
|
+
DELETED: 'saved_view.deleted'
|
|
29
|
+
};
|
|
30
|
+
/** Builds a saved-view {@link DomainEvent}, stamping the aggregate type + id. */
|
|
31
|
+
function savedViewEvent(kind, viewId, payload) {
|
|
32
|
+
return (0, database_1.createDomainEvent)({
|
|
33
|
+
kind,
|
|
34
|
+
aggregateType: 'saved_view',
|
|
35
|
+
aggregateId: viewId,
|
|
36
|
+
payload
|
|
37
|
+
});
|
|
38
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A saved list view — the named slice of a collection an editor returns to.
|
|
3
|
+
*
|
|
4
|
+
* Framework-free by ADR-0003: this module is the contract the HTTP layer, the
|
|
5
|
+
* repository adapter and the admin all agree on, and it imports nothing.
|
|
6
|
+
*/
|
|
7
|
+
/** Who may see a saved view. */
|
|
8
|
+
export declare const VIEW_VISIBILITY: {
|
|
9
|
+
/** Only its owner. */
|
|
10
|
+
readonly Private: "private";
|
|
11
|
+
/** Every member of the workspace it belongs to. */
|
|
12
|
+
readonly Workspace: "workspace";
|
|
13
|
+
};
|
|
14
|
+
/** One visibility value. */
|
|
15
|
+
export type ViewVisibility = (typeof VIEW_VISIBILITY)[keyof typeof VIEW_VISIBILITY];
|
|
16
|
+
/** Every visibility, for validators and the OpenAPI enum. */
|
|
17
|
+
export declare const VIEW_VISIBILITY_VALUES: ("private" | "workspace")[];
|
|
18
|
+
/**
|
|
19
|
+
* The slice a view restores, stored as one opaque-ish JSON document.
|
|
20
|
+
*
|
|
21
|
+
* Deliberately mirrors the **URL params** the records page already owns rather
|
|
22
|
+
* than re-modelling them: `filter` and `sort` are the raw `?filter=` / `?sort=`
|
|
23
|
+
* strings, so a view round-trips through the same code path a hand-edited link
|
|
24
|
+
* does. Two things are absent on purpose — `search` is a one-off question, not
|
|
25
|
+
* a property of the slice, and `page` is a reading position, so a view always
|
|
26
|
+
* opens on the first page.
|
|
27
|
+
*/
|
|
28
|
+
export interface SavedViewPayload {
|
|
29
|
+
/** The `?filter=` JSON string, or absent for no filter. */
|
|
30
|
+
filter?: string;
|
|
31
|
+
/** The `?sort=` spec (`updatedAt` / `-updatedAt`), or absent for unsorted. */
|
|
32
|
+
sort?: string;
|
|
33
|
+
/** Rows per page. */
|
|
34
|
+
pageSize?: number;
|
|
35
|
+
/** Visible column ids, **in display order**. */
|
|
36
|
+
columns?: string[];
|
|
37
|
+
/**
|
|
38
|
+
* Slot-owned list params (the i18n plugin's `?locale=`, and whatever a
|
|
39
|
+
* later plugin contributes), as an opaque string map. Opaque because the
|
|
40
|
+
* keys come from `RECORDS_TOOLBAR_SLOT.listParamKeys` at runtime — naming
|
|
41
|
+
* them here would break the next plugin's params silently.
|
|
42
|
+
*/
|
|
43
|
+
extra?: Record<string, string>;
|
|
44
|
+
}
|
|
45
|
+
/** A saved view as the API returns it. */
|
|
46
|
+
export interface SavedView {
|
|
47
|
+
/** Primary key. */
|
|
48
|
+
id: string;
|
|
49
|
+
/** The list this view belongs to (`content:<typeName>`). */
|
|
50
|
+
scope: string;
|
|
51
|
+
/** Display name, unique per owner within a workspace + scope. */
|
|
52
|
+
name: string;
|
|
53
|
+
/** Who may see it. */
|
|
54
|
+
visibility: ViewVisibility;
|
|
55
|
+
/** The user who created it. */
|
|
56
|
+
ownerId: string;
|
|
57
|
+
/** Whether the caller owns it — the admin gates Save and Delete on this. */
|
|
58
|
+
isOwn: boolean;
|
|
59
|
+
/** Whether it is the caller's default for this scope. */
|
|
60
|
+
isDefault: boolean;
|
|
61
|
+
/** The slice it restores. */
|
|
62
|
+
payload: SavedViewPayload;
|
|
63
|
+
/** Last-modified timestamp, ISO-8601. */
|
|
64
|
+
updatedAt: string;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=saved-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saved-view.d.ts","sourceRoot":"","sources":["../../../../src/lib/views/domain/saved-view.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,gCAAgC;AAChC,eAAO,MAAM,eAAe;IACxB,sBAAsB;;IAEtB,mDAAmD;;CAE7C,CAAC;AAEX,4BAA4B;AAC5B,MAAM,MAAM,cAAc,GACtB,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAE3D,6DAA6D;AAC7D,eAAO,MAAM,sBAAsB,6BAAiC,CAAC;AAErE;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC7B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,0CAA0C;AAC1C,MAAM,WAAW,SAAS;IACtB,mBAAmB;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,UAAU,EAAE,cAAc,CAAC;IAC3B,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,KAAK,EAAE,OAAO,CAAC;IACf,yDAAyD;IACzD,SAAS,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A saved list view — the named slice of a collection an editor returns to.
|
|
4
|
+
*
|
|
5
|
+
* Framework-free by ADR-0003: this module is the contract the HTTP layer, the
|
|
6
|
+
* repository adapter and the admin all agree on, and it imports nothing.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.VIEW_VISIBILITY_VALUES = exports.VIEW_VISIBILITY = void 0;
|
|
10
|
+
/** Who may see a saved view. */
|
|
11
|
+
exports.VIEW_VISIBILITY = {
|
|
12
|
+
/** Only its owner. */
|
|
13
|
+
Private: 'private',
|
|
14
|
+
/** Every member of the workspace it belongs to. */
|
|
15
|
+
Workspace: 'workspace'
|
|
16
|
+
};
|
|
17
|
+
/** Every visibility, for validators and the OpenAPI enum. */
|
|
18
|
+
exports.VIEW_VISIBILITY_VALUES = Object.values(exports.VIEW_VISIBILITY);
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { SavedViewPayload, ViewVisibility } from './saved-view';
|
|
2
|
+
/** A stored view row, before the per-caller flags are derived. */
|
|
3
|
+
export interface SavedViewRecord {
|
|
4
|
+
/** Primary key. */
|
|
5
|
+
id: string;
|
|
6
|
+
/** The workspace it belongs to. */
|
|
7
|
+
workspaceId: string;
|
|
8
|
+
/** The list it is over. */
|
|
9
|
+
scope: string;
|
|
10
|
+
/** The user who saved it. */
|
|
11
|
+
ownerId: string;
|
|
12
|
+
/** Who may see it. */
|
|
13
|
+
visibility: ViewVisibility;
|
|
14
|
+
/** Display name. */
|
|
15
|
+
name: string;
|
|
16
|
+
/** The slice it restores. */
|
|
17
|
+
payload: SavedViewPayload;
|
|
18
|
+
/** Manual ordering within its scope. */
|
|
19
|
+
position: number;
|
|
20
|
+
/** Last-modified timestamp. */
|
|
21
|
+
updatedAt: Date;
|
|
22
|
+
}
|
|
23
|
+
/** Everything needed to store a new view. */
|
|
24
|
+
export interface NewSavedView {
|
|
25
|
+
/** The workspace it belongs to. */
|
|
26
|
+
workspaceId: string;
|
|
27
|
+
/** The list it is over. */
|
|
28
|
+
scope: string;
|
|
29
|
+
/** The user saving it. */
|
|
30
|
+
ownerId: string;
|
|
31
|
+
/** Who may see it. */
|
|
32
|
+
visibility: ViewVisibility;
|
|
33
|
+
/** Display name. */
|
|
34
|
+
name: string;
|
|
35
|
+
/** The slice it restores. */
|
|
36
|
+
payload: SavedViewPayload;
|
|
37
|
+
}
|
|
38
|
+
/** The fields an update may change; absent keys are left alone. */
|
|
39
|
+
export interface SavedViewPatch {
|
|
40
|
+
/** New display name. */
|
|
41
|
+
name?: string;
|
|
42
|
+
/** New visibility. */
|
|
43
|
+
visibility?: ViewVisibility;
|
|
44
|
+
/** New slice. */
|
|
45
|
+
payload?: SavedViewPayload;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Persistence port for saved views. The interface lives in `domain/` and the
|
|
49
|
+
* Drizzle adapter in `infrastructure/`, per ADR-0003 — nothing here knows about
|
|
50
|
+
* SQL, and the use-cases depend on this shape rather than on a table.
|
|
51
|
+
*/
|
|
52
|
+
export interface SavedViewRepository {
|
|
53
|
+
/**
|
|
54
|
+
* Every view in this workspace + scope the reader may see: their own
|
|
55
|
+
* (whatever the visibility) plus everyone's workspace-visible ones.
|
|
56
|
+
*/
|
|
57
|
+
listVisible(workspaceId: string, scope: string, readerId: string): Promise<SavedViewRecord[]>;
|
|
58
|
+
/** One view by id, or `null` when it does not exist. */
|
|
59
|
+
findById(id: string): Promise<SavedViewRecord | null>;
|
|
60
|
+
/** How many views this owner already holds in this workspace + scope. */
|
|
61
|
+
countForOwner(workspaceId: string, scope: string, ownerId: string): Promise<number>;
|
|
62
|
+
/** Stores a new view and returns it. */
|
|
63
|
+
create(view: NewSavedView): Promise<SavedViewRecord>;
|
|
64
|
+
/** Applies a patch and returns the updated row. */
|
|
65
|
+
update(id: string, patch: SavedViewPatch): Promise<SavedViewRecord>;
|
|
66
|
+
/** Removes a view. Defaults pointing at it are cascaded away. */
|
|
67
|
+
delete(id: string): Promise<void>;
|
|
68
|
+
/** The view this reader defaults to for a scope, or `null`. */
|
|
69
|
+
findDefaultId(userId: string, scope: string): Promise<string | null>;
|
|
70
|
+
/** Makes `viewId` this user's default for the scope, replacing any prior. */
|
|
71
|
+
setDefault(userId: string, scope: string, viewId: string): Promise<void>;
|
|
72
|
+
/** Clears this user's default for the scope, if any. */
|
|
73
|
+
clearDefault(userId: string, scope: string): Promise<void>;
|
|
74
|
+
}
|
|
75
|
+
/** DI token for {@link SavedViewRepository}. */
|
|
76
|
+
export declare const SAVED_VIEW_REPOSITORY: unique symbol;
|
|
77
|
+
//# sourceMappingURL=saved-view.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saved-view.repository.d.ts","sourceRoot":"","sources":["../../../../src/lib/views/domain/saved-view.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAErE,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC5B,mBAAmB;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,UAAU,EAAE,cAAc,CAAC;IAC3B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IACzB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,UAAU,EAAE,cAAc,CAAC;IAC3B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,OAAO,EAAE,gBAAgB,CAAC;CAC7B;AAED,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC3B,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,iBAAiB;IACjB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;OAGG;IACH,WAAW,CACP,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAE9B,wDAAwD;IACxD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAEtD,yEAAyE;IACzE,aAAa,CACT,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB,wCAAwC;IACxC,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAErD,mDAAmD;IACnD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAEpE,iEAAiE;IACjE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElC,+DAA+D;IAC/D,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAErE,6EAA6E;IAC7E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzE,wDAAwD;IACxD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED,gDAAgD;AAChD,eAAO,MAAM,qBAAqB,eAAkC,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type PublicUser } from '@orthacms/identity-server';
|
|
2
|
+
import type { SavedView } from '../../domain/saved-view';
|
|
3
|
+
import { SavedViewsQuery } from '../../application/queries/saved-views.query';
|
|
4
|
+
import { CreateSavedViewUseCase } from '../../application/use-cases/create-saved-view.use-case';
|
|
5
|
+
import { UpdateSavedViewUseCase } from '../../application/use-cases/update-saved-view.use-case';
|
|
6
|
+
import { DeleteSavedViewUseCase } from '../../application/use-cases/delete-saved-view.use-case';
|
|
7
|
+
import { SetDefaultViewUseCase } from '../../application/use-cases/set-default-view.use-case';
|
|
8
|
+
import { ViewScopeService } from '../../application/view-scope.service';
|
|
9
|
+
import { CreateViewDto, ListViewsQueryDto, UpdateViewDto } from '../dto/save-view.dto';
|
|
10
|
+
/**
|
|
11
|
+
* `/api/views` — a member's saved list views for one content type.
|
|
12
|
+
*
|
|
13
|
+
* A genuine CRUD resource over one thing, so it stays a single controller
|
|
14
|
+
* rather than five. Every route is workspace-scoped (`WorkspaceGuard` reads
|
|
15
|
+
* `X-Workspace-Id` and 403s a non-member) and gated on `content:read`: a view
|
|
16
|
+
* is a saved way of reading content, so anyone who cannot read content has no
|
|
17
|
+
* use for one. Sharing needs `views:share` on top, checked per write because it
|
|
18
|
+
* depends on the *body*, not the route.
|
|
19
|
+
*
|
|
20
|
+
* The stored payload is **not** a grant. It is replayed through the ordinary
|
|
21
|
+
* list query with the reader's own permissions, workspace scope and content
|
|
22
|
+
* grants, so a shared view shows a narrower reader fewer rows — never more.
|
|
23
|
+
*/
|
|
24
|
+
export declare class SavedViewsController {
|
|
25
|
+
private readonly views;
|
|
26
|
+
private readonly scopes;
|
|
27
|
+
private readonly createView;
|
|
28
|
+
private readonly updateView;
|
|
29
|
+
private readonly deleteView;
|
|
30
|
+
private readonly setDefault;
|
|
31
|
+
constructor(views: SavedViewsQuery, scopes: ViewScopeService, createView: CreateSavedViewUseCase, updateView: UpdateSavedViewUseCase, deleteView: DeleteSavedViewUseCase, setDefault: SetDefaultViewUseCase);
|
|
32
|
+
/** Every view this member may see for a list: their own plus the shared ones. */
|
|
33
|
+
list(query: ListViewsQueryDto, workspaceId: string, user?: PublicUser): Promise<SavedView[]>;
|
|
34
|
+
/** Saves the current slice as a new view. */
|
|
35
|
+
create(body: CreateViewDto, workspaceId: string, user?: PublicUser): Promise<SavedView>;
|
|
36
|
+
/** Renames, re-shares, or re-captures a view the caller owns. */
|
|
37
|
+
update(id: string, body: UpdateViewDto, workspaceId: string, user?: PublicUser): Promise<SavedView>;
|
|
38
|
+
/** Deletes a view the caller owns. */
|
|
39
|
+
remove(id: string, workspaceId: string, user?: PublicUser): Promise<void>;
|
|
40
|
+
/** Lands this member on the view when they open the list. */
|
|
41
|
+
makeDefault(id: string, workspaceId: string, user?: PublicUser): Promise<void>;
|
|
42
|
+
/** Clears the caller's default, so the list opens unfiltered again. */
|
|
43
|
+
clearDefault(id: string, workspaceId: string, user?: PublicUser): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=saved-views.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saved-views.controller.d.ts","sourceRoot":"","sources":["../../../../../src/lib/views/http/controllers/saved-views.controller.ts"],"names":[],"mappings":"AAiBA,OAAO,EAKH,KAAK,UAAU,EAClB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EACH,aAAa,EACb,iBAAiB,EACjB,aAAa,EAChB,MAAM,sBAAsB,CAAC;AAG9B;;;;;;;;;;;;;GAaG;AACH,qBAIa,oBAAoB;IAEzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBALV,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,qBAAqB;IAGtD,iFAAiF;IAO3E,IAAI,CACG,KAAK,EAAE,iBAAiB,EACb,WAAW,EAAE,MAAM,EACxB,IAAI,CAAC,EAAE,UAAU,GACjC,OAAO,CAAC,SAAS,EAAE,CAAC;IAMvB,6CAA6C;IAOvC,MAAM,CACA,IAAI,EAAE,aAAa,EACP,WAAW,EAAE,MAAM,EACxB,IAAI,CAAC,EAAE,UAAU,GACjC,OAAO,CAAC,SAAS,CAAC;IAoBrB,iEAAiE;IAO3D,MAAM,CACoB,EAAE,EAAE,MAAM,EAC9B,IAAI,EAAE,aAAa,EACP,WAAW,EAAE,MAAM,EACxB,IAAI,CAAC,EAAE,UAAU,GACjC,OAAO,CAAC,SAAS,CAAC;IASrB,sCAAsC;IAQhC,MAAM,CACoB,EAAE,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACxB,IAAI,CAAC,EAAE,UAAU,GACjC,OAAO,CAAC,IAAI,CAAC;IAShB,6DAA6D;IAQvD,WAAW,CACe,EAAE,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACxB,IAAI,CAAC,EAAE,UAAU,GACjC,OAAO,CAAC,IAAI,CAAC;IAShB,uEAAuE;IAQjE,YAAY,CACc,EAAE,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACxB,IAAI,CAAC,EAAE,UAAU,GACjC,OAAO,CAAC,IAAI,CAAC;CAQnB"}
|