@deenruv/reviews-plugin 1.0.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.
Files changed (88) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +58 -0
  3. package/dist/plugin-server/api/admin-api.resolver.d.ts +67 -0
  4. package/dist/plugin-server/api/admin-api.resolver.js +127 -0
  5. package/dist/plugin-server/api/review-asset.resolver.d.ts +11 -0
  6. package/dist/plugin-server/api/review-asset.resolver.js +37 -0
  7. package/dist/plugin-server/api/review-customer.resolver.d.ts +15 -0
  8. package/dist/plugin-server/api/review-customer.resolver.js +52 -0
  9. package/dist/plugin-server/api/review-order.resolver.d.ts +8 -0
  10. package/dist/plugin-server/api/review-order.resolver.js +47 -0
  11. package/dist/plugin-server/api/review-product.resolver.d.ts +15 -0
  12. package/dist/plugin-server/api/review-product.resolver.js +50 -0
  13. package/dist/plugin-server/api/shop-api.resolver.d.ts +28 -0
  14. package/dist/plugin-server/api/shop-api.resolver.js +57 -0
  15. package/dist/plugin-server/constants.d.ts +6 -0
  16. package/dist/plugin-server/constants.js +7 -0
  17. package/dist/plugin-server/entities/review-translation.entity.d.ts +9 -0
  18. package/dist/plugin-server/entities/review-translation.entity.js +37 -0
  19. package/dist/plugin-server/entities/review.entity.d.ts +24 -0
  20. package/dist/plugin-server/entities/review.entity.js +89 -0
  21. package/dist/plugin-server/events.d.ts +10 -0
  22. package/dist/plugin-server/events.js +11 -0
  23. package/dist/plugin-server/extensions/admin-api.extension.d.ts +2 -0
  24. package/dist/plugin-server/extensions/admin-api.extension.js +70 -0
  25. package/dist/plugin-server/extensions/shared.extension.d.ts +2 -0
  26. package/dist/plugin-server/extensions/shared.extension.js +87 -0
  27. package/dist/plugin-server/extensions/shop-api.extension.d.ts +2 -0
  28. package/dist/plugin-server/extensions/shop-api.extension.js +60 -0
  29. package/dist/plugin-server/index.d.ts +15 -0
  30. package/dist/plugin-server/index.js +86 -0
  31. package/dist/plugin-server/services/reviews.service.d.ts +85 -0
  32. package/dist/plugin-server/services/reviews.service.js +366 -0
  33. package/dist/plugin-server/state/reviews.state.d.ts +16 -0
  34. package/dist/plugin-server/state/reviews.state.js +63 -0
  35. package/dist/plugin-server/types.d.ts +33 -0
  36. package/dist/plugin-server/types.js +1 -0
  37. package/dist/plugin-server/zeus/const.d.ts +6 -0
  38. package/dist/plugin-server/zeus/const.js +4027 -0
  39. package/dist/plugin-server/zeus/index.d.ts +20410 -0
  40. package/dist/plugin-server/zeus/index.js +443 -0
  41. package/dist/plugin-ui/components/OrderInfo.d.ts +5 -0
  42. package/dist/plugin-ui/components/OrderInfo.js +42 -0
  43. package/dist/plugin-ui/components/ProductInfo.d.ts +5 -0
  44. package/dist/plugin-ui/components/ProductInfo.js +36 -0
  45. package/dist/plugin-ui/components/ReviewCustomer.d.ts +2 -0
  46. package/dist/plugin-ui/components/ReviewCustomer.js +166 -0
  47. package/dist/plugin-ui/components/ReviewOrder.d.ts +2 -0
  48. package/dist/plugin-ui/components/ReviewOrder.js +57 -0
  49. package/dist/plugin-ui/components/ReviewProductSidebar.d.ts +2 -0
  50. package/dist/plugin-ui/components/ReviewProductSidebar.js +29 -0
  51. package/dist/plugin-ui/components/ReviewStateChange.d.ts +5 -0
  52. package/dist/plugin-ui/components/ReviewStateChange.js +35 -0
  53. package/dist/plugin-ui/components/UniversalSelectDialog.d.ts +16 -0
  54. package/dist/plugin-ui/components/UniversalSelectDialog.js +35 -0
  55. package/dist/plugin-ui/components/index.d.ts +2 -0
  56. package/dist/plugin-ui/components/index.js +2 -0
  57. package/dist/plugin-ui/constants.d.ts +1 -0
  58. package/dist/plugin-ui/constants.js +1 -0
  59. package/dist/plugin-ui/graphql/index.d.ts +3 -0
  60. package/dist/plugin-ui/graphql/index.js +3 -0
  61. package/dist/plugin-ui/graphql/mutations.d.ts +35 -0
  62. package/dist/plugin-ui/graphql/mutations.js +28 -0
  63. package/dist/plugin-ui/graphql/queries.d.ts +293 -0
  64. package/dist/plugin-ui/graphql/queries.js +34 -0
  65. package/dist/plugin-ui/graphql/scalars.d.ts +16 -0
  66. package/dist/plugin-ui/graphql/scalars.js +14 -0
  67. package/dist/plugin-ui/graphql/selectors.d.ts +58 -0
  68. package/dist/plugin-ui/graphql/selectors.js +39 -0
  69. package/dist/plugin-ui/index.d.ts +7 -0
  70. package/dist/plugin-ui/index.js +69 -0
  71. package/dist/plugin-ui/locales/en/index.d.ts +108 -0
  72. package/dist/plugin-ui/locales/en/index.js +2 -0
  73. package/dist/plugin-ui/locales/en/reviews.json +107 -0
  74. package/dist/plugin-ui/locales/pl/index.d.ts +108 -0
  75. package/dist/plugin-ui/locales/pl/index.js +2 -0
  76. package/dist/plugin-ui/locales/pl/reviews.json +107 -0
  77. package/dist/plugin-ui/pages/Review.d.ts +2 -0
  78. package/dist/plugin-ui/pages/Review.js +263 -0
  79. package/dist/plugin-ui/pages/Reviews.d.ts +2 -0
  80. package/dist/plugin-ui/pages/Reviews.js +174 -0
  81. package/dist/plugin-ui/tsconfig.json +18 -0
  82. package/dist/plugin-ui/zeus/const.d.ts +6 -0
  83. package/dist/plugin-ui/zeus/const.js +4027 -0
  84. package/dist/plugin-ui/zeus/index.d.ts +20410 -0
  85. package/dist/plugin-ui/zeus/index.js +459 -0
  86. package/dist/plugin-ui/zeus/typedDocumentNode.d.ts +3 -0
  87. package/dist/plugin-ui/zeus/typedDocumentNode.js +9 -0
  88. package/package.json +61 -0
package/LICENSE ADDED
@@ -0,0 +1,23 @@
1
+ # License 1
2
+
3
+ The MIT License
4
+
5
+ Copyright (c) 2025-present Aexol
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+
9
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
12
+
13
+ # License 2
14
+
15
+ The MIT License
16
+
17
+ Copyright (c) 2018-2025 Michael Bromley
18
+
19
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
20
+
21
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # @deenruv/reviews-plugin
2
+
3
+ A full-featured product reviews plugin that adds customer review and rating functionality to your Deenruv store, including S3-based image uploads, review state management, and optional automatic translation.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add @deenruv/reviews-plugin
9
+ ```
10
+
11
+ ## Configuration
12
+
13
+ ```typescript
14
+ import { ReviewsPlugin } from '@deenruv/reviews-plugin';
15
+ import { S3Client } from '@aws-sdk/client-s3';
16
+
17
+ // In your Deenruv server config:
18
+ plugins: [
19
+ ReviewsPlugin.init({
20
+ s3: {
21
+ bucket: 'my-reviews-bucket',
22
+ client: new S3Client({ region: 'eu-central-1' }),
23
+ folder: 'reviews',
24
+ },
25
+ getReviewsConfig: async (ctx) => ({
26
+ reviewsLanguages: ['en', 'pl'],
27
+ }),
28
+ // Optional: automatic review translation strategy
29
+ translateStrategy: myTranslateStrategy,
30
+ }),
31
+ ]
32
+ ```
33
+
34
+ ## Features
35
+
36
+ - Customer product reviews with ratings and text
37
+ - Review image/asset uploads via S3 presigned URLs
38
+ - Review state machine (e.g., pending, approved, rejected)
39
+ - Multi-language review translations with pluggable translation strategy
40
+ - Reviews linked to orders, products, variants, and customers
41
+ - Configurable review languages per channel
42
+
43
+ ## Admin UI
44
+
45
+ This plugin extends the admin UI with a comprehensive reviews management dashboard including review listing and detail pages, review state change controls (approve/reject), product and order info sidebars, customer review history, and universal selection dialogs for linking reviews.
46
+
47
+ ## API Extensions
48
+
49
+ The plugin extends both the **Admin API** and **Shop API**:
50
+
51
+ **Admin API:**
52
+ - Queries for listing and filtering reviews
53
+ - Mutations for updating review state and managing reviews
54
+
55
+ **Shop API:**
56
+ - Mutations for creating reviews with ratings, text, and image uploads
57
+ - Queries for fetching product reviews with pagination
58
+ - Resolvers for reviews on Product, Order, and Customer types
@@ -0,0 +1,67 @@
1
+ import { ReviewsService } from "../services/reviews.service.js";
2
+ import { ID, RelationPaths, RequestContext } from "@deenruv/core";
3
+ import { ReviewState } from "../constants.js";
4
+ import { ReviewEntity } from "../entities/review.entity.js";
5
+ import { ModelTypes } from "../zeus/index.js";
6
+ export declare class ReviewsAdminAPIResolver {
7
+ private readonly reviewsService;
8
+ constructor(reviewsService: ReviewsService);
9
+ getReviewInfoForProduct(ctx: RequestContext, args: {
10
+ productId: ID;
11
+ }): Promise<{
12
+ averageRating: number;
13
+ totalReviews: number;
14
+ totalRatings: number;
15
+ }>;
16
+ getReviewsConfig(ctx: RequestContext): Promise<{
17
+ reviewsLanguages: string[];
18
+ }>;
19
+ listReviews(ctx: RequestContext, args: {
20
+ options: ModelTypes["ReviewListOptions"];
21
+ }, relations: RelationPaths<ReviewEntity>): Promise<{
22
+ items: import("@deenruv/core").Translated<ReviewEntity>[];
23
+ totalItems: number;
24
+ }>;
25
+ getReview(ctx: RequestContext, args: {
26
+ id: string;
27
+ }, relations: RelationPaths<ReviewEntity>): Promise<import("@deenruv/core").Translated<ReviewEntity>>;
28
+ translateReviews(ctx: RequestContext, args: {
29
+ input: ModelTypes["TranslateReviewsInput"];
30
+ }): Promise<{
31
+ languageCode: import("../zeus/index.js").LanguageCode;
32
+ body: string;
33
+ summary: string;
34
+ }[]>;
35
+ getReviewForOrder(ctx: RequestContext, args: {
36
+ orderId: ID;
37
+ }, relations: RelationPaths<ReviewEntity>): Promise<import("@deenruv/core").Translated<ReviewEntity> | null>;
38
+ changeReviewState(ctx: RequestContext, args: {
39
+ input: {
40
+ id: string;
41
+ state: ReviewState;
42
+ message?: string;
43
+ };
44
+ }): Promise<{
45
+ id: ID;
46
+ success: boolean;
47
+ } | {
48
+ id: ID;
49
+ success: boolean;
50
+ }[]>;
51
+ changeReviewsState(ctx: RequestContext, args: {
52
+ input: Array<{
53
+ id: string;
54
+ state: ReviewState;
55
+ message?: string;
56
+ }>;
57
+ }): Promise<{
58
+ id: ID;
59
+ success: boolean;
60
+ } | {
61
+ id: ID;
62
+ success: boolean;
63
+ }[]>;
64
+ updateTranslationsReview(ctx: RequestContext, args: {
65
+ input: ModelTypes["UpdateTranslationsReviewInput"];
66
+ }): Promise<ReviewEntity | undefined>;
67
+ }
@@ -0,0 +1,127 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Query, Args, Resolver, Mutation } from "@nestjs/graphql";
14
+ import { ReviewsService } from "../services/reviews.service.js";
15
+ import { Ctx, Relations, RequestContext, } from "@deenruv/core";
16
+ import { ReviewEntity } from "../entities/review.entity.js";
17
+ let ReviewsAdminAPIResolver = class ReviewsAdminAPIResolver {
18
+ constructor(reviewsService) {
19
+ this.reviewsService = reviewsService;
20
+ }
21
+ getReviewInfoForProduct(ctx, args) {
22
+ return this.reviewsService.getReviewInfoForProduct(ctx, args.productId);
23
+ }
24
+ getReviewsConfig(ctx) {
25
+ return this.reviewsService.getReviewsConfig(ctx);
26
+ }
27
+ listReviews(ctx, args, relations) {
28
+ return this.reviewsService.listReviews(ctx, args.options, relations);
29
+ }
30
+ getReview(ctx, args, relations) {
31
+ return this.reviewsService.getReview(ctx, args.id, relations);
32
+ }
33
+ translateReviews(ctx, args) {
34
+ return this.reviewsService.translateReviews(ctx, args.input);
35
+ }
36
+ getReviewForOrder(ctx, args, relations) {
37
+ return this.reviewsService.getOrderReview(ctx, { id: args.orderId }, relations);
38
+ }
39
+ changeReviewState(ctx, args) {
40
+ return this.reviewsService.changeReviewState(ctx, [args.input]);
41
+ }
42
+ changeReviewsState(ctx, args) {
43
+ return this.reviewsService.changeReviewState(ctx, args.input);
44
+ }
45
+ updateTranslationsReview(ctx, args) {
46
+ return this.reviewsService.updateTranslationsReview(ctx, args.input);
47
+ }
48
+ };
49
+ __decorate([
50
+ Query(),
51
+ __param(0, Ctx()),
52
+ __param(1, Args()),
53
+ __metadata("design:type", Function),
54
+ __metadata("design:paramtypes", [RequestContext, Object]),
55
+ __metadata("design:returntype", void 0)
56
+ ], ReviewsAdminAPIResolver.prototype, "getReviewInfoForProduct", null);
57
+ __decorate([
58
+ Query(),
59
+ __param(0, Ctx()),
60
+ __metadata("design:type", Function),
61
+ __metadata("design:paramtypes", [RequestContext]),
62
+ __metadata("design:returntype", Promise)
63
+ ], ReviewsAdminAPIResolver.prototype, "getReviewsConfig", null);
64
+ __decorate([
65
+ Query(),
66
+ __param(0, Ctx()),
67
+ __param(1, Args()),
68
+ __param(2, Relations(ReviewEntity)),
69
+ __metadata("design:type", Function),
70
+ __metadata("design:paramtypes", [RequestContext, Object, Array]),
71
+ __metadata("design:returntype", void 0)
72
+ ], ReviewsAdminAPIResolver.prototype, "listReviews", null);
73
+ __decorate([
74
+ Query(),
75
+ __param(0, Ctx()),
76
+ __param(1, Args()),
77
+ __param(2, Relations(ReviewEntity)),
78
+ __metadata("design:type", Function),
79
+ __metadata("design:paramtypes", [RequestContext, Object, Array]),
80
+ __metadata("design:returntype", void 0)
81
+ ], ReviewsAdminAPIResolver.prototype, "getReview", null);
82
+ __decorate([
83
+ Query(),
84
+ __param(0, Ctx()),
85
+ __param(1, Args()),
86
+ __metadata("design:type", Function),
87
+ __metadata("design:paramtypes", [RequestContext, Object]),
88
+ __metadata("design:returntype", void 0)
89
+ ], ReviewsAdminAPIResolver.prototype, "translateReviews", null);
90
+ __decorate([
91
+ Query(),
92
+ __param(0, Ctx()),
93
+ __param(1, Args()),
94
+ __param(2, Relations(ReviewEntity)),
95
+ __metadata("design:type", Function),
96
+ __metadata("design:paramtypes", [RequestContext, Object, Array]),
97
+ __metadata("design:returntype", void 0)
98
+ ], ReviewsAdminAPIResolver.prototype, "getReviewForOrder", null);
99
+ __decorate([
100
+ Mutation(),
101
+ __param(0, Ctx()),
102
+ __param(1, Args()),
103
+ __metadata("design:type", Function),
104
+ __metadata("design:paramtypes", [RequestContext, Object]),
105
+ __metadata("design:returntype", void 0)
106
+ ], ReviewsAdminAPIResolver.prototype, "changeReviewState", null);
107
+ __decorate([
108
+ Mutation(),
109
+ __param(0, Ctx()),
110
+ __param(1, Args()),
111
+ __metadata("design:type", Function),
112
+ __metadata("design:paramtypes", [RequestContext, Object]),
113
+ __metadata("design:returntype", void 0)
114
+ ], ReviewsAdminAPIResolver.prototype, "changeReviewsState", null);
115
+ __decorate([
116
+ Mutation(),
117
+ __param(0, Ctx()),
118
+ __param(1, Args()),
119
+ __metadata("design:type", Function),
120
+ __metadata("design:paramtypes", [RequestContext, Object]),
121
+ __metadata("design:returntype", void 0)
122
+ ], ReviewsAdminAPIResolver.prototype, "updateTranslationsReview", null);
123
+ ReviewsAdminAPIResolver = __decorate([
124
+ Resolver(),
125
+ __metadata("design:paramtypes", [ReviewsService])
126
+ ], ReviewsAdminAPIResolver);
127
+ export { ReviewsAdminAPIResolver };
@@ -0,0 +1,11 @@
1
+ import { ReviewEntity } from "../entities/review.entity.js";
2
+ import { ReviewsService } from "../services/reviews.service.js";
3
+ import { RequestContext } from "@deenruv/core";
4
+ export declare class ReviewAssetResolver {
5
+ private readonly reviewsService;
6
+ constructor(reviewsService: ReviewsService);
7
+ assets(ctx: RequestContext, review: ReviewEntity): Promise<{
8
+ key: string;
9
+ url: string;
10
+ }[]>;
11
+ }
@@ -0,0 +1,37 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Parent, ResolveField, Resolver } from "@nestjs/graphql";
14
+ import { ReviewEntity } from "../entities/review.entity.js";
15
+ import { ReviewsService } from "../services/reviews.service.js";
16
+ import { Ctx, RequestContext } from "@deenruv/core";
17
+ let ReviewAssetResolver = class ReviewAssetResolver {
18
+ constructor(reviewsService) {
19
+ this.reviewsService = reviewsService;
20
+ }
21
+ async assets(ctx, review) {
22
+ return this.reviewsService.getReviewAssets(ctx, review);
23
+ }
24
+ };
25
+ __decorate([
26
+ ResolveField("assets"),
27
+ __param(0, Ctx()),
28
+ __param(1, Parent()),
29
+ __metadata("design:type", Function),
30
+ __metadata("design:paramtypes", [RequestContext, ReviewEntity]),
31
+ __metadata("design:returntype", Promise)
32
+ ], ReviewAssetResolver.prototype, "assets", null);
33
+ ReviewAssetResolver = __decorate([
34
+ Resolver("Review"),
35
+ __metadata("design:paramtypes", [ReviewsService])
36
+ ], ReviewAssetResolver);
37
+ export { ReviewAssetResolver };
@@ -0,0 +1,15 @@
1
+ import { ReviewsService } from "../services/reviews.service.js";
2
+ import { Customer, RelationPaths, RequestContext } from "@deenruv/core";
3
+ import { ModelTypes } from "../zeus/index.js";
4
+ import { ReviewEntity } from "../entities/review.entity.js";
5
+ export declare class ReviewCustomerResolver {
6
+ private readonly reviewsService;
7
+ constructor(reviewsService: ReviewsService);
8
+ reviews(ctx: RequestContext, customer: Customer, args: {
9
+ options: ModelTypes["ReviewListOptions"];
10
+ }, relations: RelationPaths<ReviewEntity>): Promise<{
11
+ items: import("@deenruv/core").Translated<ReviewEntity>[];
12
+ totalItems: number;
13
+ }>;
14
+ shopReviewCreated(ctx: RequestContext, customer: Customer): Promise<boolean>;
15
+ }
@@ -0,0 +1,52 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Args, Parent, ResolveField, Resolver } from "@nestjs/graphql";
14
+ import { ReviewsService } from "../services/reviews.service.js";
15
+ import { Ctx, Customer, Relations, RequestContext, } from "@deenruv/core";
16
+ import { ReviewEntity } from "../entities/review.entity.js";
17
+ let ReviewCustomerResolver = class ReviewCustomerResolver {
18
+ constructor(reviewsService) {
19
+ this.reviewsService = reviewsService;
20
+ }
21
+ async reviews(ctx, customer, args, relations) {
22
+ return this.reviewsService.listReviews(ctx, Object.assign(Object.assign({}, args.options), { filter: Object.assign(Object.assign({}, args.options.filter), { customerId: { eq: customer.id } }) }), relations, true);
23
+ }
24
+ async shopReviewCreated(ctx, customer) {
25
+ return this.reviewsService.hasShopReviewCreated(ctx, customer);
26
+ }
27
+ };
28
+ __decorate([
29
+ ResolveField("reviews"),
30
+ __param(0, Ctx()),
31
+ __param(1, Parent()),
32
+ __param(2, Args()),
33
+ __param(3, Relations(ReviewEntity)),
34
+ __metadata("design:type", Function),
35
+ __metadata("design:paramtypes", [RequestContext,
36
+ Customer, Object, Array]),
37
+ __metadata("design:returntype", Promise)
38
+ ], ReviewCustomerResolver.prototype, "reviews", null);
39
+ __decorate([
40
+ ResolveField("shopReviewCreated"),
41
+ __param(0, Ctx()),
42
+ __param(1, Parent()),
43
+ __metadata("design:type", Function),
44
+ __metadata("design:paramtypes", [RequestContext,
45
+ Customer]),
46
+ __metadata("design:returntype", Promise)
47
+ ], ReviewCustomerResolver.prototype, "shopReviewCreated", null);
48
+ ReviewCustomerResolver = __decorate([
49
+ Resolver("Customer"),
50
+ __metadata("design:paramtypes", [ReviewsService])
51
+ ], ReviewCustomerResolver);
52
+ export { ReviewCustomerResolver };
@@ -0,0 +1,8 @@
1
+ import { ReviewsService } from "../services/reviews.service.js";
2
+ import { Order, RequestContext } from "@deenruv/core";
3
+ export declare class ReviewOrderResolver {
4
+ private readonly reviewsService;
5
+ constructor(reviewsService: ReviewsService);
6
+ reviewed(ctx: RequestContext, order: Order): Promise<boolean>;
7
+ review(ctx: RequestContext, order: Order): Promise<import("@deenruv/core").Translated<import("../entities/review.entity.js").ReviewEntity> | null>;
8
+ }
@@ -0,0 +1,47 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Parent, ResolveField, Resolver } from "@nestjs/graphql";
14
+ import { ReviewsService } from "../services/reviews.service.js";
15
+ import { Ctx, Order, RequestContext } from "@deenruv/core";
16
+ let ReviewOrderResolver = class ReviewOrderResolver {
17
+ constructor(reviewsService) {
18
+ this.reviewsService = reviewsService;
19
+ }
20
+ async reviewed(ctx, order) {
21
+ return this.reviewsService.isOrderReviewed(ctx, order);
22
+ }
23
+ async review(ctx, order) {
24
+ return this.reviewsService.getOrderReview(ctx, order);
25
+ }
26
+ };
27
+ __decorate([
28
+ ResolveField("reviewed"),
29
+ __param(0, Ctx()),
30
+ __param(1, Parent()),
31
+ __metadata("design:type", Function),
32
+ __metadata("design:paramtypes", [RequestContext, Order]),
33
+ __metadata("design:returntype", Promise)
34
+ ], ReviewOrderResolver.prototype, "reviewed", null);
35
+ __decorate([
36
+ ResolveField("review"),
37
+ __param(0, Ctx()),
38
+ __param(1, Parent()),
39
+ __metadata("design:type", Function),
40
+ __metadata("design:paramtypes", [RequestContext, Order]),
41
+ __metadata("design:returntype", Promise)
42
+ ], ReviewOrderResolver.prototype, "review", null);
43
+ ReviewOrderResolver = __decorate([
44
+ Resolver("Order"),
45
+ __metadata("design:paramtypes", [ReviewsService])
46
+ ], ReviewOrderResolver);
47
+ export { ReviewOrderResolver };
@@ -0,0 +1,15 @@
1
+ import { ReviewsService } from "../services/reviews.service.js";
2
+ import { Product, RelationPaths, RequestContext } from "@deenruv/core";
3
+ import { ModelTypes } from "../zeus/index.js";
4
+ import { ReviewEntity } from "../entities/review.entity.js";
5
+ export declare class ReviewProductResolver {
6
+ private readonly reviewsService;
7
+ constructor(reviewsService: ReviewsService);
8
+ averageRating(ctx: RequestContext, product: Product): Promise<number>;
9
+ reviews(ctx: RequestContext, args: {
10
+ options: ModelTypes["ReviewListOptions"];
11
+ }, product: Product, relations: RelationPaths<ReviewEntity>): Promise<{
12
+ items: import("@deenruv/core").Translated<ReviewEntity>[];
13
+ totalItems: number;
14
+ }>;
15
+ }
@@ -0,0 +1,50 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Args, Parent, ResolveField, Resolver } from "@nestjs/graphql";
14
+ import { ReviewsService } from "../services/reviews.service.js";
15
+ import { Ctx, Product, Relations, RequestContext, } from "@deenruv/core";
16
+ import { ReviewEntity } from "../entities/review.entity.js";
17
+ let ReviewProductResolver = class ReviewProductResolver {
18
+ constructor(reviewsService) {
19
+ this.reviewsService = reviewsService;
20
+ }
21
+ async averageRating(ctx, product) {
22
+ return this.reviewsService.getAverageRating(ctx, product);
23
+ }
24
+ async reviews(ctx, args, product, relations) {
25
+ return this.reviewsService.listReviews(ctx, Object.assign(Object.assign({}, args.options), { filter: Object.assign(Object.assign({}, args.options.filter), { productId: { eq: product.id } }) }), relations);
26
+ }
27
+ };
28
+ __decorate([
29
+ ResolveField("averageRating"),
30
+ __param(0, Ctx()),
31
+ __param(1, Parent()),
32
+ __metadata("design:type", Function),
33
+ __metadata("design:paramtypes", [RequestContext, Product]),
34
+ __metadata("design:returntype", Promise)
35
+ ], ReviewProductResolver.prototype, "averageRating", null);
36
+ __decorate([
37
+ ResolveField("reviews"),
38
+ __param(0, Ctx()),
39
+ __param(1, Args()),
40
+ __param(2, Parent()),
41
+ __param(3, Relations(ReviewEntity)),
42
+ __metadata("design:type", Function),
43
+ __metadata("design:paramtypes", [RequestContext, Object, Product, Array]),
44
+ __metadata("design:returntype", Promise)
45
+ ], ReviewProductResolver.prototype, "reviews", null);
46
+ ReviewProductResolver = __decorate([
47
+ Resolver("Product"),
48
+ __metadata("design:paramtypes", [ReviewsService])
49
+ ], ReviewProductResolver);
50
+ export { ReviewProductResolver };
@@ -0,0 +1,28 @@
1
+ import { ReviewsService } from "../services/reviews.service.js";
2
+ import { RequestContext } from "@deenruv/core";
3
+ import { CreateReviewInput } from "../types.js";
4
+ export declare class ReviewsShopAPIResolver {
5
+ private readonly reviewsService;
6
+ constructor(reviewsService: ReviewsService);
7
+ createReview(ctx: RequestContext, args: {
8
+ input: CreateReviewInput;
9
+ }): Promise<import("../entities/review.entity.js").ReviewEntity>;
10
+ getReviewsStorage(ctx: RequestContext, args: {
11
+ input: Array<{
12
+ filename: string;
13
+ }>;
14
+ }): Promise<{
15
+ key: string;
16
+ url: string;
17
+ }[]>;
18
+ getAverageRatings(ctx: RequestContext): Promise<{
19
+ shopAverageRating: {
20
+ total: number;
21
+ count: number;
22
+ };
23
+ productsAverageRating: {
24
+ total: number;
25
+ count: number;
26
+ };
27
+ }>;
28
+ }
@@ -0,0 +1,57 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Args, Query, Mutation, Resolver } from "@nestjs/graphql";
14
+ import { ReviewsService } from "../services/reviews.service.js";
15
+ import { Ctx, RequestContext } from "@deenruv/core";
16
+ let ReviewsShopAPIResolver = class ReviewsShopAPIResolver {
17
+ constructor(reviewsService) {
18
+ this.reviewsService = reviewsService;
19
+ }
20
+ async createReview(ctx, args) {
21
+ return this.reviewsService.createReview(ctx, args.input);
22
+ }
23
+ async getReviewsStorage(ctx, args) {
24
+ return this.reviewsService.getReviewsStorage(ctx, args.input);
25
+ }
26
+ async getAverageRatings(ctx) {
27
+ return this.reviewsService.getAverageRatings(ctx);
28
+ }
29
+ };
30
+ __decorate([
31
+ Mutation(),
32
+ __param(0, Ctx()),
33
+ __param(1, Args()),
34
+ __metadata("design:type", Function),
35
+ __metadata("design:paramtypes", [RequestContext, Object]),
36
+ __metadata("design:returntype", Promise)
37
+ ], ReviewsShopAPIResolver.prototype, "createReview", null);
38
+ __decorate([
39
+ Query(),
40
+ __param(0, Ctx()),
41
+ __param(1, Args()),
42
+ __metadata("design:type", Function),
43
+ __metadata("design:paramtypes", [RequestContext, Object]),
44
+ __metadata("design:returntype", Promise)
45
+ ], ReviewsShopAPIResolver.prototype, "getReviewsStorage", null);
46
+ __decorate([
47
+ Query(),
48
+ __param(0, Ctx()),
49
+ __metadata("design:type", Function),
50
+ __metadata("design:paramtypes", [RequestContext]),
51
+ __metadata("design:returntype", Promise)
52
+ ], ReviewsShopAPIResolver.prototype, "getAverageRatings", null);
53
+ ReviewsShopAPIResolver = __decorate([
54
+ Resolver(),
55
+ __metadata("design:paramtypes", [ReviewsService])
56
+ ], ReviewsShopAPIResolver);
57
+ export { ReviewsShopAPIResolver };
@@ -0,0 +1,6 @@
1
+ export declare const REVIEWS_PLUGIN_OPTIONS: unique symbol;
2
+ export declare enum ReviewState {
3
+ PENDING = "PENDING",
4
+ ACCEPTED = "ACCEPTED",
5
+ DECLINED = "DECLINED"
6
+ }
@@ -0,0 +1,7 @@
1
+ export const REVIEWS_PLUGIN_OPTIONS = Symbol("reviews-plugin-options");
2
+ export var ReviewState;
3
+ (function (ReviewState) {
4
+ ReviewState["PENDING"] = "PENDING";
5
+ ReviewState["ACCEPTED"] = "ACCEPTED";
6
+ ReviewState["DECLINED"] = "DECLINED";
7
+ })(ReviewState || (ReviewState = {}));
@@ -0,0 +1,9 @@
1
+ import { DeenruvEntity, DeepPartial, LanguageCode, Translation } from "@deenruv/core";
2
+ import { Relation } from "typeorm";
3
+ import { ReviewEntity } from "./review.entity.js";
4
+ export declare class ReviewEntityTranslation extends DeenruvEntity implements Translation<ReviewEntity> {
5
+ constructor(input?: DeepPartial<ReviewEntityTranslation>);
6
+ languageCode: LanguageCode;
7
+ body: string;
8
+ base: Relation<ReviewEntity>;
9
+ }