@rytass/cms-base-nestjs-graphql-module 0.0.8 → 0.0.9

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.
@@ -4,6 +4,9 @@ import { ArticleMutations } from './mutations/article.mutations.js';
4
4
  import { CategoryMutations } from './mutations/category.mutations.js';
5
5
  import { ArticleQueries } from './queries/article.queries.js';
6
6
  import { CategoryQueries } from './queries/category.queries.js';
7
+ import { MemberDataLoader } from './dataloaders/members.dataloader.js';
8
+ import { ArticleDataLoader } from './dataloaders/article.dataloader.js';
9
+ import { ArticleResolver } from './resolvers/article.resolver.js';
7
10
 
8
11
  function _ts_decorate(decorators, target, key, desc) {
9
12
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -23,6 +26,9 @@ class CMSBaseGraphQLModule {
23
26
  CMSBaseModule
24
27
  ],
25
28
  providers: [
29
+ MemberDataLoader,
30
+ ArticleDataLoader,
31
+ ArticleResolver,
26
32
  ArticleQueries,
27
33
  ArticleMutations,
28
34
  CategoryQueries,
@@ -40,6 +46,9 @@ class CMSBaseGraphQLModule {
40
46
  CMSBaseModule
41
47
  ],
42
48
  providers: [
49
+ MemberDataLoader,
50
+ ArticleDataLoader,
51
+ ArticleResolver,
43
52
  ArticleQueries,
44
53
  ArticleMutations,
45
54
  CategoryQueries,
@@ -1,13 +1,12 @@
1
1
  import DataLoader from 'dataloader';
2
- import { DataSource } from 'typeorm';
3
- import { BaseArticleEntity, BaseArticleVersionEntity, ArticleSignatureEntity } from '@rytass/cms-base-nestjs-module';
2
+ import { Repository } from 'typeorm';
3
+ import { BaseArticleEntity } from '@rytass/cms-base-nestjs-module';
4
+ import { CategoryDto } from '../dto/category.dto';
4
5
  export declare class ArticleDataLoader {
5
- private readonly dataSource;
6
- constructor(dataSource: DataSource);
7
- readonly articleLoader: DataLoader<string, BaseArticleEntity | null, string>;
8
- readonly versionLoader: DataLoader<{
9
- id: string;
10
- version: number;
11
- }, BaseArticleVersionEntity | null, string>;
12
- readonly signatureLoader: DataLoader<string, ArticleSignatureEntity[], string>;
6
+ private readonly articleRepo;
7
+ constructor(articleRepo: Repository<BaseArticleEntity>);
8
+ readonly categoriesLoader: DataLoader<{
9
+ articleId: string;
10
+ language?: string;
11
+ }, CategoryDto[], string>;
13
12
  }
@@ -0,0 +1,65 @@
1
+ import { Injectable, Inject } from '@nestjs/common';
2
+ import DataLoader from 'dataloader';
3
+ import { Repository } from 'typeorm';
4
+ import { LRUCache } from 'lru-cache';
5
+ import { RESOLVED_ARTICLE_REPO, DEFAULT_LANGUAGE } from '@rytass/cms-base-nestjs-module';
6
+
7
+ function _ts_decorate(decorators, target, key, desc) {
8
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
10
+ 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;
11
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
12
+ }
13
+ function _ts_metadata(k, v) {
14
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
15
+ }
16
+ function _ts_param(paramIndex, decorator) {
17
+ return function(target, key) {
18
+ decorator(target, key, paramIndex);
19
+ };
20
+ }
21
+ class ArticleDataLoader {
22
+ articleRepo;
23
+ constructor(articleRepo){
24
+ this.articleRepo = articleRepo;
25
+ this.categoriesLoader = new DataLoader(async (queryArgs)=>{
26
+ const qb = this.articleRepo.createQueryBuilder('articles');
27
+ qb.leftJoinAndSelect('articles.categories', 'categories');
28
+ qb.leftJoinAndSelect('categories.multiLanguageNames', 'multiLanguageNames');
29
+ qb.andWhere('articles.id IN (:...ids)', {
30
+ ids: queryArgs.map((arg)=>arg.articleId)
31
+ });
32
+ const articles = await qb.getMany();
33
+ const categoryMap = articles.reduce((vars, article)=>article.categories.reduce((cVars, category)=>category.multiLanguageNames.reduce((mVars, multiLanguageName)=>({
34
+ ...mVars,
35
+ [`${article.id}:${multiLanguageName.language}`]: [
36
+ ...mVars[`${article.id}:${multiLanguageName.language}`] || [],
37
+ {
38
+ ...category,
39
+ ...multiLanguageName
40
+ }
41
+ ]
42
+ }), cVars), vars), {});
43
+ return queryArgs.map((arg)=>categoryMap[`${arg.articleId}:${arg.language ?? DEFAULT_LANGUAGE}`] ?? []);
44
+ }, {
45
+ cache: true,
46
+ cacheMap: new LRUCache({
47
+ ttl: 1000 * 60,
48
+ ttlAutopurge: true,
49
+ max: 1000
50
+ }),
51
+ cacheKeyFn: (queryArgs)=>`${queryArgs.articleId}:${queryArgs.language ?? DEFAULT_LANGUAGE}`
52
+ });
53
+ }
54
+ categoriesLoader;
55
+ }
56
+ ArticleDataLoader = _ts_decorate([
57
+ Injectable(),
58
+ _ts_param(0, Inject(RESOLVED_ARTICLE_REPO)),
59
+ _ts_metadata("design:type", Function),
60
+ _ts_metadata("design:paramtypes", [
61
+ typeof Repository === "undefined" ? Object : Repository
62
+ ])
63
+ ], ArticleDataLoader);
64
+
65
+ export { ArticleDataLoader };
@@ -1,8 +1,8 @@
1
1
  import { BaseMemberEntity } from '@rytass/member-base-nestjs-module';
2
2
  import DataLoader from 'dataloader';
3
- import { DataSource } from 'typeorm';
3
+ import { Repository } from 'typeorm';
4
4
  export declare class MemberDataLoader {
5
- private readonly dataSource;
6
- constructor(dataSource: DataSource);
5
+ private readonly memberRepo;
6
+ constructor(memberRepo: Repository<BaseMemberEntity>);
7
7
  readonly loader: DataLoader<string, BaseMemberEntity | null, string>;
8
8
  }
@@ -0,0 +1,57 @@
1
+ import { Injectable, Inject } from '@nestjs/common';
2
+ import { RESOLVED_MEMBER_REPO } from '@rytass/member-base-nestjs-module';
3
+ import DataLoader from 'dataloader';
4
+ import { LRUCache } from 'lru-cache';
5
+ import { Repository } from 'typeorm';
6
+
7
+ function _ts_decorate(decorators, target, key, desc) {
8
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
10
+ 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;
11
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
12
+ }
13
+ function _ts_metadata(k, v) {
14
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
15
+ }
16
+ function _ts_param(paramIndex, decorator) {
17
+ return function(target, key) {
18
+ decorator(target, key, paramIndex);
19
+ };
20
+ }
21
+ class MemberDataLoader {
22
+ memberRepo;
23
+ constructor(memberRepo){
24
+ this.memberRepo = memberRepo;
25
+ this.loader = new DataLoader(async (ids)=>{
26
+ const qb = this.memberRepo.createQueryBuilder('members');
27
+ qb.withDeleted();
28
+ qb.andWhere('members.id IN (:...ids)', {
29
+ ids
30
+ });
31
+ const users = await qb.getMany();
32
+ const userMap = new Map(users.map((user)=>[
33
+ user.id,
34
+ user
35
+ ]));
36
+ return ids.map((id)=>userMap.get(id) ?? null);
37
+ }, {
38
+ cache: true,
39
+ cacheMap: new LRUCache({
40
+ ttl: 1000 * 60 * 10,
41
+ ttlAutopurge: true,
42
+ max: 1000
43
+ })
44
+ });
45
+ }
46
+ loader;
47
+ }
48
+ MemberDataLoader = _ts_decorate([
49
+ Injectable(),
50
+ _ts_param(0, Inject(RESOLVED_MEMBER_REPO)),
51
+ _ts_metadata("design:type", Function),
52
+ _ts_metadata("design:paramtypes", [
53
+ typeof Repository === "undefined" ? Object : Repository
54
+ ])
55
+ ], MemberDataLoader);
56
+
57
+ export { MemberDataLoader };
@@ -2,4 +2,6 @@ export declare class BaseArticleDto {
2
2
  id: string;
3
3
  tags: string[];
4
4
  createdAt: Date;
5
+ updatedAt: Date;
6
+ releasedAt: Date | null;
5
7
  }
@@ -13,6 +13,8 @@ class BaseArticleDto {
13
13
  id;
14
14
  tags;
15
15
  createdAt;
16
+ updatedAt;
17
+ releasedAt;
16
18
  }
17
19
  _ts_decorate([
18
20
  Field(()=>ID),
@@ -28,6 +30,16 @@ _ts_decorate([
28
30
  Field(()=>Date),
29
31
  _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
30
32
  ], BaseArticleDto.prototype, "createdAt", void 0);
33
+ _ts_decorate([
34
+ Field(()=>Date),
35
+ _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
36
+ ], BaseArticleDto.prototype, "updatedAt", void 0);
37
+ _ts_decorate([
38
+ Field(()=>Date, {
39
+ nullable: true
40
+ }),
41
+ _ts_metadata("design:type", Object)
42
+ ], BaseArticleDto.prototype, "releasedAt", void 0);
31
43
  BaseArticleDto = _ts_decorate([
32
44
  ObjectType('BaseArticle')
33
45
  ], BaseArticleDto);
package/dto/user.dto.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export declare class UserDto {
2
2
  id: string;
3
- name: string;
3
+ account: string;
4
4
  }
@@ -0,0 +1,28 @@
1
+ import { Field, ID, ObjectType } from '@nestjs/graphql';
2
+
3
+ function _ts_decorate(decorators, target, key, desc) {
4
+ var c = arguments.length, r = c < 3 ? target : desc, d;
5
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
6
+ 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;
7
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
8
+ }
9
+ function _ts_metadata(k, v) {
10
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
11
+ }
12
+ class UserDto {
13
+ id;
14
+ account;
15
+ }
16
+ _ts_decorate([
17
+ Field(()=>ID),
18
+ _ts_metadata("design:type", String)
19
+ ], UserDto.prototype, "id", void 0);
20
+ _ts_decorate([
21
+ Field(()=>String),
22
+ _ts_metadata("design:type", String)
23
+ ], UserDto.prototype, "account", void 0);
24
+ UserDto = _ts_decorate([
25
+ ObjectType('User')
26
+ ], UserDto);
27
+
28
+ export { UserDto };