@things-factory/board-service 10.1.41 → 10.1.42

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.
@@ -31,12 +31,25 @@ let BoardFavoriteQuery = class BoardFavoriteQuery {
31
31
  'Board.name as name',
32
32
  'Board.description as description',
33
33
  'Board.thumbnail as thumbnail',
34
- 'Favorite.id as favoriteId'
34
+ /* What a board card says about itself - the draft badge and the "v3 · 2 days ago" line
35
+ * read these, and the Favorite view drew every board as a dateless draft without them. */
36
+ 'Board.type as type',
37
+ 'Board.state as state',
38
+ 'Board.version as version',
39
+ 'Board.createdAt as "createdAt"',
40
+ 'Board.updatedAt as "updatedAt"',
41
+ 'Favorite.id as "favoriteId"'
35
42
  ])
36
43
  .andWhere('Favorite.user = :userId', {
37
44
  userId: user.id
38
45
  });
39
- const items = await qb.getRawMany();
46
+ /* Raw rows skip the entity transformers, so dates arrive as the driver's strings and the
47
+ * DateTime scalar refuses them. Hydrate them the way the entity would (UTC when untagged). */
48
+ const items = (await qb.getRawMany()).map(item => ({
49
+ ...item,
50
+ createdAt: toDate(item.createdAt),
51
+ updatedAt: toDate(item.updatedAt)
52
+ }));
40
53
  const total = await qb.getCount();
41
54
  return { items, total };
42
55
  }
@@ -53,4 +66,14 @@ tslib_1.__decorate([
53
66
  exports.BoardFavoriteQuery = BoardFavoriteQuery = tslib_1.__decorate([
54
67
  (0, type_graphql_1.Resolver)(board_favorite_type_js_1.BoardFavorite)
55
68
  ], BoardFavoriteQuery);
69
+ function toDate(value) {
70
+ if (!value)
71
+ return null;
72
+ if (value instanceof Date)
73
+ return value;
74
+ const text = String(value);
75
+ const tagged = /(Z|[+-]\d{2}:?\d{2})$/.test(text);
76
+ const date = new Date(tagged ? text : text.replace(' ', 'T') + 'Z');
77
+ return Number.isNaN(date.getTime()) ? null : date;
78
+ }
56
79
  //# sourceMappingURL=board-favorite-query.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"board-favorite-query.js","sourceRoot":"","sources":["../../../server/service/board-favorite/board-favorite-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAyD;AAEzD,6CAA4C;AAC5C,uDAAmD;AACnD,iDAA4E;AAE5E,gDAAyC;AACzC,qEAA2E;AAE3E,MAAM,SAAS,GAAG,YAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;AAC7C,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAA;AAG7B,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAEvB,AAAN,KAAK,CAAC,cAAc,CACO,MAAiB,EACnC,OAAwB;QAE/B,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE9B,MAAM,YAAY,GAAG,IAAA,qBAAa,EAAC,gBAAK,CAAC,CAAC,kBAAkB,EAAE,CAAA;QAC9D,IAAA,kBAAU,EAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAEzC,IAAI,aAAa,GAAG,EAAE,CAAA;QACtB,QAAQ,aAAa,EAAE,CAAC;YACtB,KAAK,UAAU;gBACb,aAAa,GAAG,8CAA8C,CAAA;gBAC9D,MAAK;YACP,KAAK,QAAQ,CAAC;YACd;gBACE,aAAa,GAAG,6BAA6B,CAAA;QACjD,CAAC;QAED,IAAI,EAAE,GAAG,YAAY;aAClB,SAAS,CAAC,mBAAQ,EAAE,UAAU,EAAE,aAAa,CAAC;aAC9C,MAAM,CAAC;YACN,gBAAgB;YAChB,oBAAoB;YACpB,kCAAkC;YAClC,8BAA8B;YAC9B,2BAA2B;SAC5B,CAAC;aACD,QAAQ,CAAC,yBAAyB,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,EAAE;SAChB,CAAC,CAAA;QAEJ,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,UAAU,EAAE,CAAA;QACnC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAA;QAEjC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;CACF,CAAA;AAvCY,gDAAkB;AAEvB;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,0CAAiB,EAAE,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC;IAEtF,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IACvB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAD2B,iBAAS;;wDAmC3C;6BAtCU,kBAAkB;IAD9B,IAAA,uBAAQ,EAAC,sCAAa,CAAC;GACX,kBAAkB,CAuC9B","sourcesContent":["import { Args, Ctx, Query, Resolver } from 'type-graphql'\n\nimport { config } from '@things-factory/env'\nimport { Favorite } from '@things-factory/fav-base'\nimport { buildQuery, getRepository, ListParam } from '@things-factory/shell'\n\nimport { Board } from '../board/board.js'\nimport { BoardFavorite, BoardFavoriteList } from './board-favorite-type.js'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\n@Resolver(BoardFavorite)\nexport class BoardFavoriteQuery {\n @Query(returns => BoardFavoriteList, { description: 'To fetch multiple BoardFavorites' })\n async favoriteBoards(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<BoardFavoriteList> {\n const { user } = context.state\n\n const queryBuilder = getRepository(Board).createQueryBuilder()\n buildQuery(queryBuilder, params, context)\n\n var joinStatement = ''\n switch (DATABASE_TYPE) {\n case 'postgres':\n joinStatement = 'CAST(Board.id as VARCHAR) = Favorite.routing'\n break\n case 'sqlite':\n default:\n joinStatement = 'Board.id = Favorite.routing'\n }\n\n var qb = queryBuilder\n .innerJoin(Favorite, 'Favorite', joinStatement)\n .select([\n 'Board.id as id',\n 'Board.name as name',\n 'Board.description as description',\n 'Board.thumbnail as thumbnail',\n 'Favorite.id as favoriteId'\n ])\n .andWhere('Favorite.user = :userId', {\n userId: user.id\n })\n\n const items = await qb.getRawMany()\n const total = await qb.getCount()\n\n return { items, total }\n }\n}\n"]}
1
+ {"version":3,"file":"board-favorite-query.js","sourceRoot":"","sources":["../../../server/service/board-favorite/board-favorite-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Args, Ctx, Query, Resolver } from 'type-graphql'\n\nimport { config } from '@things-factory/env'\nimport { Favorite } from '@things-factory/fav-base'\nimport { buildQuery, getRepository, ListParam } from '@things-factory/shell'\n\nimport { Board } from '../board/board.js'\nimport { BoardFavorite, BoardFavoriteList } from './board-favorite-type.js'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\n@Resolver(BoardFavorite)\nexport class BoardFavoriteQuery {\n @Query(returns => BoardFavoriteList, { description: 'To fetch multiple BoardFavorites' })\n async favoriteBoards(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<BoardFavoriteList> {\n const { user } = context.state\n\n const queryBuilder = getRepository(Board).createQueryBuilder()\n buildQuery(queryBuilder, params, context)\n\n var joinStatement = ''\n switch (DATABASE_TYPE) {\n case 'postgres':\n joinStatement = 'CAST(Board.id as VARCHAR) = Favorite.routing'\n break\n case 'sqlite':\n default:\n joinStatement = 'Board.id = Favorite.routing'\n }\n\n var qb = queryBuilder\n .innerJoin(Favorite, 'Favorite', joinStatement)\n .select([\n 'Board.id as id',\n 'Board.name as name',\n 'Board.description as description',\n 'Board.thumbnail as thumbnail',\n /* What a board card says about itself - the draft badge and the \"v3 · 2 days ago\" line\n * read these, and the Favorite view drew every board as a dateless draft without them. */\n 'Board.type as type',\n 'Board.state as state',\n 'Board.version as version',\n 'Board.createdAt as \"createdAt\"',\n 'Board.updatedAt as \"updatedAt\"',\n 'Favorite.id as \"favoriteId\"'\n ])\n .andWhere('Favorite.user = :userId', {\n userId: user.id\n })\n\n /* Raw rows skip the entity transformers, so dates arrive as the driver's strings and the\n * DateTime scalar refuses them. Hydrate them the way the entity would (UTC when untagged). */\n const items = (await qb.getRawMany()).map(item => ({\n ...item,\n createdAt: toDate(item.createdAt),\n updatedAt: toDate(item.updatedAt)\n }))\n const total = await qb.getCount()\n\n return { items, total }\n }\n}\n\nfunction toDate(value: unknown): Date | null {\n if (!value) return null\n if (value instanceof Date) return value\n\n const text = String(value)\n const tagged = /(Z|[+-]\\d{2}:?\\d{2})$/.test(text)\n const date = new Date(tagged ? text : text.replace(' ', 'T') + 'Z')\n\n return Number.isNaN(date.getTime()) ? null : date\n}\n"]}