@rytass/cms-base-nestjs-graphql-module 0.0.19 → 0.0.21

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.
@@ -1,6 +1,7 @@
1
+ import { QuadratsElement } from '@quadrats/core';
1
2
  export declare class ArticleVersionContentInput {
2
3
  language?: string | null;
3
4
  title: string;
4
5
  description?: string | null;
5
- content: string;
6
+ content: QuadratsElement[];
6
7
  }
@@ -1,4 +1,5 @@
1
1
  import { Field, InputType } from '@nestjs/graphql';
2
+ import { QuadratsContentScalar } from '../scalars/quadrats-element.scalar.js';
2
3
 
3
4
  function _ts_decorate(decorators, target, key, desc) {
4
5
  var c = arguments.length, r = c < 3 ? target : desc, d;
@@ -32,8 +33,8 @@ _ts_decorate([
32
33
  _ts_metadata("design:type", Object)
33
34
  ], ArticleVersionContentInput.prototype, "description", void 0);
34
35
  _ts_decorate([
35
- Field(()=>String),
36
- _ts_metadata("design:type", String)
36
+ Field(()=>QuadratsContentScalar),
37
+ _ts_metadata("design:type", Array)
37
38
  ], ArticleVersionContentInput.prototype, "content", void 0);
38
39
  ArticleVersionContentInput = _ts_decorate([
39
40
  InputType('ArticleVersionContentInput')
package/index.cjs.js CHANGED
@@ -3,8 +3,8 @@
3
3
  var common = require('@nestjs/common');
4
4
  var cmsBaseNestjsModule = require('@rytass/cms-base-nestjs-module');
5
5
  var graphql = require('@nestjs/graphql');
6
- var memberBaseNestjsModule = require('@rytass/member-base-nestjs-module');
7
6
  var graphql$1 = require('graphql');
7
+ var memberBaseNestjsModule = require('@rytass/member-base-nestjs-module');
8
8
  var DataLoader = require('dataloader');
9
9
  var lruCache = require('lru-cache');
10
10
  var typeorm = require('typeorm');
@@ -87,6 +87,49 @@ BackstageArticleDto = _ts_decorate$v([
87
87
  graphql.ObjectType('BackstageArticle')
88
88
  ], BackstageArticleDto);
89
89
 
90
+ const QuadratsContentScalar = new graphql$1.GraphQLScalarType({
91
+ name: 'QuadratsContent',
92
+ description: 'QuadratsContent custom scalar type (as JSON string)',
93
+ parseValue: (value)=>{
94
+ if (typeof value === 'string') {
95
+ let parsedValue;
96
+ try {
97
+ parsedValue = JSON.parse(value);
98
+ } catch (error) {
99
+ common.Logger.error(`Error parsing QuadratsContent (parseValue): ${error}`);
100
+ throw new common.InternalServerErrorException('Invalid QuadratsElement value');
101
+ }
102
+ if (!Array.isArray(parsedValue)) {
103
+ throw new common.BadRequestException('Expected a JSON string for QuadratsContent');
104
+ }
105
+ return parsedValue;
106
+ }
107
+ throw new common.BadRequestException('Expected a JSON string for QuadratsContent');
108
+ },
109
+ serialize: (value)=>{
110
+ if (typeof value === 'string') {
111
+ return value;
112
+ }
113
+ try {
114
+ return JSON.stringify(value);
115
+ } catch (error) {
116
+ common.Logger.error(`Error serializing QuadratsContent: ${error}`);
117
+ throw new common.InternalServerErrorException('Error serializing QuadratsElement');
118
+ }
119
+ },
120
+ parseLiteral: (ast)=>{
121
+ try {
122
+ if (ast.kind === graphql$1.Kind.STRING) {
123
+ return JSON.parse(ast.value);
124
+ }
125
+ } catch (error) {
126
+ common.Logger.error(`Error parsing QuadratsContent (parseLiteral): ${error}`);
127
+ throw new common.InternalServerErrorException('Invalid QuadratsElement value');
128
+ }
129
+ throw new Error('Expected string literal for QuadratsContent');
130
+ }
131
+ });
132
+
90
133
  function _ts_decorate$u(decorators, target, key, desc) {
91
134
  var c = arguments.length, r = c < 3 ? target : desc, d;
92
135
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -119,8 +162,8 @@ _ts_decorate$u([
119
162
  _ts_metadata$s("design:type", Object)
120
163
  ], ArticleVersionContentInput.prototype, "description", void 0);
121
164
  _ts_decorate$u([
122
- graphql.Field(()=>String),
123
- _ts_metadata$s("design:type", String)
165
+ graphql.Field(()=>QuadratsContentScalar),
166
+ _ts_metadata$s("design:type", Array)
124
167
  ], ArticleVersionContentInput.prototype, "content", void 0);
125
168
  ArticleVersionContentInput = _ts_decorate$u([
126
169
  graphql.InputType('ArticleVersionContentInput')
@@ -218,70 +261,89 @@ function _ts_param$8(paramIndex, decorator) {
218
261
  };
219
262
  }
220
263
  class ArticleMutations {
264
+ multiLanguage;
221
265
  articleService;
222
- constructor(articleService){
266
+ constructor(multiLanguage, articleService){
267
+ this.multiLanguage = multiLanguage;
223
268
  this.articleService = articleService;
224
269
  }
225
- async createArticle(memberId, args) {
226
- return this.articleService.create({
270
+ resolveCreateArticleArgs(args) {
271
+ const basePayload = {
227
272
  categoryIds: args.categoryIds,
228
273
  tags: args.tags,
229
- multiLanguageContents: args.multiLanguageContents.reduce((vars, content)=>({
230
- ...vars,
231
- [content.language ?? cmsBaseNestjsModule.DEFAULT_LANGUAGE]: {
232
- title: content.title,
233
- description: content.description,
234
- content: content.content
235
- }
236
- }), {}),
237
- userId: memberId,
238
274
  submitted: args.submitted ?? undefined,
239
275
  signatureLevel: args.signatureLevel ?? null,
240
276
  releasedAt: args.releasedAt ?? null
277
+ };
278
+ if (!this.multiLanguage) {
279
+ const [content] = args.multiLanguageContents;
280
+ return {
281
+ ...basePayload,
282
+ title: content.title,
283
+ content: content.content,
284
+ description: content.description ?? undefined
285
+ };
286
+ }
287
+ const multiLanguageContents = args.multiLanguageContents.reduce((vars, content)=>({
288
+ ...vars,
289
+ [content.language ?? cmsBaseNestjsModule.DEFAULT_LANGUAGE]: {
290
+ title: content.title,
291
+ description: content.description,
292
+ content: content.content
293
+ }
294
+ }), {});
295
+ return {
296
+ ...basePayload,
297
+ multiLanguageContents
298
+ };
299
+ }
300
+ async createArticle(memberId, args) {
301
+ return this.articleService.create({
302
+ ...this.resolveCreateArticleArgs(args),
303
+ userId: memberId
241
304
  });
242
305
  }
243
306
  async updateArticle(memberId, args) {
244
307
  return this.articleService.addVersion(args.id, {
245
- categoryIds: args.categoryIds,
246
- tags: args.tags,
247
- multiLanguageContents: args.multiLanguageContents.reduce((vars, content)=>({
248
- ...vars,
249
- [content.language ?? cmsBaseNestjsModule.DEFAULT_LANGUAGE]: {
250
- title: content.title,
251
- description: content.description,
252
- content: content.content
253
- }
254
- }), {}),
255
- userId: memberId,
256
- submitted: args.submitted ?? undefined,
257
- signatureLevel: args.signatureLevel ?? null,
258
- releasedAt: args.releasedAt ?? null
308
+ ...this.resolveCreateArticleArgs(args),
309
+ userId: memberId
259
310
  });
260
311
  }
261
312
  async deleteArticle(id) {
262
313
  await this.articleService.archive(id);
263
314
  return true;
264
315
  }
265
- async submitArticle(memberId, id, version) {
316
+ async deleteArticleVersion(id, version) {
317
+ await this.articleService.deleteVersion(id, version);
318
+ return true;
319
+ }
320
+ async submitArticle(memberId, id) {
266
321
  return this.articleService.submit(id, {
267
- version,
268
322
  userId: memberId
269
323
  });
270
324
  }
271
- async approveArticle(id) {
325
+ async putBackArticle(memberId, id) {
326
+ return this.articleService.putBack(id);
327
+ }
328
+ async approveArticle(id, version) {
272
329
  const article = await this.articleService.findById(id);
273
- return this.articleService.approveVersion(article);
330
+ return this.articleService.approveVersion({
331
+ id,
332
+ version: version ?? article.version
333
+ });
274
334
  }
275
335
  async rejectArticle(id, reason) {
276
- const article = await this.articleService.findById(id);
277
- return this.articleService.rejectVersion(article, {
336
+ return this.articleService.rejectVersion({
337
+ id
338
+ }, {
278
339
  reason
279
340
  });
280
341
  }
281
- releaseArticle(userId, id, releasedAt) {
342
+ releaseArticle(userId, id, releasedAt, version) {
282
343
  return this.articleService.release(id, {
283
344
  releasedAt,
284
- userId
345
+ userId,
346
+ version: version ?? undefined
285
347
  });
286
348
  }
287
349
  withdrawArticle(id) {
@@ -325,34 +387,65 @@ _ts_decorate$r([
325
387
  _ts_metadata$p("design:returntype", Promise)
326
388
  ], ArticleMutations.prototype, "deleteArticle", null);
327
389
  _ts_decorate$r([
328
- graphql.Mutation(()=>BackstageArticleDto),
390
+ graphql.Mutation(()=>Boolean),
329
391
  memberBaseNestjsModule.IsPublic(),
330
- _ts_param$8(0, memberBaseNestjsModule.MemberId()),
331
- _ts_param$8(1, graphql.Args('id', {
392
+ _ts_param$8(0, graphql.Args('id', {
332
393
  type: ()=>graphql.ID
333
394
  })),
334
- _ts_param$8(2, graphql.Args('version', {
395
+ _ts_param$8(1, graphql.Args('version', {
335
396
  type: ()=>graphql.Int
336
397
  })),
337
398
  _ts_metadata$p("design:type", Function),
338
399
  _ts_metadata$p("design:paramtypes", [
339
- String,
340
400
  String,
341
401
  Number
342
402
  ]),
343
403
  _ts_metadata$p("design:returntype", Promise)
404
+ ], ArticleMutations.prototype, "deleteArticleVersion", null);
405
+ _ts_decorate$r([
406
+ graphql.Mutation(()=>BackstageArticleDto),
407
+ memberBaseNestjsModule.IsPublic(),
408
+ _ts_param$8(0, memberBaseNestjsModule.MemberId()),
409
+ _ts_param$8(1, graphql.Args('id', {
410
+ type: ()=>graphql.ID
411
+ })),
412
+ _ts_metadata$p("design:type", Function),
413
+ _ts_metadata$p("design:paramtypes", [
414
+ String,
415
+ String
416
+ ]),
417
+ _ts_metadata$p("design:returntype", Promise)
344
418
  ], ArticleMutations.prototype, "submitArticle", null);
345
419
  _ts_decorate$r([
346
420
  graphql.Mutation(()=>BackstageArticleDto),
347
421
  memberBaseNestjsModule.IsPublic(),
348
- _ts_param$8(0, graphql.Args('id', {
422
+ _ts_param$8(0, memberBaseNestjsModule.MemberId()),
423
+ _ts_param$8(1, graphql.Args('id', {
349
424
  type: ()=>graphql.ID
350
425
  })),
351
426
  _ts_metadata$p("design:type", Function),
352
427
  _ts_metadata$p("design:paramtypes", [
428
+ String,
353
429
  String
354
430
  ]),
355
431
  _ts_metadata$p("design:returntype", Promise)
432
+ ], ArticleMutations.prototype, "putBackArticle", null);
433
+ _ts_decorate$r([
434
+ graphql.Mutation(()=>BackstageArticleDto),
435
+ memberBaseNestjsModule.IsPublic(),
436
+ _ts_param$8(0, graphql.Args('id', {
437
+ type: ()=>graphql.ID
438
+ })),
439
+ _ts_param$8(1, graphql.Args('version', {
440
+ type: ()=>graphql.Int,
441
+ nullable: true
442
+ })),
443
+ _ts_metadata$p("design:type", Function),
444
+ _ts_metadata$p("design:paramtypes", [
445
+ String,
446
+ Object
447
+ ]),
448
+ _ts_metadata$p("design:returntype", Promise)
356
449
  ], ArticleMutations.prototype, "approveArticle", null);
357
450
  _ts_decorate$r([
358
451
  graphql.Mutation(()=>BackstageArticleDto),
@@ -381,11 +474,16 @@ _ts_decorate$r([
381
474
  _ts_param$8(2, graphql.Args('releasedAt', {
382
475
  type: ()=>Date
383
476
  })),
477
+ _ts_param$8(3, graphql.Args('version', {
478
+ type: ()=>graphql.Int,
479
+ nullable: true
480
+ })),
384
481
  _ts_metadata$p("design:type", Function),
385
482
  _ts_metadata$p("design:paramtypes", [
386
483
  String,
387
484
  String,
388
- typeof Date === "undefined" ? Object : Date
485
+ typeof Date === "undefined" ? Object : Date,
486
+ Object
389
487
  ]),
390
488
  _ts_metadata$p("design:returntype", typeof Promise === "undefined" ? Object : Promise)
391
489
  ], ArticleMutations.prototype, "releaseArticle", null);
@@ -403,8 +501,10 @@ _ts_decorate$r([
403
501
  ], ArticleMutations.prototype, "withdrawArticle", null);
404
502
  ArticleMutations = _ts_decorate$r([
405
503
  graphql.Resolver(),
504
+ _ts_param$8(0, common.Inject(cmsBaseNestjsModule.MULTIPLE_LANGUAGE_MODE)),
406
505
  _ts_metadata$p("design:type", Function),
407
506
  _ts_metadata$p("design:paramtypes", [
507
+ Boolean,
408
508
  typeof cmsBaseNestjsModule.ArticleBaseService === "undefined" ? Object : cmsBaseNestjsModule.ArticleBaseService
409
509
  ])
410
510
  ], ArticleMutations);
@@ -714,46 +814,6 @@ Collection = _ts_decorate$j([
714
814
  graphql.ObjectType('Collection')
715
815
  ], Collection);
716
816
 
717
- const QuadratsContentScalar = new graphql$1.GraphQLScalarType({
718
- name: 'QuadratsContent',
719
- description: 'QuadratsContent custom scalar type (as JSON string)',
720
- parseValue: (value)=>{
721
- if (typeof value === 'string') {
722
- let parsedValue;
723
- try {
724
- parsedValue = JSON.parse(value);
725
- } catch (error) {
726
- common.Logger.error(`Error parsing QuadratsContent (parseValue): ${error}`);
727
- throw new common.InternalServerErrorException('Invalid QuadratsElement value');
728
- }
729
- if (!Array.isArray(parsedValue)) {
730
- throw new common.BadRequestException('Expected a JSON string for QuadratsContent');
731
- }
732
- return parsedValue;
733
- }
734
- throw new common.BadRequestException('Expected a JSON string for QuadratsContent');
735
- },
736
- serialize: (value)=>{
737
- try {
738
- return JSON.stringify(value);
739
- } catch (error) {
740
- common.Logger.error(`Error serializing QuadratsContent: ${error}`);
741
- throw new common.InternalServerErrorException('Error serializing QuadratsElement');
742
- }
743
- },
744
- parseLiteral: (ast)=>{
745
- try {
746
- if (ast.kind === graphql$1.Kind.STRING) {
747
- return JSON.parse(ast.value);
748
- }
749
- } catch (error) {
750
- common.Logger.error(`Error parsing QuadratsContent (parseLiteral): ${error}`);
751
- throw new common.InternalServerErrorException('Invalid QuadratsElement value');
752
- }
753
- throw new Error('Expected string literal for QuadratsContent');
754
- }
755
- });
756
-
757
817
  function _ts_decorate$i(decorators, target, key, desc) {
758
818
  var c = arguments.length, r = c < 3 ? target : desc, d;
759
819
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -1270,6 +1330,9 @@ class ArticleResolver {
1270
1330
  this.articleDataloader = articleDataloader;
1271
1331
  this.multiLanguage = multiLanguage;
1272
1332
  }
1333
+ articleId(article) {
1334
+ return article.id.split(':')[0];
1335
+ }
1273
1336
  releasedBy(article) {
1274
1337
  return article.releasedBy ? this.memberDataloader.loader.load(article.releasedBy) : null;
1275
1338
  }
@@ -1280,6 +1343,16 @@ class ArticleResolver {
1280
1343
  });
1281
1344
  }
1282
1345
  }
1346
+ _ts_decorate$7([
1347
+ graphql.ResolveField(()=>String),
1348
+ memberBaseNestjsModule.IsPublic(),
1349
+ _ts_param$2(0, graphql.Root()),
1350
+ _ts_metadata$6("design:type", Function),
1351
+ _ts_metadata$6("design:paramtypes", [
1352
+ typeof ArticleBaseDto === "undefined" ? Object : ArticleBaseDto
1353
+ ]),
1354
+ _ts_metadata$6("design:returntype", String)
1355
+ ], ArticleResolver.prototype, "articleId", null);
1283
1356
  _ts_decorate$7([
1284
1357
  graphql.ResolveField(()=>UserDto, {
1285
1358
  nullable: true
@@ -1478,6 +1551,12 @@ class BackstageArticleResolver {
1478
1551
  this.moduleArticleDataLoader = moduleArticleDataLoader;
1479
1552
  this.versionSignaturesLoader = versionSignaturesLoader;
1480
1553
  }
1554
+ id(article) {
1555
+ return `${article.id}:${article.version}`;
1556
+ }
1557
+ articleId(article) {
1558
+ return article.id;
1559
+ }
1481
1560
  submittedBy(article) {
1482
1561
  return article.submittedBy ? this.memberDataloader.loader.load(article.submittedBy) : null;
1483
1562
  }
@@ -1539,7 +1618,7 @@ class BackstageArticleResolver {
1539
1618
  version: article.version
1540
1619
  });
1541
1620
  }
1542
- async stageVersion(article) {
1621
+ async stageVersions(article) {
1543
1622
  const versions = await this.articleVersionDataLoader.stageVersionsLoader.load(article.id);
1544
1623
  return {
1545
1624
  id: article.id,
@@ -1551,6 +1630,26 @@ class BackstageArticleResolver {
1551
1630
  };
1552
1631
  }
1553
1632
  }
1633
+ _ts_decorate$3([
1634
+ graphql.ResolveField(()=>graphql.ID),
1635
+ memberBaseNestjsModule.IsPublic(),
1636
+ _ts_param$1(0, graphql.Root()),
1637
+ _ts_metadata$2("design:type", Function),
1638
+ _ts_metadata$2("design:paramtypes", [
1639
+ typeof ArticleBaseDto === "undefined" ? Object : ArticleBaseDto
1640
+ ]),
1641
+ _ts_metadata$2("design:returntype", String)
1642
+ ], BackstageArticleResolver.prototype, "id", null);
1643
+ _ts_decorate$3([
1644
+ graphql.ResolveField(()=>String),
1645
+ memberBaseNestjsModule.IsPublic(),
1646
+ _ts_param$1(0, graphql.Root()),
1647
+ _ts_metadata$2("design:type", Function),
1648
+ _ts_metadata$2("design:paramtypes", [
1649
+ typeof ArticleBaseDto === "undefined" ? Object : ArticleBaseDto
1650
+ ]),
1651
+ _ts_metadata$2("design:returntype", String)
1652
+ ], BackstageArticleResolver.prototype, "articleId", null);
1554
1653
  _ts_decorate$3([
1555
1654
  graphql.ResolveField(()=>UserDto, {
1556
1655
  nullable: true
@@ -1688,7 +1787,7 @@ _ts_decorate$3([
1688
1787
  typeof ArticleBaseDto === "undefined" ? Object : ArticleBaseDto
1689
1788
  ]),
1690
1789
  _ts_metadata$2("design:returntype", Promise)
1691
- ], BackstageArticleResolver.prototype, "stageVersion", null);
1790
+ ], BackstageArticleResolver.prototype, "stageVersions", null);
1692
1791
  BackstageArticleResolver = _ts_decorate$3([
1693
1792
  graphql.Resolver(()=>BackstageArticleDto),
1694
1793
  _ts_param$1(2, common.Inject(cmsBaseNestjsModule.MULTIPLE_LANGUAGE_MODE)),
@@ -3,14 +3,18 @@ import { BackstageArticleDto } from '../dto/backstage-article.dto';
3
3
  import { CreateArticleArgs } from '../dto/create-article.args';
4
4
  import { UpdateArticleArgs } from '../dto/update-article.args';
5
5
  export declare class ArticleMutations {
6
+ private readonly multiLanguage;
6
7
  private readonly articleService;
7
- constructor(articleService: ArticleBaseService);
8
+ constructor(multiLanguage: boolean, articleService: ArticleBaseService);
9
+ private resolveCreateArticleArgs;
8
10
  createArticle(memberId: string, args: CreateArticleArgs): Promise<BackstageArticleDto>;
9
11
  updateArticle(memberId: string, args: UpdateArticleArgs): Promise<BackstageArticleDto>;
10
12
  deleteArticle(id: string): Promise<boolean>;
11
- submitArticle(memberId: string, id: string, version: number): Promise<BackstageArticleDto>;
12
- approveArticle(id: string): Promise<BackstageArticleDto>;
13
+ deleteArticleVersion(id: string, version: number): Promise<boolean>;
14
+ submitArticle(memberId: string, id: string): Promise<BackstageArticleDto>;
15
+ putBackArticle(memberId: string, id: string): Promise<BackstageArticleDto>;
16
+ approveArticle(id: string, version?: number | null): Promise<BackstageArticleDto>;
13
17
  rejectArticle(id: string, reason?: string | null): Promise<BackstageArticleDto>;
14
- releaseArticle(userId: string, id: string, releasedAt: Date): Promise<BackstageArticleDto>;
18
+ releaseArticle(userId: string, id: string, releasedAt: Date, version?: number | null): Promise<BackstageArticleDto>;
15
19
  withdrawArticle(id: string): Promise<BackstageArticleDto>;
16
20
  }
@@ -1,9 +1,10 @@
1
- import { ArticleBaseService, DEFAULT_LANGUAGE } from '@rytass/cms-base-nestjs-module';
1
+ import { MULTIPLE_LANGUAGE_MODE, ArticleBaseService, DEFAULT_LANGUAGE } from '@rytass/cms-base-nestjs-module';
2
2
  import { Mutation, Args, ID, Int, Resolver } from '@nestjs/graphql';
3
3
  import { BackstageArticleDto } from '../dto/backstage-article.dto.js';
4
4
  import { CreateArticleArgs } from '../dto/create-article.args.js';
5
5
  import { IsPublic, MemberId } from '@rytass/member-base-nestjs-module';
6
6
  import { UpdateArticleArgs } from '../dto/update-article.args.js';
7
+ import { Inject } from '@nestjs/common';
7
8
 
8
9
  function _ts_decorate(decorators, target, key, desc) {
9
10
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -20,70 +21,89 @@ function _ts_param(paramIndex, decorator) {
20
21
  };
21
22
  }
22
23
  class ArticleMutations {
24
+ multiLanguage;
23
25
  articleService;
24
- constructor(articleService){
26
+ constructor(multiLanguage, articleService){
27
+ this.multiLanguage = multiLanguage;
25
28
  this.articleService = articleService;
26
29
  }
27
- async createArticle(memberId, args) {
28
- return this.articleService.create({
30
+ resolveCreateArticleArgs(args) {
31
+ const basePayload = {
29
32
  categoryIds: args.categoryIds,
30
33
  tags: args.tags,
31
- multiLanguageContents: args.multiLanguageContents.reduce((vars, content)=>({
32
- ...vars,
33
- [content.language ?? DEFAULT_LANGUAGE]: {
34
- title: content.title,
35
- description: content.description,
36
- content: content.content
37
- }
38
- }), {}),
39
- userId: memberId,
40
34
  submitted: args.submitted ?? undefined,
41
35
  signatureLevel: args.signatureLevel ?? null,
42
36
  releasedAt: args.releasedAt ?? null
37
+ };
38
+ if (!this.multiLanguage) {
39
+ const [content] = args.multiLanguageContents;
40
+ return {
41
+ ...basePayload,
42
+ title: content.title,
43
+ content: content.content,
44
+ description: content.description ?? undefined
45
+ };
46
+ }
47
+ const multiLanguageContents = args.multiLanguageContents.reduce((vars, content)=>({
48
+ ...vars,
49
+ [content.language ?? DEFAULT_LANGUAGE]: {
50
+ title: content.title,
51
+ description: content.description,
52
+ content: content.content
53
+ }
54
+ }), {});
55
+ return {
56
+ ...basePayload,
57
+ multiLanguageContents
58
+ };
59
+ }
60
+ async createArticle(memberId, args) {
61
+ return this.articleService.create({
62
+ ...this.resolveCreateArticleArgs(args),
63
+ userId: memberId
43
64
  });
44
65
  }
45
66
  async updateArticle(memberId, args) {
46
67
  return this.articleService.addVersion(args.id, {
47
- categoryIds: args.categoryIds,
48
- tags: args.tags,
49
- multiLanguageContents: args.multiLanguageContents.reduce((vars, content)=>({
50
- ...vars,
51
- [content.language ?? DEFAULT_LANGUAGE]: {
52
- title: content.title,
53
- description: content.description,
54
- content: content.content
55
- }
56
- }), {}),
57
- userId: memberId,
58
- submitted: args.submitted ?? undefined,
59
- signatureLevel: args.signatureLevel ?? null,
60
- releasedAt: args.releasedAt ?? null
68
+ ...this.resolveCreateArticleArgs(args),
69
+ userId: memberId
61
70
  });
62
71
  }
63
72
  async deleteArticle(id) {
64
73
  await this.articleService.archive(id);
65
74
  return true;
66
75
  }
67
- async submitArticle(memberId, id, version) {
76
+ async deleteArticleVersion(id, version) {
77
+ await this.articleService.deleteVersion(id, version);
78
+ return true;
79
+ }
80
+ async submitArticle(memberId, id) {
68
81
  return this.articleService.submit(id, {
69
- version,
70
82
  userId: memberId
71
83
  });
72
84
  }
73
- async approveArticle(id) {
85
+ async putBackArticle(memberId, id) {
86
+ return this.articleService.putBack(id);
87
+ }
88
+ async approveArticle(id, version) {
74
89
  const article = await this.articleService.findById(id);
75
- return this.articleService.approveVersion(article);
90
+ return this.articleService.approveVersion({
91
+ id,
92
+ version: version ?? article.version
93
+ });
76
94
  }
77
95
  async rejectArticle(id, reason) {
78
- const article = await this.articleService.findById(id);
79
- return this.articleService.rejectVersion(article, {
96
+ return this.articleService.rejectVersion({
97
+ id
98
+ }, {
80
99
  reason
81
100
  });
82
101
  }
83
- releaseArticle(userId, id, releasedAt) {
102
+ releaseArticle(userId, id, releasedAt, version) {
84
103
  return this.articleService.release(id, {
85
104
  releasedAt,
86
- userId
105
+ userId,
106
+ version: version ?? undefined
87
107
  });
88
108
  }
89
109
  withdrawArticle(id) {
@@ -127,34 +147,65 @@ _ts_decorate([
127
147
  _ts_metadata("design:returntype", Promise)
128
148
  ], ArticleMutations.prototype, "deleteArticle", null);
129
149
  _ts_decorate([
130
- Mutation(()=>BackstageArticleDto),
150
+ Mutation(()=>Boolean),
131
151
  IsPublic(),
132
- _ts_param(0, MemberId()),
133
- _ts_param(1, Args('id', {
152
+ _ts_param(0, Args('id', {
134
153
  type: ()=>ID
135
154
  })),
136
- _ts_param(2, Args('version', {
155
+ _ts_param(1, Args('version', {
137
156
  type: ()=>Int
138
157
  })),
139
158
  _ts_metadata("design:type", Function),
140
159
  _ts_metadata("design:paramtypes", [
141
- String,
142
160
  String,
143
161
  Number
144
162
  ]),
145
163
  _ts_metadata("design:returntype", Promise)
164
+ ], ArticleMutations.prototype, "deleteArticleVersion", null);
165
+ _ts_decorate([
166
+ Mutation(()=>BackstageArticleDto),
167
+ IsPublic(),
168
+ _ts_param(0, MemberId()),
169
+ _ts_param(1, Args('id', {
170
+ type: ()=>ID
171
+ })),
172
+ _ts_metadata("design:type", Function),
173
+ _ts_metadata("design:paramtypes", [
174
+ String,
175
+ String
176
+ ]),
177
+ _ts_metadata("design:returntype", Promise)
146
178
  ], ArticleMutations.prototype, "submitArticle", null);
147
179
  _ts_decorate([
148
180
  Mutation(()=>BackstageArticleDto),
149
181
  IsPublic(),
150
- _ts_param(0, Args('id', {
182
+ _ts_param(0, MemberId()),
183
+ _ts_param(1, Args('id', {
151
184
  type: ()=>ID
152
185
  })),
153
186
  _ts_metadata("design:type", Function),
154
187
  _ts_metadata("design:paramtypes", [
188
+ String,
155
189
  String
156
190
  ]),
157
191
  _ts_metadata("design:returntype", Promise)
192
+ ], ArticleMutations.prototype, "putBackArticle", null);
193
+ _ts_decorate([
194
+ Mutation(()=>BackstageArticleDto),
195
+ IsPublic(),
196
+ _ts_param(0, Args('id', {
197
+ type: ()=>ID
198
+ })),
199
+ _ts_param(1, Args('version', {
200
+ type: ()=>Int,
201
+ nullable: true
202
+ })),
203
+ _ts_metadata("design:type", Function),
204
+ _ts_metadata("design:paramtypes", [
205
+ String,
206
+ Object
207
+ ]),
208
+ _ts_metadata("design:returntype", Promise)
158
209
  ], ArticleMutations.prototype, "approveArticle", null);
159
210
  _ts_decorate([
160
211
  Mutation(()=>BackstageArticleDto),
@@ -183,11 +234,16 @@ _ts_decorate([
183
234
  _ts_param(2, Args('releasedAt', {
184
235
  type: ()=>Date
185
236
  })),
237
+ _ts_param(3, Args('version', {
238
+ type: ()=>Int,
239
+ nullable: true
240
+ })),
186
241
  _ts_metadata("design:type", Function),
187
242
  _ts_metadata("design:paramtypes", [
188
243
  String,
189
244
  String,
190
- typeof Date === "undefined" ? Object : Date
245
+ typeof Date === "undefined" ? Object : Date,
246
+ Object
191
247
  ]),
192
248
  _ts_metadata("design:returntype", typeof Promise === "undefined" ? Object : Promise)
193
249
  ], ArticleMutations.prototype, "releaseArticle", null);
@@ -205,8 +261,10 @@ _ts_decorate([
205
261
  ], ArticleMutations.prototype, "withdrawArticle", null);
206
262
  ArticleMutations = _ts_decorate([
207
263
  Resolver(),
264
+ _ts_param(0, Inject(MULTIPLE_LANGUAGE_MODE)),
208
265
  _ts_metadata("design:type", Function),
209
266
  _ts_metadata("design:paramtypes", [
267
+ Boolean,
210
268
  typeof ArticleBaseService === "undefined" ? Object : ArticleBaseService
211
269
  ])
212
270
  ], ArticleMutations);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rytass/cms-base-nestjs-graphql-module",
3
- "version": "0.0.19",
3
+ "version": "0.0.21",
4
4
  "description": "Rytass Content Management System NestJS Base GraphQL Module",
5
5
  "keywords": [
6
6
  "rytass",
@@ -26,7 +26,7 @@
26
26
  "typeorm": "*"
27
27
  },
28
28
  "dependencies": {
29
- "@rytass/cms-base-nestjs-module": "^0.1.91",
29
+ "@rytass/cms-base-nestjs-module": "^0.1.92",
30
30
  "@rytass/member-base-nestjs-module": "^0.1.65",
31
31
  "dataloader": "^2.2.2",
32
32
  "lru-cache": "^11.0.2"
@@ -8,6 +8,7 @@ export declare class ArticleResolver {
8
8
  private readonly articleDataloader;
9
9
  private readonly multiLanguage;
10
10
  constructor(memberDataloader: MemberDataLoader, articleDataloader: ArticleDataLoader, multiLanguage: boolean);
11
+ articleId(article: ArticleBaseDto): string;
11
12
  releasedBy(article: ArticleBaseDto): Promise<UserDto | null> | null;
12
13
  categories(article: ArticleBaseDto, language?: string): Promise<CategoryDto[]>;
13
14
  }
@@ -32,6 +32,9 @@ class ArticleResolver {
32
32
  this.articleDataloader = articleDataloader;
33
33
  this.multiLanguage = multiLanguage;
34
34
  }
35
+ articleId(article) {
36
+ return article.id.split(':')[0];
37
+ }
35
38
  releasedBy(article) {
36
39
  return article.releasedBy ? this.memberDataloader.loader.load(article.releasedBy) : null;
37
40
  }
@@ -42,6 +45,16 @@ class ArticleResolver {
42
45
  });
43
46
  }
44
47
  }
48
+ _ts_decorate([
49
+ ResolveField(()=>String),
50
+ IsPublic(),
51
+ _ts_param(0, Root()),
52
+ _ts_metadata("design:type", Function),
53
+ _ts_metadata("design:paramtypes", [
54
+ typeof ArticleBaseDto === "undefined" ? Object : ArticleBaseDto
55
+ ]),
56
+ _ts_metadata("design:returntype", String)
57
+ ], ArticleResolver.prototype, "articleId", null);
45
58
  _ts_decorate([
46
59
  ResolveField(()=>UserDto, {
47
60
  nullable: true
@@ -16,6 +16,8 @@ export declare class BackstageArticleResolver {
16
16
  private readonly moduleArticleDataLoader;
17
17
  private readonly versionSignaturesLoader;
18
18
  constructor(memberDataloader: MemberDataLoader, articleDataloader: ArticleDataLoader, multiLanguage: boolean, articleVersionDataLoader: ArticleVersionDataLoader, moduleArticleDataLoader: ModuleArticleDataLoader, versionSignaturesLoader: ArticleSignatureDataLoader);
19
+ id(article: ArticleBaseDto): string;
20
+ articleId(article: ArticleBaseDto): string;
19
21
  submittedBy(article: ArticleBaseDto): Promise<UserDto | null> | null;
20
22
  lastEditor(article: ArticleBaseDto): Promise<UserDto | null> | null;
21
23
  releasedBy(article: ArticleBaseDto): Promise<UserDto | null> | null;
@@ -27,5 +29,5 @@ export declare class BackstageArticleResolver {
27
29
  versions(article: ArticleBaseDto): Promise<BackstageArticleDto[]>;
28
30
  stage(article: ArticleBaseDto): Promise<ArticleStage>;
29
31
  signatures(article: ArticleBaseDto): Promise<ArticleSignatureDto[]>;
30
- stageVersion(article: ArticleBaseDto): Promise<ArticleStageVersionDto>;
32
+ stageVersions(article: ArticleBaseDto): Promise<ArticleStageVersionDto>;
31
33
  }
@@ -1,4 +1,4 @@
1
- import { ResolveField, Root, Resolver } from '@nestjs/graphql';
1
+ import { ResolveField, ID, Root, Resolver } from '@nestjs/graphql';
2
2
  import { MemberDataLoader } from '../data-loaders/members.dataloader.js';
3
3
  import { UserDto } from '../dto/user.dto.js';
4
4
  import { IsPublic } from '@rytass/member-base-nestjs-module';
@@ -42,6 +42,12 @@ class BackstageArticleResolver {
42
42
  this.moduleArticleDataLoader = moduleArticleDataLoader;
43
43
  this.versionSignaturesLoader = versionSignaturesLoader;
44
44
  }
45
+ id(article) {
46
+ return `${article.id}:${article.version}`;
47
+ }
48
+ articleId(article) {
49
+ return article.id;
50
+ }
45
51
  submittedBy(article) {
46
52
  return article.submittedBy ? this.memberDataloader.loader.load(article.submittedBy) : null;
47
53
  }
@@ -103,7 +109,7 @@ class BackstageArticleResolver {
103
109
  version: article.version
104
110
  });
105
111
  }
106
- async stageVersion(article) {
112
+ async stageVersions(article) {
107
113
  const versions = await this.articleVersionDataLoader.stageVersionsLoader.load(article.id);
108
114
  return {
109
115
  id: article.id,
@@ -115,6 +121,26 @@ class BackstageArticleResolver {
115
121
  };
116
122
  }
117
123
  }
124
+ _ts_decorate([
125
+ ResolveField(()=>ID),
126
+ IsPublic(),
127
+ _ts_param(0, Root()),
128
+ _ts_metadata("design:type", Function),
129
+ _ts_metadata("design:paramtypes", [
130
+ typeof ArticleBaseDto === "undefined" ? Object : ArticleBaseDto
131
+ ]),
132
+ _ts_metadata("design:returntype", String)
133
+ ], BackstageArticleResolver.prototype, "id", null);
134
+ _ts_decorate([
135
+ ResolveField(()=>String),
136
+ IsPublic(),
137
+ _ts_param(0, Root()),
138
+ _ts_metadata("design:type", Function),
139
+ _ts_metadata("design:paramtypes", [
140
+ typeof ArticleBaseDto === "undefined" ? Object : ArticleBaseDto
141
+ ]),
142
+ _ts_metadata("design:returntype", String)
143
+ ], BackstageArticleResolver.prototype, "articleId", null);
118
144
  _ts_decorate([
119
145
  ResolveField(()=>UserDto, {
120
146
  nullable: true
@@ -252,7 +278,7 @@ _ts_decorate([
252
278
  typeof ArticleBaseDto === "undefined" ? Object : ArticleBaseDto
253
279
  ]),
254
280
  _ts_metadata("design:returntype", Promise)
255
- ], BackstageArticleResolver.prototype, "stageVersion", null);
281
+ ], BackstageArticleResolver.prototype, "stageVersions", null);
256
282
  BackstageArticleResolver = _ts_decorate([
257
283
  Resolver(()=>BackstageArticleDto),
258
284
  _ts_param(2, Inject(MULTIPLE_LANGUAGE_MODE)),
@@ -21,6 +21,9 @@ const QuadratsContentScalar = new GraphQLScalarType({
21
21
  throw new BadRequestException('Expected a JSON string for QuadratsContent');
22
22
  },
23
23
  serialize: (value)=>{
24
+ if (typeof value === 'string') {
25
+ return value;
26
+ }
24
27
  try {
25
28
  return JSON.stringify(value);
26
29
  } catch (error) {