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.
@@ -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
+ }