target-supabase-sdk 0.1.0 → 0.1.2
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/LICENSE +21 -21
- package/README.md +121 -70
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/parcel/parcel-manager.d.ts +2 -2
- package/dist/parcel/parcel-manager.d.ts.map +1 -1
- package/package.json +57 -45
- package/src/auth/auth.api.ts +85 -85
- package/src/core.api.ts +338 -338
- package/src/core.interface.ts +74 -74
- package/src/core.utils.ts +98 -98
- package/src/feed/feed.interface.ts +33 -33
- package/src/file/file.api.ts +43 -43
- package/src/file/file.interface.ts +29 -29
- package/src/file-list/file-list.api.ts +64 -64
- package/src/file-list/file-list.interface.ts +24 -24
- package/src/idea/idea.interface.ts +27 -27
- package/src/index.ts +51 -50
- package/src/link/link.interface.ts +21 -21
- package/src/parcel/parcel-manager.ts +209 -209
- package/src/parcel/parcel.interface.ts +40 -40
- package/src/question-list/question-list.api.ts +42 -42
- package/src/question-list/question-list.interface.ts +21 -21
- package/src/review/review.api.ts +145 -145
- package/src/review/review.interface.ts +26 -26
- package/src/review-v2/apis/post-review-setting.api.ts +35 -35
- package/src/review-v2/apis/post-review.api.ts +59 -59
- package/src/review-v2/review-setting.interface.ts +26 -26
- package/src/review-v2/review.interface.ts +23 -23
- package/src/service/api.interface.ts +47 -47
- package/src/service/base.interface.ts +97 -97
- package/src/service/service.interface.ts +27 -27
- package/src/supabase.ts +143 -143
package/src/review/review.api.ts
CHANGED
|
@@ -1,145 +1,145 @@
|
|
|
1
|
-
import { cloneDeep } from "lodash-es";
|
|
2
|
-
import { createTarget, getPossibleTarget, updateTargetDetails } from "../core.api";
|
|
3
|
-
import { createResponse } from "../core.interface";
|
|
4
|
-
import { BaseValidator } from "../core.utils";
|
|
5
|
-
import { CategoryReview, Review, ReviewDetails } from "./review.interface";
|
|
6
|
-
|
|
7
|
-
class PatchUpsertReviewValidator extends BaseValidator<ReviewDetails> {
|
|
8
|
-
protected requiredFields: (keyof ReviewDetails)[] = ["reviewTargetId", "reviewDomain", "reviewResult"];
|
|
9
|
-
protected optionalFields: (keyof ReviewDetails)[] = [];
|
|
10
|
-
protected ignoredFields: (keyof ReviewDetails)[] = ["reviewCount", "lastUpdated"];
|
|
11
|
-
|
|
12
|
-
constructor() {
|
|
13
|
-
super();
|
|
14
|
-
// Add custom
|
|
15
|
-
this.addValidator((val) => {
|
|
16
|
-
if (val.reviewResult == null || Object.values(val.reviewResult).some((v) => typeof v !== "number")) {
|
|
17
|
-
return "[Check reviewResult] reviewResult invalid";
|
|
18
|
-
}
|
|
19
|
-
return true;
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export const patchUpsertReview = async (payload: ReviewDetails) => {
|
|
25
|
-
const validPayload = new PatchUpsertReviewValidator().validate(payload);
|
|
26
|
-
const { reviewTargetId, reviewDomain } = validPayload;
|
|
27
|
-
|
|
28
|
-
// Check redundancy
|
|
29
|
-
const { data: possibleReview } = await getPossibleTarget({
|
|
30
|
-
filterList: [
|
|
31
|
-
{
|
|
32
|
-
field: "category",
|
|
33
|
-
operator: "eq",
|
|
34
|
-
value: CategoryReview.REVIEW,
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
field: "details->>reviewTargetId",
|
|
38
|
-
operator: "eq",
|
|
39
|
-
value: reviewTargetId,
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
field: "details->>reviewDomain",
|
|
43
|
-
operator: "eq",
|
|
44
|
-
value: reviewDomain,
|
|
45
|
-
},
|
|
46
|
-
],
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
if (possibleReview != null) {
|
|
50
|
-
const existingReview = possibleReview as Review;
|
|
51
|
-
const id = existingReview.id;
|
|
52
|
-
// Update
|
|
53
|
-
const data = await updateTargetDetails<Review, ReviewDetails>({
|
|
54
|
-
id,
|
|
55
|
-
updateFn: (details) => {
|
|
56
|
-
const incrementResult = validPayload.reviewResult;
|
|
57
|
-
if (incrementResult != null) {
|
|
58
|
-
const updatedResult = details.reviewResult != null ? cloneDeep(details.reviewResult) : {};
|
|
59
|
-
Object.entries(incrementResult).forEach(([key, value]) => {
|
|
60
|
-
updatedResult[key] = (updatedResult[key] ?? 0) + value;
|
|
61
|
-
});
|
|
62
|
-
return {
|
|
63
|
-
...details,
|
|
64
|
-
reviewResult: updatedResult,
|
|
65
|
-
reviewCount: (details.reviewCount ?? 0) + 1,
|
|
66
|
-
lastUpdated: Date.now(),
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
return details;
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
return createResponse.success<Review>(data);
|
|
73
|
-
}
|
|
74
|
-
// Create
|
|
75
|
-
const { data: newReview } = await postReview({
|
|
76
|
-
reviewTargetId,
|
|
77
|
-
reviewDomain,
|
|
78
|
-
});
|
|
79
|
-
if (newReview == null) {
|
|
80
|
-
const msg = "[patchUpsertReview] Unable to create Review";
|
|
81
|
-
console.error(msg);
|
|
82
|
-
throw new Error(msg);
|
|
83
|
-
}
|
|
84
|
-
return createResponse.success<Review>(newReview);
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
export interface PostReviewPayload {
|
|
88
|
-
reviewTargetId: ReviewDetails["reviewTargetId"];
|
|
89
|
-
reviewDomain: ReviewDetails["reviewDomain"];
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export class PostReviewValidator extends BaseValidator<PostReviewPayload> {
|
|
93
|
-
protected requiredFields: (keyof PostReviewPayload)[] = ["reviewTargetId", "reviewDomain"];
|
|
94
|
-
protected optionalFields: (keyof PostReviewPayload)[] = [];
|
|
95
|
-
|
|
96
|
-
constructor() {
|
|
97
|
-
super();
|
|
98
|
-
// Add custom
|
|
99
|
-
this.addValidator((val) => {
|
|
100
|
-
return true;
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export const postReview = async (payload: PostReviewPayload) => {
|
|
106
|
-
return createTarget<Review, PostReviewPayload>({
|
|
107
|
-
payload: payload,
|
|
108
|
-
validator: PostReviewValidator,
|
|
109
|
-
checkRedundancyFilterList: [
|
|
110
|
-
{
|
|
111
|
-
field: "category",
|
|
112
|
-
operator: "eq",
|
|
113
|
-
value: CategoryReview.REVIEW,
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
field: "details->>reviewTargetId",
|
|
117
|
-
operator: "eq",
|
|
118
|
-
value: payload.reviewTargetId,
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
field: "details->>reviewDomain",
|
|
122
|
-
operator: "eq",
|
|
123
|
-
value: payload.reviewDomain,
|
|
124
|
-
},
|
|
125
|
-
],
|
|
126
|
-
createFn: (validPayload) => {
|
|
127
|
-
const { reviewTargetId, reviewDomain } = validPayload;
|
|
128
|
-
const details: ReviewDetails = {
|
|
129
|
-
reviewTargetId,
|
|
130
|
-
reviewDomain,
|
|
131
|
-
lastUpdated: Date.now(),
|
|
132
|
-
reviewCount: 0,
|
|
133
|
-
reviewResult: {},
|
|
134
|
-
};
|
|
135
|
-
const reviewStr = `Review ${reviewTargetId} ${reviewDomain}`;
|
|
136
|
-
return {
|
|
137
|
-
name: reviewStr,
|
|
138
|
-
category: CategoryReview.REVIEW,
|
|
139
|
-
value: "",
|
|
140
|
-
tagList: [],
|
|
141
|
-
details,
|
|
142
|
-
};
|
|
143
|
-
},
|
|
144
|
-
});
|
|
145
|
-
};
|
|
1
|
+
import { cloneDeep } from "lodash-es";
|
|
2
|
+
import { createTarget, getPossibleTarget, updateTargetDetails } from "../core.api";
|
|
3
|
+
import { createResponse } from "../core.interface";
|
|
4
|
+
import { BaseValidator } from "../core.utils";
|
|
5
|
+
import { CategoryReview, Review, ReviewDetails } from "./review.interface";
|
|
6
|
+
|
|
7
|
+
class PatchUpsertReviewValidator extends BaseValidator<ReviewDetails> {
|
|
8
|
+
protected requiredFields: (keyof ReviewDetails)[] = ["reviewTargetId", "reviewDomain", "reviewResult"];
|
|
9
|
+
protected optionalFields: (keyof ReviewDetails)[] = [];
|
|
10
|
+
protected ignoredFields: (keyof ReviewDetails)[] = ["reviewCount", "lastUpdated"];
|
|
11
|
+
|
|
12
|
+
constructor() {
|
|
13
|
+
super();
|
|
14
|
+
// Add custom
|
|
15
|
+
this.addValidator((val) => {
|
|
16
|
+
if (val.reviewResult == null || Object.values(val.reviewResult).some((v) => typeof v !== "number")) {
|
|
17
|
+
return "[Check reviewResult] reviewResult invalid";
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const patchUpsertReview = async (payload: ReviewDetails) => {
|
|
25
|
+
const validPayload = new PatchUpsertReviewValidator().validate(payload);
|
|
26
|
+
const { reviewTargetId, reviewDomain } = validPayload;
|
|
27
|
+
|
|
28
|
+
// Check redundancy
|
|
29
|
+
const { data: possibleReview } = await getPossibleTarget({
|
|
30
|
+
filterList: [
|
|
31
|
+
{
|
|
32
|
+
field: "category",
|
|
33
|
+
operator: "eq",
|
|
34
|
+
value: CategoryReview.REVIEW,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
field: "details->>reviewTargetId",
|
|
38
|
+
operator: "eq",
|
|
39
|
+
value: reviewTargetId,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
field: "details->>reviewDomain",
|
|
43
|
+
operator: "eq",
|
|
44
|
+
value: reviewDomain,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
if (possibleReview != null) {
|
|
50
|
+
const existingReview = possibleReview as Review;
|
|
51
|
+
const id = existingReview.id;
|
|
52
|
+
// Update
|
|
53
|
+
const data = await updateTargetDetails<Review, ReviewDetails>({
|
|
54
|
+
id,
|
|
55
|
+
updateFn: (details) => {
|
|
56
|
+
const incrementResult = validPayload.reviewResult;
|
|
57
|
+
if (incrementResult != null) {
|
|
58
|
+
const updatedResult = details.reviewResult != null ? cloneDeep(details.reviewResult) : {};
|
|
59
|
+
Object.entries(incrementResult).forEach(([key, value]) => {
|
|
60
|
+
updatedResult[key] = (updatedResult[key] ?? 0) + value;
|
|
61
|
+
});
|
|
62
|
+
return {
|
|
63
|
+
...details,
|
|
64
|
+
reviewResult: updatedResult,
|
|
65
|
+
reviewCount: (details.reviewCount ?? 0) + 1,
|
|
66
|
+
lastUpdated: Date.now(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return details;
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
return createResponse.success<Review>(data);
|
|
73
|
+
}
|
|
74
|
+
// Create
|
|
75
|
+
const { data: newReview } = await postReview({
|
|
76
|
+
reviewTargetId,
|
|
77
|
+
reviewDomain,
|
|
78
|
+
});
|
|
79
|
+
if (newReview == null) {
|
|
80
|
+
const msg = "[patchUpsertReview] Unable to create Review";
|
|
81
|
+
console.error(msg);
|
|
82
|
+
throw new Error(msg);
|
|
83
|
+
}
|
|
84
|
+
return createResponse.success<Review>(newReview);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export interface PostReviewPayload {
|
|
88
|
+
reviewTargetId: ReviewDetails["reviewTargetId"];
|
|
89
|
+
reviewDomain: ReviewDetails["reviewDomain"];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export class PostReviewValidator extends BaseValidator<PostReviewPayload> {
|
|
93
|
+
protected requiredFields: (keyof PostReviewPayload)[] = ["reviewTargetId", "reviewDomain"];
|
|
94
|
+
protected optionalFields: (keyof PostReviewPayload)[] = [];
|
|
95
|
+
|
|
96
|
+
constructor() {
|
|
97
|
+
super();
|
|
98
|
+
// Add custom
|
|
99
|
+
this.addValidator((val) => {
|
|
100
|
+
return true;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export const postReview = async (payload: PostReviewPayload) => {
|
|
106
|
+
return createTarget<Review, PostReviewPayload>({
|
|
107
|
+
payload: payload,
|
|
108
|
+
validator: PostReviewValidator,
|
|
109
|
+
checkRedundancyFilterList: [
|
|
110
|
+
{
|
|
111
|
+
field: "category",
|
|
112
|
+
operator: "eq",
|
|
113
|
+
value: CategoryReview.REVIEW,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
field: "details->>reviewTargetId",
|
|
117
|
+
operator: "eq",
|
|
118
|
+
value: payload.reviewTargetId,
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
field: "details->>reviewDomain",
|
|
122
|
+
operator: "eq",
|
|
123
|
+
value: payload.reviewDomain,
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
createFn: (validPayload) => {
|
|
127
|
+
const { reviewTargetId, reviewDomain } = validPayload;
|
|
128
|
+
const details: ReviewDetails = {
|
|
129
|
+
reviewTargetId,
|
|
130
|
+
reviewDomain,
|
|
131
|
+
lastUpdated: Date.now(),
|
|
132
|
+
reviewCount: 0,
|
|
133
|
+
reviewResult: {},
|
|
134
|
+
};
|
|
135
|
+
const reviewStr = `Review ${reviewTargetId} ${reviewDomain}`;
|
|
136
|
+
return {
|
|
137
|
+
name: reviewStr,
|
|
138
|
+
category: CategoryReview.REVIEW,
|
|
139
|
+
value: "",
|
|
140
|
+
tagList: [],
|
|
141
|
+
details,
|
|
142
|
+
};
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
};
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { Target } from "../core.interface";
|
|
2
|
-
|
|
3
|
-
export enum ReviewDomain {
|
|
4
|
-
/** the larger the number, the more popular it is */
|
|
5
|
-
LIKES = "likes",
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export type ReviewDetails = {
|
|
9
|
-
reviewTargetId: string;
|
|
10
|
-
lastUpdated: number;
|
|
11
|
-
reviewDomain: ReviewDomain;
|
|
12
|
-
/** Auto increment */
|
|
13
|
-
reviewCount?: number;
|
|
14
|
-
reviewResult?: {
|
|
15
|
-
/** reviewDomain */
|
|
16
|
-
[name: string]: number;
|
|
17
|
-
};
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export enum CategoryReview {
|
|
21
|
-
REVIEW = "review",
|
|
22
|
-
}
|
|
23
|
-
export interface Review extends Target {
|
|
24
|
-
category: CategoryReview;
|
|
25
|
-
details: ReviewDetails;
|
|
26
|
-
}
|
|
1
|
+
import { Target } from "../core.interface";
|
|
2
|
+
|
|
3
|
+
export enum ReviewDomain {
|
|
4
|
+
/** the larger the number, the more popular it is */
|
|
5
|
+
LIKES = "likes",
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export type ReviewDetails = {
|
|
9
|
+
reviewTargetId: string;
|
|
10
|
+
lastUpdated: number;
|
|
11
|
+
reviewDomain: ReviewDomain;
|
|
12
|
+
/** Auto increment */
|
|
13
|
+
reviewCount?: number;
|
|
14
|
+
reviewResult?: {
|
|
15
|
+
/** reviewDomain */
|
|
16
|
+
[name: string]: number;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export enum CategoryReview {
|
|
21
|
+
REVIEW = "review",
|
|
22
|
+
}
|
|
23
|
+
export interface Review extends Target {
|
|
24
|
+
category: CategoryReview;
|
|
25
|
+
details: ReviewDetails;
|
|
26
|
+
}
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
import { createTarget, validateWith } from "../../core.api";
|
|
2
|
-
import { BaseValidator } from "../../core.utils";
|
|
3
|
-
import { ReviewSettingDetails, ReviewSetting, CategoryReviewSetting } from "../review-setting.interface";
|
|
4
|
-
|
|
5
|
-
export interface PostReviewSettingPayload {
|
|
6
|
-
name: ReviewSettingDetails["name"];
|
|
7
|
-
questionList: ReviewSettingDetails["questionList"];
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export class PostReviewSettingValidator extends BaseValidator<PostReviewSettingPayload> {
|
|
11
|
-
protected requiredFields: (keyof PostReviewSettingPayload)[] = ["name", "questionList"];
|
|
12
|
-
protected optionalFields: (keyof PostReviewSettingPayload)[] = [];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export const postReviewSetting = validateWith<PostReviewSettingPayload, PostReviewSettingValidator>(
|
|
16
|
-
PostReviewSettingValidator
|
|
17
|
-
)(async (validPayload) => {
|
|
18
|
-
return createTarget<ReviewSetting, PostReviewSettingPayload>({
|
|
19
|
-
payload: validPayload,
|
|
20
|
-
createFn: (validPayload) => {
|
|
21
|
-
const { name, questionList } = validPayload;
|
|
22
|
-
const details: ReviewSettingDetails = {
|
|
23
|
-
name,
|
|
24
|
-
questionList,
|
|
25
|
-
};
|
|
26
|
-
return {
|
|
27
|
-
name,
|
|
28
|
-
category: CategoryReviewSetting.REVIEW_SETTING,
|
|
29
|
-
value: "",
|
|
30
|
-
tagList: [],
|
|
31
|
-
details,
|
|
32
|
-
};
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
});
|
|
1
|
+
import { createTarget, validateWith } from "../../core.api";
|
|
2
|
+
import { BaseValidator } from "../../core.utils";
|
|
3
|
+
import { ReviewSettingDetails, ReviewSetting, CategoryReviewSetting } from "../review-setting.interface";
|
|
4
|
+
|
|
5
|
+
export interface PostReviewSettingPayload {
|
|
6
|
+
name: ReviewSettingDetails["name"];
|
|
7
|
+
questionList: ReviewSettingDetails["questionList"];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class PostReviewSettingValidator extends BaseValidator<PostReviewSettingPayload> {
|
|
11
|
+
protected requiredFields: (keyof PostReviewSettingPayload)[] = ["name", "questionList"];
|
|
12
|
+
protected optionalFields: (keyof PostReviewSettingPayload)[] = [];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const postReviewSetting = validateWith<PostReviewSettingPayload, PostReviewSettingValidator>(
|
|
16
|
+
PostReviewSettingValidator
|
|
17
|
+
)(async (validPayload) => {
|
|
18
|
+
return createTarget<ReviewSetting, PostReviewSettingPayload>({
|
|
19
|
+
payload: validPayload,
|
|
20
|
+
createFn: (validPayload) => {
|
|
21
|
+
const { name, questionList } = validPayload;
|
|
22
|
+
const details: ReviewSettingDetails = {
|
|
23
|
+
name,
|
|
24
|
+
questionList,
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
name,
|
|
28
|
+
category: CategoryReviewSetting.REVIEW_SETTING,
|
|
29
|
+
value: "",
|
|
30
|
+
tagList: [],
|
|
31
|
+
details,
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
});
|
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
import { createTarget, getTarget, validateWith } from "../../core.api";
|
|
2
|
-
import { BaseValidator } from "../../core.utils";
|
|
3
|
-
import { CategoryReview, ReviewV2 as Review, ReviewV2Details as ReviewDetails } from "../review.interface";
|
|
4
|
-
import { ReviewSetting } from "../review-setting.interface";
|
|
5
|
-
|
|
6
|
-
export interface PostReviewPayload {
|
|
7
|
-
targetId: ReviewDetails["targetId"];
|
|
8
|
-
settingId: ReviewDetails["settingId"];
|
|
9
|
-
resultList: ReviewDetails["resultList"];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export class PostReviewValidator extends BaseValidator<PostReviewPayload> {
|
|
13
|
-
protected requiredFields: (keyof PostReviewPayload)[] = ["targetId", "targetId", "resultList"];
|
|
14
|
-
protected optionalFields: (keyof PostReviewPayload)[] = [];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export const postReview = validateWith<PostReviewPayload, PostReviewValidator>(PostReviewValidator)(
|
|
18
|
-
async (validPayload: PostReviewPayload) => {
|
|
19
|
-
const { targetId, settingId, resultList } = validPayload;
|
|
20
|
-
|
|
21
|
-
// Check Target
|
|
22
|
-
if (targetId != null) {
|
|
23
|
-
const { data: possibleTarget } = await getTarget({
|
|
24
|
-
id: targetId,
|
|
25
|
-
});
|
|
26
|
-
// TODO
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// Check ReviewSetting
|
|
30
|
-
const { data: _reviewSetting } = await getTarget({
|
|
31
|
-
id: settingId,
|
|
32
|
-
});
|
|
33
|
-
if (_reviewSetting == null) {
|
|
34
|
-
console.error("[postReview] ReviewSetting not found");
|
|
35
|
-
throw new Error("[postReview] ReviewSetting not found");
|
|
36
|
-
}
|
|
37
|
-
const reviewSetting = _reviewSetting as ReviewSetting;
|
|
38
|
-
|
|
39
|
-
return createTarget<Review, PostReviewPayload>({
|
|
40
|
-
payload: validPayload,
|
|
41
|
-
createFn: (validPayload) => {
|
|
42
|
-
const { targetId, settingId, resultList } = validPayload;
|
|
43
|
-
const details: ReviewDetails = {
|
|
44
|
-
targetId,
|
|
45
|
-
settingId,
|
|
46
|
-
resultList,
|
|
47
|
-
};
|
|
48
|
-
const name = `Review on ${reviewSetting?.details?.name}`;
|
|
49
|
-
return {
|
|
50
|
-
name,
|
|
51
|
-
category: CategoryReview.REVIEW,
|
|
52
|
-
value: "",
|
|
53
|
-
tagList: [],
|
|
54
|
-
details,
|
|
55
|
-
};
|
|
56
|
-
},
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
);
|
|
1
|
+
import { createTarget, getTarget, validateWith } from "../../core.api";
|
|
2
|
+
import { BaseValidator } from "../../core.utils";
|
|
3
|
+
import { CategoryReview, ReviewV2 as Review, ReviewV2Details as ReviewDetails } from "../review.interface";
|
|
4
|
+
import { ReviewSetting } from "../review-setting.interface";
|
|
5
|
+
|
|
6
|
+
export interface PostReviewPayload {
|
|
7
|
+
targetId: ReviewDetails["targetId"];
|
|
8
|
+
settingId: ReviewDetails["settingId"];
|
|
9
|
+
resultList: ReviewDetails["resultList"];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export class PostReviewValidator extends BaseValidator<PostReviewPayload> {
|
|
13
|
+
protected requiredFields: (keyof PostReviewPayload)[] = ["targetId", "targetId", "resultList"];
|
|
14
|
+
protected optionalFields: (keyof PostReviewPayload)[] = [];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const postReview = validateWith<PostReviewPayload, PostReviewValidator>(PostReviewValidator)(
|
|
18
|
+
async (validPayload: PostReviewPayload) => {
|
|
19
|
+
const { targetId, settingId, resultList } = validPayload;
|
|
20
|
+
|
|
21
|
+
// Check Target
|
|
22
|
+
if (targetId != null) {
|
|
23
|
+
const { data: possibleTarget } = await getTarget({
|
|
24
|
+
id: targetId,
|
|
25
|
+
});
|
|
26
|
+
// TODO
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Check ReviewSetting
|
|
30
|
+
const { data: _reviewSetting } = await getTarget({
|
|
31
|
+
id: settingId,
|
|
32
|
+
});
|
|
33
|
+
if (_reviewSetting == null) {
|
|
34
|
+
console.error("[postReview] ReviewSetting not found");
|
|
35
|
+
throw new Error("[postReview] ReviewSetting not found");
|
|
36
|
+
}
|
|
37
|
+
const reviewSetting = _reviewSetting as ReviewSetting;
|
|
38
|
+
|
|
39
|
+
return createTarget<Review, PostReviewPayload>({
|
|
40
|
+
payload: validPayload,
|
|
41
|
+
createFn: (validPayload) => {
|
|
42
|
+
const { targetId, settingId, resultList } = validPayload;
|
|
43
|
+
const details: ReviewDetails = {
|
|
44
|
+
targetId,
|
|
45
|
+
settingId,
|
|
46
|
+
resultList,
|
|
47
|
+
};
|
|
48
|
+
const name = `Review on ${reviewSetting?.details?.name}`;
|
|
49
|
+
return {
|
|
50
|
+
name,
|
|
51
|
+
category: CategoryReview.REVIEW,
|
|
52
|
+
value: "",
|
|
53
|
+
tagList: [],
|
|
54
|
+
details,
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
);
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { Target } from "../core.interface";
|
|
2
|
-
|
|
3
|
-
export interface ReviewSetting extends Target {
|
|
4
|
-
category: CategoryReviewSetting;
|
|
5
|
-
details: ReviewSettingDetails;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export enum CategoryReviewSetting {
|
|
9
|
-
REVIEW_SETTING = "review-setting",
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export type ReviewSettingDetails = {
|
|
13
|
-
name: string;
|
|
14
|
-
questionList: ReviewQuestion[];
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export interface ReviewQuestion {
|
|
18
|
-
title: string;
|
|
19
|
-
/** uuid */
|
|
20
|
-
key: string;
|
|
21
|
-
type: "$boolean" | "$text" | "$number" | "$choice" | "$custom";
|
|
22
|
-
/** To provide data when rendering a question */
|
|
23
|
-
refTargetId?: string;
|
|
24
|
-
/** To render a custom question */
|
|
25
|
-
customTargetId?: string;
|
|
26
|
-
}
|
|
1
|
+
import { Target } from "../core.interface";
|
|
2
|
+
|
|
3
|
+
export interface ReviewSetting extends Target {
|
|
4
|
+
category: CategoryReviewSetting;
|
|
5
|
+
details: ReviewSettingDetails;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export enum CategoryReviewSetting {
|
|
9
|
+
REVIEW_SETTING = "review-setting",
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type ReviewSettingDetails = {
|
|
13
|
+
name: string;
|
|
14
|
+
questionList: ReviewQuestion[];
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export interface ReviewQuestion {
|
|
18
|
+
title: string;
|
|
19
|
+
/** uuid */
|
|
20
|
+
key: string;
|
|
21
|
+
type: "$boolean" | "$text" | "$number" | "$choice" | "$custom";
|
|
22
|
+
/** To provide data when rendering a question */
|
|
23
|
+
refTargetId?: string;
|
|
24
|
+
/** To render a custom question */
|
|
25
|
+
customTargetId?: string;
|
|
26
|
+
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { Target } from "../core.interface";
|
|
2
|
-
import { ReviewQuestion } from "./review-setting.interface";
|
|
3
|
-
|
|
4
|
-
/** Instance of ReviewSetting */
|
|
5
|
-
export interface ReviewV2 extends Target {
|
|
6
|
-
category: CategoryReview;
|
|
7
|
-
details: ReviewV2Details;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export enum CategoryReview {
|
|
11
|
-
REVIEW = "review",
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export type ReviewV2Details = {
|
|
15
|
-
targetId: string | null;
|
|
16
|
-
/** How to collect reviews from users and how to parse the results */
|
|
17
|
-
settingId: string;
|
|
18
|
-
resultList: ReviewResult[];
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
export interface ReviewResult extends ReviewQuestion {
|
|
22
|
-
answer: unknown;
|
|
23
|
-
}
|
|
1
|
+
import { Target } from "../core.interface";
|
|
2
|
+
import { ReviewQuestion } from "./review-setting.interface";
|
|
3
|
+
|
|
4
|
+
/** Instance of ReviewSetting */
|
|
5
|
+
export interface ReviewV2 extends Target {
|
|
6
|
+
category: CategoryReview;
|
|
7
|
+
details: ReviewV2Details;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export enum CategoryReview {
|
|
11
|
+
REVIEW = "review",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type ReviewV2Details = {
|
|
15
|
+
targetId: string | null;
|
|
16
|
+
/** How to collect reviews from users and how to parse the results */
|
|
17
|
+
settingId: string;
|
|
18
|
+
resultList: ReviewResult[];
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export interface ReviewResult extends ReviewQuestion {
|
|
22
|
+
answer: unknown;
|
|
23
|
+
}
|