@@ -19,6 +19,7 @@ import {
1919 getPendingRequestsFromUser ,
2020 getPendingRequestsToUser ,
2121} from "./requests" ;
22+ import { getUserByID } from "./users" ;
2223
2324export async function getOverview (
2425 user : UserID ,
@@ -35,59 +36,17 @@ export async function getOverview(
3536
3637 //マッチングしている人のオーバービュー
3738 const matchingOverview = await Promise . all (
38- matched . value . map ( async ( friend ) => {
39- const lastMessageResult = await getLastMessage ( user , friend . id ) ;
40- const lastMessage = lastMessageResult . ok
41- ? lastMessageResult . value
42- : undefined ;
43- const overview : DMOverview = {
44- isDM : true ,
45- matchingStatus : "matched" ,
46- friendId : friend . id ,
47- name : friend . name ,
48- thumbnail : friend . pictureUrl ,
49- lastMsg : lastMessage ,
50- } ;
51- return overview ;
52- } ) ,
39+ matched . value . map ( async ( m ) => getOverviewBetween ( user , m . id ) ) ,
5340 ) ;
5441
5542 //自分にリクエストを送ってきた人のオーバービュー
5643 const senderOverview = await Promise . all (
57- senders . value . map ( async ( sender ) => {
58- const lastMessageResult = await getLastMessage ( user , sender . id ) ;
59- const lastMessage = lastMessageResult . ok
60- ? lastMessageResult . value
61- : undefined ;
62- const overview : DMOverview = {
63- isDM : true ,
64- matchingStatus : "otherRequest" ,
65- friendId : sender . id ,
66- name : sender . name ,
67- thumbnail : sender . pictureUrl ,
68- lastMsg : lastMessage ,
69- } ;
70- return overview ;
71- } ) ,
44+ senders . value . map ( ( s ) => getOverviewBetween ( user , s . id ) ) ,
7245 ) ;
7346
7447 //自分がリクエストを送った人のオーバービュー
7548 const receiverOverview = await Promise . all (
76- receivers . value . map ( async ( receiver ) => {
77- const lastMessageResult = await getLastMessage ( user , receiver . id ) ;
78- const lastMessage = lastMessageResult . ok
79- ? lastMessageResult . value
80- : undefined ;
81- const overview : DMOverview = {
82- isDM : true ,
83- matchingStatus : "myRequest" ,
84- friendId : receiver . id ,
85- name : receiver . name ,
86- thumbnail : receiver . pictureUrl ,
87- lastMsg : lastMessage ,
88- } ;
89- return overview ;
90- } ) ,
49+ receivers . value . map ( ( r ) => getOverviewBetween ( user , r . id ) ) ,
9150 ) ;
9251
9352 const sharedRooms : {
@@ -130,6 +89,67 @@ export async function getOverview(
13089 }
13190}
13291
92+ async function getOverviewBetween (
93+ user : number ,
94+ other : number ,
95+ ) : Promise < DMOverview > {
96+ const relR = await getRelation ( user , other ) ;
97+ if ( ! relR . ok ) throw relR . error ;
98+ const rel = relR . value ;
99+
100+ const friendId =
101+ rel . receivingUserId === user ? rel . sendingUserId : rel . receivingUserId ;
102+ const lastMessage = getLastMessage ( user , friendId ) . then ( ( val ) => {
103+ if ( val . ok ) return val . value ;
104+ return undefined ;
105+ } ) ;
106+ const unreadCount = unreadMessages ( user , rel . id ) . then ( ( val ) => {
107+ if ( val . ok ) return val . value ;
108+ throw val . error ;
109+ } ) ;
110+ const friend = await getUserByID ( friendId ) . then ( ( val ) => {
111+ if ( val . ok ) return val . value ;
112+ throw val . error ;
113+ } ) ;
114+ const overview : DMOverview = {
115+ isDM : true ,
116+ matchingStatus : "matched" ,
117+ friendId : friendId ,
118+ name : friend . name ,
119+ thumbnail : friend . pictureUrl ,
120+ lastMsg : await lastMessage ,
121+ unreadMessages : await unreadCount ,
122+ } ;
123+ return overview ;
124+ }
125+ export async function markAsRead (
126+ rel : RelationshipID ,
127+ reader : UserID ,
128+ message : MessageID ,
129+ ) {
130+ const val = {
131+ readerId : reader ,
132+ messageId : message ,
133+ relationId : rel ,
134+ } ;
135+ return await prisma . message . updateMany ( {
136+ where : {
137+ id : {
138+ lte : message ,
139+ } ,
140+ relationId : rel ,
141+ creator : {
142+ not : {
143+ equals : reader ,
144+ } ,
145+ } ,
146+ } ,
147+ data : {
148+ read : true ,
149+ } ,
150+ } ) ;
151+ }
152+
133153/**
134154 * DM の送信
135155 * 送信者の id は呼び出す側で指定すること
@@ -142,6 +162,7 @@ export async function sendDM(
142162 const message = await prisma . message . create ( {
143163 data : {
144164 relationId : relation ,
165+ read : false ,
145166 ...content ,
146167 } ,
147168 } ) ;
@@ -372,3 +393,24 @@ export async function getLastMessage(
372393 return Err ( e ) ;
373394 }
374395}
396+
397+ // only works on Relationship (= DM) for now.
398+ export async function unreadMessages ( userId : UserID , roomId : RelationshipID ) {
399+ try {
400+ // FIXME: this makes request twice to the database. it's not efficient.
401+ const unreadMessages = await prisma . message . count ( {
402+ where : {
403+ read : false ,
404+ relationId : roomId ,
405+ creator : {
406+ not : {
407+ equals : userId ,
408+ } ,
409+ } ,
410+ } ,
411+ } ) ;
412+ return Ok ( unreadMessages ) ;
413+ } catch ( e ) {
414+ return Err ( e ) ;
415+ }
416+ }
0 commit comments