Skip to content

Commit 0f75874

Browse files
committed
Merge branch 'main' of github.com:ut-code/CourseMate into feat/Card-with-interests
2 parents 13239bb + e24eec3 commit 0f75874

File tree

15 files changed

+303
-58
lines changed

15 files changed

+303
-58
lines changed

.github/workflows/rust.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ jobs:
2222
~/.rustup/
2323
scraper/target
2424
key: cargo-cache-${{ github.job }}-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}
25-
- uses: actions-rust-lang/setup-rust-toolchain@v1
25+
- uses: dtolnay/rust-toolchain@v1
2626
with:
27+
toolchain: 1.82.0
2728
components: clippy,rustfmt
2829
- run: cargo build
2930
- run: cargo build --release

common/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export type {
77
Gender,
88
RelationshipStatus,
99
InterestSubject,
10+
Interest,
1011
User,
1112
InitUser,
1213
UpdateUser,
@@ -17,6 +18,7 @@ export type {
1718
Course,
1819
Enrollment,
1920
Day,
21+
UserWithCoursesAndSubjects,
2022
MessageID,
2123
ShareRoomID,
2224
Message,

common/zod/schemas.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ export const InterestSubjectSchema = z.object({
3838
group: z.string(),
3939
});
4040

41+
export const InterestSchema = z.object({
42+
userId: UserIDSchema,
43+
subjectId: z.number(),
44+
});
45+
4146
export const UserSchema = z.object({
4247
id: UserIDSchema,
4348
guid: GUIDSchema,
@@ -103,6 +108,11 @@ export const EnrollmentSchema = z.object({
103108
courseId: CourseIDSchema,
104109
});
105110

111+
export const UserWithCoursesAndSubjectsSchema = UserSchema.extend({
112+
courses: CourseSchema.array(),
113+
interestSubjects: InterestSubjectSchema.array(),
114+
});
115+
106116
export const MessageIDSchema = z.number(); // TODO! Add __internal_prevent_cast_MessageID: PhantomData
107117
export const ShareRoomIDSchema = z.number();
108118

common/zod/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import type {
1414
InitRoomSchema,
1515
InitSharedRoomSchema,
1616
InitUserSchema,
17+
InterestSchema,
1718
InterestSubjectSchema,
1819
IntroLongSchema,
1920
IntroShortSchema,
@@ -37,6 +38,7 @@ import type {
3738
UpdateUserSchema,
3839
UserIDSchema,
3940
UserSchema,
41+
UserWithCoursesAndSubjectsSchema,
4042
} from "./schemas";
4143

4244
export type UserID = z.infer<typeof UserIDSchema>;
@@ -47,6 +49,7 @@ export type PictureUrl = z.infer<typeof PictureUrlSchema>;
4749
export type Gender = z.infer<typeof GenderSchema>;
4850
export type RelationshipStatus = z.infer<typeof RelationshipStatusSchema>;
4951
export type InterestSubject = z.infer<typeof InterestSubjectSchema>;
52+
export type Interest = z.infer<typeof InterestSchema>;
5053
export type User = z.infer<typeof UserSchema>;
5154
export type InitUser = z.infer<typeof InitUserSchema>;
5255
export type UpdateUser = z.infer<typeof UpdateUserSchema>;
@@ -59,6 +62,9 @@ export type Course = z.infer<typeof CourseSchema>;
5962
export type Enrollment = z.infer<typeof EnrollmentSchema>;
6063
export type Day = z.infer<typeof DaySchema>;
6164
export type Period = z.infer<typeof PeriodSchema>;
65+
export type UserWithCoursesAndSubjects = z.infer<
66+
typeof UserWithCoursesAndSubjectsSchema
67+
>;
6268
export type MessageID = z.infer<typeof MessageIDSchema>;
6369
export type ShareRoomID = z.infer<typeof ShareRoomIDSchema>;
6470
export type Message = z.infer<typeof MessageSchema>;

server/src/database/requests.ts

Lines changed: 100 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { Err, Ok, type Result } from "common/lib/result";
2-
import type { Relationship, User, UserID } from "common/types";
2+
import type {
3+
Relationship,
4+
UserID,
5+
UserWithCoursesAndSubjects,
6+
} from "common/types";
37
import { prisma } from "./client";
48

59
// マッチリクエストの送信
@@ -114,7 +118,7 @@ export async function cancelRequest(
114118
//ユーザーへのリクエストを探す 俺をリクエストしているのは誰だ
115119
export async function getPendingRequestsToUser(
116120
userId: UserID,
117-
): Promise<Result<User[]>> {
121+
): Promise<Result<UserWithCoursesAndSubjects[]>> {
118122
try {
119123
const found = await prisma.user.findMany({
120124
where: {
@@ -125,8 +129,37 @@ export async function getPendingRequestsToUser(
125129
},
126130
},
127131
},
132+
include: {
133+
enrollments: {
134+
include: {
135+
course: {
136+
include: {
137+
enrollments: true,
138+
slots: true,
139+
},
140+
},
141+
},
142+
},
143+
interests: {
144+
include: {
145+
subject: true,
146+
},
147+
},
148+
},
128149
});
129-
return Ok(found);
150+
return Ok(
151+
found.map((user) => {
152+
return {
153+
...user,
154+
interestSubjects: user.interests.map((interest) => {
155+
return interest.subject;
156+
}),
157+
courses: user.enrollments.map((enrollment) => {
158+
return enrollment.course;
159+
}),
160+
};
161+
}),
162+
);
130163
} catch (e) {
131164
return Err(e);
132165
}
@@ -135,7 +168,7 @@ export async function getPendingRequestsToUser(
135168
//ユーザーがリクエストしている人を探す 俺がリクエストしているのは誰だ
136169
export async function getPendingRequestsFromUser(
137170
userId: UserID,
138-
): Promise<Result<User[]>> {
171+
): Promise<Result<UserWithCoursesAndSubjects[]>> {
139172
try {
140173
const found = await prisma.user.findMany({
141174
where: {
@@ -146,15 +179,46 @@ export async function getPendingRequestsFromUser(
146179
},
147180
},
148181
},
182+
include: {
183+
enrollments: {
184+
include: {
185+
course: {
186+
include: {
187+
enrollments: true,
188+
slots: true,
189+
},
190+
},
191+
},
192+
},
193+
interests: {
194+
include: {
195+
subject: true,
196+
},
197+
},
198+
},
149199
});
150-
return Ok(found);
200+
return Ok(
201+
found.map((user) => {
202+
return {
203+
...user,
204+
interestSubjects: user.interests.map((interest) => {
205+
return interest.subject;
206+
}),
207+
courses: user.enrollments.map((enrollment) => {
208+
return enrollment.course;
209+
}),
210+
};
211+
}),
212+
);
151213
} catch (e) {
152214
return Err(e);
153215
}
154216
}
155217

156218
//マッチした人の取得
157-
export async function getMatchedUser(userId: UserID): Promise<Result<User[]>> {
219+
export async function getMatchedUser(
220+
userId: UserID,
221+
): Promise<Result<UserWithCoursesAndSubjects[]>> {
158222
try {
159223
const found = await prisma.user.findMany({
160224
where: {
@@ -177,8 +241,37 @@ export async function getMatchedUser(userId: UserID): Promise<Result<User[]>> {
177241
},
178242
],
179243
},
244+
include: {
245+
enrollments: {
246+
include: {
247+
course: {
248+
include: {
249+
enrollments: true,
250+
slots: true,
251+
},
252+
},
253+
},
254+
},
255+
interests: {
256+
include: {
257+
subject: true,
258+
},
259+
},
260+
},
180261
});
181-
return Ok(found);
262+
return Ok(
263+
found.map((user) => {
264+
return {
265+
...user,
266+
interestSubjects: user.interests.map((interest) => {
267+
return interest.subject;
268+
}),
269+
courses: user.enrollments.map((enrollment) => {
270+
return enrollment.course;
271+
}),
272+
};
273+
}),
274+
);
182275
} catch (e) {
183276
return Err(e);
184277
}

server/src/database/users.ts

Lines changed: 103 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
import { Err, Ok, type Result } from "common/lib/result";
2-
import type { GUID, UpdateUser, User, UserID } from "common/types";
2+
import type {
3+
Course,
4+
GUID,
5+
InterestSubject,
6+
UpdateUser,
7+
User,
8+
UserID,
9+
UserWithCoursesAndSubjects,
10+
} from "common/types";
311
import { prisma } from "./client";
412

513
// ユーザーの作成
@@ -17,15 +25,42 @@ export async function createUser(
1725
}
1826

1927
// ユーザーの取得
20-
export async function getUser(guid: GUID): Promise<Result<User>> {
28+
export async function getUser(
29+
guid: GUID,
30+
): Promise<Result<UserWithCoursesAndSubjects>> {
2131
try {
2232
const user = await prisma.user.findUnique({
2333
where: {
2434
guid: guid,
2535
},
36+
include: {
37+
enrollments: {
38+
include: {
39+
course: {
40+
include: {
41+
enrollments: true,
42+
slots: true,
43+
},
44+
},
45+
},
46+
},
47+
interests: {
48+
include: {
49+
subject: true,
50+
},
51+
},
52+
},
2653
});
2754
if (!user) return Err(404);
28-
return Ok(user);
55+
return Ok({
56+
...user,
57+
interestSubjects: user.interests.map((interest) => {
58+
return interest.subject;
59+
}),
60+
courses: user.enrollments.map((enrollment) => {
61+
return enrollment.course;
62+
}),
63+
});
2964
} catch (e) {
3065
return Err(e);
3166
}
@@ -50,14 +85,42 @@ export async function getUserIDByGUID(guid: GUID): Promise<Result<UserID>> {
5085
.catch((err) => Err(err));
5186
}
5287

53-
export async function getUserByID(id: UserID): Promise<Result<User>> {
88+
export async function getUserByID(
89+
id: UserID,
90+
): Promise<Result<UserWithCoursesAndSubjects>> {
5491
try {
5592
const user = await prisma.user.findUnique({
5693
where: {
5794
id,
5895
},
96+
include: {
97+
enrollments: {
98+
include: {
99+
course: {
100+
include: {
101+
enrollments: true,
102+
slots: true,
103+
},
104+
},
105+
},
106+
},
107+
interests: {
108+
include: {
109+
subject: true,
110+
},
111+
},
112+
},
113+
});
114+
if (!user) return Err(404);
115+
return Ok({
116+
...user,
117+
interestSubjects: user.interests.map((interest) => {
118+
return interest.subject;
119+
}),
120+
courses: user.enrollments.map((enrollment) => {
121+
return enrollment.course;
122+
}),
59123
});
60-
return user === null ? Err(404) : Ok(user);
61124
} catch (e) {
62125
return Err(e);
63126
}
@@ -100,10 +163,42 @@ export async function deleteUser(userId: UserID): Promise<Result<User>> {
100163
}
101164

102165
// ユーザーの全取得
103-
export async function getAllUsers(): Promise<Result<User[]>> {
166+
export async function getAllUsers(): Promise<
167+
Result<(User & { courses: Course[]; interestSubjects: InterestSubject[] })[]>
168+
> {
104169
try {
105-
const users = await prisma.user.findMany();
106-
return Ok(users);
170+
const users = await prisma.user.findMany({
171+
include: {
172+
enrollments: {
173+
include: {
174+
course: {
175+
include: {
176+
enrollments: true,
177+
slots: true,
178+
},
179+
},
180+
},
181+
},
182+
interests: {
183+
include: {
184+
subject: true,
185+
},
186+
},
187+
},
188+
});
189+
return Ok(
190+
users.map((user) => {
191+
return {
192+
...user,
193+
interestSubjects: user.interests.map((interest) => {
194+
return interest.subject;
195+
}),
196+
courses: user.enrollments.map((enrollment) => {
197+
return enrollment.course;
198+
}),
199+
};
200+
}),
201+
);
107202
} catch (e) {
108203
return Err(e);
109204
}

0 commit comments

Comments
 (0)