Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit0234293

Browse files
committed
feat: add galgame rating related apis
1 parentd87d11c commit0234293

File tree

20 files changed

+403
-3
lines changed

20 files changed

+403
-3
lines changed

‎app/api/patch/rating/create.ts‎

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import{z}from'zod'
2+
import{prisma}from'~/prisma/index'
3+
import{patchRatingCreateSchema}from'~/validations/patch'
4+
5+
exportconstcreatePatchRating=async(
6+
input:z.infer<typeofpatchRatingCreateSchema>,
7+
uid:number
8+
)=>{
9+
const{
10+
patchId,
11+
recommend,
12+
overall,
13+
playStatus,
14+
shortSummary,
15+
spoilerLevel
16+
}=input
17+
18+
constexists=awaitprisma.patch_rating.findUnique({
19+
where:{
20+
user_id_patch_id:{user_id:uid,patch_id:patchId}
21+
}
22+
})
23+
if(exists){
24+
return'您已经评价过该补丁'
25+
}
26+
27+
constdata=awaitprisma.patch_rating.create({
28+
data:{
29+
patch_id:patchId,
30+
user_id:uid,
31+
recommend,
32+
overall,
33+
play_status:playStatus,
34+
short_summary:shortSummary,
35+
spoiler_level:spoilerLevel
36+
},
37+
include:{
38+
patch:{
39+
select:{
40+
unique_id:true
41+
}
42+
},
43+
user:{
44+
select:{
45+
id:true,
46+
name:true,
47+
avatar:true
48+
}
49+
}
50+
}
51+
})
52+
53+
return{
54+
id:data.id,
55+
uniqueId:data.patch.unique_id,
56+
recommend:data.recommend,
57+
overall:data.overall,
58+
playStatus:data.play_status,
59+
shortSummary:data.short_summary,
60+
spoilerLevel:data.spoiler_level,
61+
isLike:false,
62+
likeCount:0,
63+
userId:data.user_id,
64+
patchId:data.patch_id,
65+
created:String(data.created),
66+
updated:String(data.updated),
67+
user:data.user
68+
}
69+
}

‎app/api/patch/rating/delete.ts‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import{z}from'zod'
2+
import{prisma}from'~/prisma/index'
3+
4+
constratingIdSchema=z.object({
5+
ratingId:z.coerce.number({message:'ID 不正确'}).min(1).max(9999999)
6+
})
7+
8+
exportconstdeletePatchRating=async(
9+
input:z.infer<typeofratingIdSchema>,
10+
uid:number,
11+
userRole:number
12+
)=>{
13+
constrating=awaitprisma.patch_rating.findUnique({
14+
where:{id:input.ratingId}
15+
})
16+
if(!rating){
17+
return'评价不存在'
18+
}
19+
20+
if(rating.user_id!==uid&&userRole<3){
21+
return'您没有权限删除该评价'
22+
}
23+
24+
awaitprisma.patch_rating.delete({where:{id:input.ratingId}})
25+
return{}
26+
}

‎app/api/patch/rating/get.ts‎

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import{z}from'zod'
2+
import{prisma}from'~/prisma/index'
3+
4+
constpatchIdSchema=z.object({
5+
patchId:z.coerce.number().min(1).max(9999999)
6+
})
7+
8+
exportconstgetPatchRating=async(
9+
input:z.infer<typeofpatchIdSchema>,
10+
uid:number
11+
)=>{
12+
const{ patchId}=input
13+
14+
constdata=awaitprisma.patch_rating.findMany({
15+
where:{patch_id:patchId},
16+
include:{
17+
patch:{select:{unique_id:true}},
18+
user:true,
19+
_count:{
20+
select:{like:true}
21+
},
22+
like:{
23+
where:{
24+
user_id:uid
25+
}
26+
}
27+
}
28+
})
29+
30+
constratings=data.map((rating)=>({
31+
id:rating.id,
32+
uniqueId:rating.patch.unique_id,
33+
recommend:rating.recommend,
34+
overall:rating.overall,
35+
playStatus:rating.play_status,
36+
shortSummary:rating.short_summary,
37+
spoilerLevel:rating.spoiler_level,
38+
isLike:rating.like.length>0,
39+
likeCount:rating._count.like,
40+
userId:rating.user_id,
41+
patchId:rating.patch_id,
42+
created:String(rating.created),
43+
updated:String(rating.updated),
44+
user:{
45+
id:rating.user.id,
46+
name:rating.user.name,
47+
avatar:rating.user.avatar
48+
}
49+
}))
50+
51+
returnratings
52+
}

‎app/api/patch/rating/like/route.ts‎

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import{z}from'zod'
2+
import{NextRequest,NextResponse}from'next/server'
3+
import{kunParsePutBody}from'~/app/api/utils/parseQuery'
4+
import{prisma}from'~/prisma/index'
5+
import{verifyHeaderCookie}from'~/middleware/_verifyHeaderCookie'
6+
import{createDedupMessage}from'~/app/api/utils/message'
7+
8+
constratingIdSchema=z.object({
9+
ratingId:z.coerce.number({message:'ID 不正确'}).min(1).max(9999999)
10+
})
11+
12+
exportconsttoggleRatingLike=async(
13+
input:z.infer<typeofratingIdSchema>,
14+
uid:number
15+
)=>{
16+
const{ ratingId}=input
17+
18+
constrating=awaitprisma.patch_rating.findUnique({
19+
where:{id:ratingId},
20+
include:{patch:{select:{unique_id:true,name:true}}}
21+
})
22+
if(!rating){
23+
return'评价不存在'
24+
}
25+
if(rating.user_id===uid){
26+
return'您不能给自己点赞'
27+
}
28+
29+
constexistingLike=awaitprisma.patch_rating_like.findUnique({
30+
where:{
31+
patch_rating_id_user_id:{
32+
patch_rating_id:ratingId,
33+
user_id:uid
34+
}
35+
}
36+
})
37+
38+
returnawaitprisma.$transaction(async(prisma)=>{
39+
if(existingLike){
40+
awaitprisma.patch_rating_like.delete({
41+
where:{
42+
patch_rating_id_user_id:{
43+
patch_rating_id:ratingId,
44+
user_id:uid
45+
}
46+
}
47+
})
48+
}else{
49+
awaitprisma.patch_rating_like.create({
50+
data:{
51+
patch_rating_id:ratingId,
52+
user_id:uid
53+
}
54+
})
55+
}
56+
57+
awaitcreateDedupMessage({
58+
type:'like',
59+
content:`有人点赞了您的 Galgame 评价 ->${rating.short_summary.slice(0,107)}`,
60+
sender_id:uid,
61+
recipient_id:rating.user_id,
62+
link:`/${rating.patch.unique_id}`
63+
})
64+
65+
awaitprisma.user.update({
66+
where:{id:rating.user_id},
67+
data:{moemoepoint:{increment:existingLike ?-1 :1}}
68+
})
69+
70+
return!existingLike
71+
})
72+
}
73+
74+
exportconstPUT=async(req:NextRequest)=>{
75+
constinput=awaitkunParsePutBody(req,ratingIdSchema)
76+
if(typeofinput==='string'){
77+
returnNextResponse.json(input)
78+
}
79+
constpayload=awaitverifyHeaderCookie(req)
80+
if(!payload){
81+
returnNextResponse.json('请先登录')
82+
}
83+
84+
constresponse=awaittoggleRatingLike(input,payload.uid)
85+
returnNextResponse.json(response)
86+
}

‎app/api/patch/rating/route.ts‎

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import{z}from'zod'
2+
import{NextRequest,NextResponse}from'next/server'
3+
import{
4+
kunParseDeleteQuery,
5+
kunParseGetQuery,
6+
kunParsePostBody,
7+
kunParsePutBody
8+
}from'~/app/api/utils/parseQuery'
9+
import{verifyHeaderCookie}from'~/middleware/_verifyHeaderCookie'
10+
import{
11+
patchRatingCreateSchema,
12+
patchRatingUpdateSchema
13+
}from'~/validations/patch'
14+
import{getPatchRating}from'./get'
15+
import{createPatchRating}from'./create'
16+
import{updatePatchRating}from'./update'
17+
import{deletePatchRating}from'./delete'
18+
19+
constpatchIdSchema=z.object({
20+
patchId:z.coerce.number().min(1).max(9999999)
21+
})
22+
23+
constratingIdSchema=z.object({
24+
ratingId:z.coerce
25+
.number({message:'patch rating ID 不正确'})
26+
.min(1)
27+
.max(9999999)
28+
})
29+
30+
exportconstGET=async(req:NextRequest)=>{
31+
constinput=kunParseGetQuery(req,patchIdSchema)
32+
if(typeofinput==='string'){
33+
returnNextResponse.json(input)
34+
}
35+
constpayload=awaitverifyHeaderCookie(req)
36+
37+
constresponse=awaitgetPatchRating(input,payload?.uid??0)
38+
returnNextResponse.json(response)
39+
}
40+
41+
exportconstPOST=async(req:NextRequest)=>{
42+
constinput=awaitkunParsePostBody(req,patchRatingCreateSchema)
43+
if(typeofinput==='string'){
44+
returnNextResponse.json(input)
45+
}
46+
constpayload=awaitverifyHeaderCookie(req)
47+
if(!payload){
48+
returnNextResponse.json('用户未登录')
49+
}
50+
51+
constresponse=awaitcreatePatchRating(input,payload.uid)
52+
returnNextResponse.json(response)
53+
}
54+
55+
exportconstPUT=async(req:NextRequest)=>{
56+
constinput=awaitkunParsePutBody(req,patchRatingUpdateSchema)
57+
if(typeofinput==='string'){
58+
returnNextResponse.json(input)
59+
}
60+
constpayload=awaitverifyHeaderCookie(req)
61+
if(!payload){
62+
returnNextResponse.json('用户未登录')
63+
}
64+
65+
constresponse=awaitupdatePatchRating(input,payload.uid,payload.role)
66+
returnNextResponse.json(response)
67+
}
68+
69+
exportconstDELETE=async(req:NextRequest)=>{
70+
constinput=kunParseDeleteQuery(req,ratingIdSchema)
71+
if(typeofinput==='string'){
72+
returnNextResponse.json(input)
73+
}
74+
constpayload=awaitverifyHeaderCookie(req)
75+
if(!payload){
76+
returnNextResponse.json('用户未登录')
77+
}
78+
79+
constresponse=awaitdeletePatchRating(input,payload.uid,payload.role)
80+
returnNextResponse.json(response)
81+
}

‎app/api/patch/rating/update.ts‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import{z}from'zod'
2+
import{prisma}from'~/prisma/index'
3+
import{patchRatingUpdateSchema}from'~/validations/patch'
4+
5+
exportconstupdatePatchRating=async(
6+
input:z.infer<typeofpatchRatingUpdateSchema>,
7+
uid:number,
8+
userRole:number
9+
)=>{
10+
const{
11+
ratingId,
12+
patchId,
13+
recommend,
14+
overall,
15+
playStatus,
16+
shortSummary,
17+
spoilerLevel
18+
}=input
19+
20+
constrating=awaitprisma.patch_rating.findUnique({
21+
where:{id:ratingId}
22+
})
23+
if(!rating){
24+
return'评价不存在'
25+
}
26+
constratingUserUid=rating.user_id
27+
if(rating.user_id!==uid&&userRole<3){
28+
return'您没有权限更新该评价'
29+
}
30+
31+
awaitprisma.patch_rating.update({
32+
where:{id:ratingId,user_id:ratingUserUid},
33+
data:{
34+
patch_id:patchId,
35+
recommend,
36+
overall,
37+
play_status:playStatus,
38+
short_summary:shortSummary,
39+
spoiler_level:spoilerLevel
40+
}
41+
})
42+
43+
return{}
44+
}

‎components/patch/header/Tabs.tsx‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ export const PatchHeaderTabs = ({
4444
<CommentTabid={id}/>
4545
</Tab>
4646

47-
<Tabkey="rating"title="游戏评价"className="p-0 min-w-20">
48-
<CommentTabid={id}/>
49-
</Tab>
47+
<Tabkey="rating"title="游戏评价"className="p-0 min-w-20"></Tab>
5048
</Tabs>
5149
)
5250
}
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp