@@ -10,6 +10,7 @@ import {
1010 Resolver ,
1111 UseMiddleware ,
1212} from "type-graphql" ;
13+ import { LessThan } from "typeorm" ;
1314import Group from "../entities/Group" ;
1415import { GroupMember } from "../entities/GroupMember" ;
1516import { Message } from "../entities/Message" ;
@@ -39,6 +40,39 @@ class GroupMessagesOutput {
3940
4041 @Field ( ( ) => [ Message ] )
4142 messages : Message [ ] ;
43+
44+ @Field ( )
45+ lastTempstampVu : Date ;
46+ }
47+
48+ @InputType ( )
49+ class GetLazyMessagesInput {
50+ @Field ( )
51+ groupId : number ;
52+
53+ @Field ( )
54+ oldTimestamp : string ;
55+ }
56+
57+ @ObjectType ( )
58+ class GetLazyMessagesOutput {
59+ @Field ( )
60+ isMaximumMessages : boolean ;
61+
62+ @Field ( ( ) => [ Message ] )
63+ messages : Message [ ] ;
64+ }
65+
66+ @InputType ( )
67+ class SetLastMessageVuInput {
68+ @Field ( )
69+ groupId : number ;
70+ }
71+
72+ @ObjectType ( )
73+ class SetLastMessageVuOutput {
74+ @Field ( )
75+ sucess : boolean ;
4276}
4377
4478@Resolver ( Group )
@@ -60,17 +94,17 @@ export default class MessageResolver {
6094 order : { id : "DESC" } ,
6195 } ) ;
6296
63- const reponse : { groupId : number ; messages : Message [ ] } [ ] = [ ] ;
97+ const reponse : { groupId : number ; messages : Message [ ] ; lastTempstampVu : Date } [ ] = [ ] ;
6498
65- // charge les 10 derniers messages de chaque groupe
99+ // charge les 40 derniers messages de chaque groupe
66100 for ( const group of groups ) {
67101 const messages = await Message . find ( {
68102 where : { group : { id : group . id } } ,
69103 relations : { user : true } ,
70104 order : { createdAt : "DESC" } ,
71- take : 20 ,
105+ take : 40 ,
72106 } ) ;
73- reponse . push ( { groupId : group . id , messages } ) ;
107+ reponse . push ( { groupId : group . id , messages, lastTempstampVu : group . groupMember [ 0 ] . lastTempstampVu } ) ;
74108 }
75109
76110 return reponse ;
@@ -112,4 +146,67 @@ export default class MessageResolver {
112146 relations : [ "user" , "group" ] ,
113147 } ) ;
114148 }
149+
150+ @UseMiddleware ( RoleMiddleware ( ) )
151+ @Query ( ( ) => GetLazyMessagesOutput )
152+ async getLazyMessages ( @Arg ( "data" ) data : GetLazyMessagesInput ) {
153+ const { groupId, oldTimestamp } = data ;
154+
155+ let oldDate : Date ;
156+ try {
157+ oldDate = new Date ( oldTimestamp ) ;
158+ if ( Number . isNaN ( oldDate . getTime ( ) ) ) {
159+ throw new Error ( "Invalid date" ) ;
160+ }
161+ } catch {
162+ throw new Error ( "Invalid date format" ) ;
163+ }
164+
165+ // récupère les 40 premiers messages plus anciens que oldTimestamp
166+ const messages = await Message . find ( {
167+ where : { group : { id : groupId } , createdAt : LessThan ( oldDate ) } ,
168+ relations : { user : true } ,
169+ order : { createdAt : "DESC" } ,
170+ take : 40 ,
171+ } ) ;
172+
173+ const oldestMessage = await Message . findOne ( {
174+ where : { group : { id : groupId } } ,
175+ order : { createdAt : "ASC" } ,
176+ select : { id : true , createdAt : true } ,
177+ } ) ;
178+
179+ const isMaximumMessages = oldestMessage ? messages . some ( ( msg ) => msg . id === oldestMessage . id ) : true ;
180+
181+ // renvoie les messages et si c'est tout les messages
182+ return { isMaximumMessages, messages : messages } ;
183+ }
184+
185+ // met a jour le vu du dernier message pour un groupe donné
186+ @UseMiddleware ( RoleMiddleware ( ) )
187+ @Mutation ( ( ) => SetLastMessageVuOutput )
188+ async setLastMessageVu ( @Arg ( "data" ) data : SetLastMessageVuInput , @Ctx ( ) ctx : ContextType ) {
189+ const { groupId } = data ;
190+
191+ const userId = ctx . user ?. id ;
192+ if ( ! userId ) throw new Error ( "Utilisateur non authentifié" ) ;
193+
194+ // récupère le dernier message du groupe
195+ const lastMessage = await Message . findOne ( {
196+ where : { group : { id : groupId } } ,
197+ order : { createdAt : "DESC" } ,
198+ } ) ;
199+
200+ if ( lastMessage ) {
201+ // met a jour le vu du dernier message pour l'utilisateur
202+ await GroupMember . update (
203+ { user : { id : userId } , group : { id : groupId } } ,
204+ { lastTempstampVu : lastMessage . createdAt } ,
205+ ) ;
206+
207+ return { sucess : true } ;
208+ }
209+
210+ return { sucess : false } ;
211+ }
115212}
0 commit comments