@@ -3,80 +3,83 @@ import { auth } from '$lib/server/auth';
33import { prisma } from '$lib/server/prisma' ;
44import { error , type Handle } from '@sveltejs/kit' ;
55
6+ const API_CACHE_CONTROL = 'private, no-store, max-age=0, must-revalidate' ;
7+
68export const handle : Handle = async ( { event, resolve } ) => {
7- const sessionId = event . cookies . get ( "session_token" ) ;
8- if ( ! sessionId ) {
9- event . locals . user = null ;
10- event . locals . session = null ;
11- return resolve ( event ) ;
12- }
9+ const sessionId = event . cookies . get ( 'session_token' ) ;
1310
14- const { session, user, role} = await auth . validateSession ( sessionId ) ;
15- if ( session == null || user == null ) {
16- event . cookies . set ( "session_token" , "" , {
17- path : '/' ,
18- httpOnly : true ,
19- secure : true ,
20- sameSite : 'lax' ,
21- expires : new Date ( 0 )
22- } ) ;
23- event . locals . user = null ;
24- event . locals . session = null ;
25- event . locals . role = null ;
26- return resolve ( event ) ;
27- }
11+ event . locals . user = null ;
12+ event . locals . session = null ;
13+ event . locals . role = null ;
2814
29- if ( session != null && user != null ) {
30- try {
31- const now = new Date ( ) ;
32- // Throttle session writes to avoid update conflicts on concurrent requests.
33- const minSessionAgeMs = 30_000 ;
34- const sessionCutoff = new Date ( now . getTime ( ) - minSessionAgeMs ) ;
35- await prisma . session . updateMany ( {
36- where :{
37- id : session . id ,
38- OR : [
39- { last_use : { lt : sessionCutoff } } ,
40- { last_use : null }
41- ]
42- } ,
43- data : {
44- last_use : now ,
45- ip : event . getClientAddress ( )
46- }
47- } ) ;
48- // Avoid hammering the user row on every request and reduce update conflicts.
49- const minPingAgeMs = 60_000 ;
50- const cutoff = new Date ( now . getTime ( ) - minPingAgeMs ) ;
51- await prisma . user . updateMany ( {
52- where : {
53- username : user . username ,
54- lastPing : { lt : cutoff }
55- } ,
56- data : {
57- lastPing : now ,
58- }
15+ if ( sessionId ) {
16+ const { session, user, role } = await auth . validateSession ( sessionId ) ;
17+
18+ if ( ! session || ! user ) {
19+ event . cookies . set ( 'session_token' , '' , {
20+ path : '/' ,
21+ httpOnly : true ,
22+ secure : true ,
23+ sameSite : 'lax' ,
24+ expires : new Date ( 0 )
5925 } ) ;
60- } catch ( error_message ) {
61- if ( error_message instanceof Error ) {
62- console . log ( error_message )
63- if ( error_message . name != "PrismaClientUnknownRequestError" ) {
26+ } else {
27+ try {
28+ const now = new Date ( ) ;
29+ // Throttle session writes to avoid update conflicts on concurrent requests.
30+ const minSessionAgeMs = 30_000 ;
31+ const sessionCutoff = new Date ( now . getTime ( ) - minSessionAgeMs ) ;
32+ await prisma . session . updateMany ( {
33+ where : {
34+ id : session . id ,
35+ OR : [
36+ { last_use : { lt : sessionCutoff } } ,
37+ { last_use : null }
38+ ]
39+ } ,
40+ data : {
41+ last_use : now ,
42+ ip : event . getClientAddress ( )
43+ }
44+ } ) ;
45+ // Avoid hammering the user row on every request and reduce update conflicts.
46+ const minPingAgeMs = 60_000 ;
47+ const cutoff = new Date ( now . getTime ( ) - minPingAgeMs ) ;
48+ await prisma . user . updateMany ( {
49+ where : {
50+ username : user . username ,
51+ lastPing : { lt : cutoff }
52+ } ,
53+ data : {
54+ lastPing : now
55+ }
56+ } ) ;
57+ } catch ( error_message ) {
58+ if ( error_message instanceof Error ) {
59+ console . log ( error_message ) ;
60+ if ( error_message . name != 'PrismaClientUnknownRequestError' ) {
61+ error ( 500 , {
62+ message : 'ERROR'
63+ } ) ;
64+ }
65+ } else {
6466 error ( 500 , {
6567 message : 'ERROR'
6668 } ) ;
6769 }
68- } else {
69- error ( 500 , {
70- message : 'ERROR'
71- } ) ;
7270 }
71+
72+ event . locals . user = user ;
73+ event . locals . session = session ;
74+ event . locals . role = role ;
7375 }
7476 }
7577
78+ const response = await resolve ( event ) ;
7679
80+ if ( event . url . pathname . startsWith ( '/api' ) ) {
81+ response . headers . set ( 'cache-control' , API_CACHE_CONTROL ) ;
82+ }
7783
78- event . locals . user = user ;
79- event . locals . session = session ;
80- event . locals . role = role ;
81- return resolve ( event ) ;
82- }
84+ return response ;
85+ } ;
0 commit comments