-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreviews-service.ts
More file actions
80 lines (68 loc) · 1.82 KB
/
reviews-service.ts
File metadata and controls
80 lines (68 loc) · 1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { eq } from "drizzle-orm";
import { Ok, Err, Result } from "ts-results";
import { Review, Status } from "../models/Review";
import { db } from "../../../db";
import { reviews } from "../../../db/schema";
import { uuid } from "../../../app/common";
export const findByUuid = async (
id: string,
): Promise<Result<Review, Error>> => {
if (!uuid.isValid(id)) {
return Err(new Error("Invalid UUID"));
}
const result = await db.select().from(reviews).where(eq(reviews.uuid, id));
if (result.length === 0) {
return Err(new Error("Review not found"));
}
const review = await convert(result[0]);
return review;
};
export const create = async (
status: Status,
submissionId: number,
body: string,
): Promise<Result<Review, Error>> => {
// TODO: add a check to make sure the submission exists
// TODO: check if submission has already been approved or rejected, handle accordingly
const id = uuid.create();
try {
const result = await db
.insert(reviews)
.values({
uuid: id,
status: Status[status],
body: body,
submissionId: submissionId,
})
.returning();
const review = new Review({
id: result[0].id,
uuid: id,
status: status,
comment: result[0].body,
});
return Ok(review);
} catch (e) {
return Err(new Error("Failed to create review"));
}
};
export const convert = async (result: any): Promise<Result<Review, Error>> => {
let status: Status;
switch (result.status) {
case "APPROVED":
status = Status.APPROVED;
break;
case "REJECTED":
status = Status.REJECTED;
break;
default:
return Err(new Error("Invalid status"));
}
const review = new Review({
id: result.id,
uuid: result.uuid,
status: status,
comment: result.body,
});
return Ok(review);
};