@@ -4,43 +4,50 @@ import {
4
4
MessagesQuerySchema ,
5
5
StampRelationsQuerySchema ,
6
6
StampsQuerySchema ,
7
- getChannelMessageRanking ,
8
- getChannelStampsRanking ,
9
- getGaveMessageStampsRanking ,
10
- getMessages ,
11
- getMessageContents ,
12
- getMessagesRanking ,
13
- getMessagesTimeline ,
14
- getReceivedMessageStampsRanking ,
15
- getStampRanking ,
16
- getStampRelations ,
17
- getStamps ,
18
- getSubscriptionRanking ,
19
- getTagRanking ,
20
- getUserGroupRanking ,
21
7
StampsMeanUsageQuerySchema ,
22
- getStampsMeanUsage ,
23
8
} from '@traq-ing/database' ;
24
9
import { Hono } from 'hono' ;
25
10
import { getCookie } from 'hono/cookie' ;
26
11
import { z } from 'zod' ;
27
12
import { tokenKey , traqAuthRoutes } from './auth' ;
28
13
import {
14
+ forgotCaches ,
15
+ getChannelMessageRankingCached ,
29
16
getChannels ,
17
+ getChannelStampsRankingCached ,
30
18
getChannelSubscribers ,
31
19
getFile ,
20
+ getGaveMessageStampsRankingCached ,
32
21
getMe ,
33
22
getMessage ,
23
+ getMessageContentsCached ,
24
+ getMessagesCached ,
25
+ getMessagesRankingCached ,
34
26
getMessageStamps ,
27
+ getMessagesTimelineCached ,
35
28
getOgInfo ,
29
+ getReceivedMessageStampsRankingCached ,
30
+ getStampRankingCached ,
31
+ getStampRelationsCached ,
32
+ getStampsCached ,
33
+ getStampsMeanUsageCached ,
34
+ getSubscriptionRankingCached ,
36
35
getSubscriptions ,
36
+ getTagRankingCached ,
37
+ getUserGroupRankingCached ,
37
38
getUserGroups ,
38
39
getUsers ,
39
40
setSubscriptionLevel ,
40
41
} from '@/gateway' ;
41
42
import { HTTPException } from 'hono/http-exception' ;
42
43
import { createMiddleware } from 'hono/factory' ;
43
44
import { extractWords } from '@/extractor' ;
45
+ import { getCaches } from '@/cache' ;
46
+
47
+ const secretKey = process . env . SECRET_KEY ;
48
+ if ( secretKey === undefined ) {
49
+ throw new Error ( 'SECRET_KEY is required' ) ;
50
+ }
44
51
45
52
const app = new Hono < {
46
53
Variables : { token : string } ;
@@ -84,15 +91,15 @@ const routes = app
84
91
} ,
85
92
)
86
93
. get ( '/messages' , zValidator ( 'query' , MessagesQuerySchema ) , cacheMiddleware , async ( c ) =>
87
- c . json ( await getMessages ( c . req . valid ( 'query' ) ) , 200 ) ,
94
+ c . json ( await getMessagesCached ( c . req . valid ( 'query' ) ) , 200 ) ,
88
95
)
89
96
. get (
90
97
'/message-contents' ,
91
98
zValidator ( 'query' , MessageContentsQuerySchema . omit ( { offset : true } ) ) ,
92
99
cacheMiddleware ,
93
100
async ( c ) => {
94
101
const { limit, ...query } = c . req . valid ( 'query' ) ;
95
- const contents = await getMessageContents ( query ) ;
102
+ const contents = await getMessageContentsCached ( query ) ;
96
103
const words = [ ] ;
97
104
for ( const content of contents ) {
98
105
words . push ( ...( await extractWords ( content . content ) ) ) ;
@@ -105,40 +112,42 @@ const routes = app
105
112
return c . json ( wordCount . slice ( 0 , limit ) , 200 ) ;
106
113
} ,
107
114
)
108
- . get ( '/channel-messages-ranking' , cacheMiddleware , async ( c ) => c . json ( await getChannelMessageRanking ( ) , 200 ) )
109
- . get ( '/messages-ranking' , cacheMiddleware , async ( c ) => c . json ( await getMessagesRanking ( ) , 200 ) )
110
- . get ( '/messages-timeline' , cacheMiddleware , async ( c ) => c . json ( await getMessagesTimeline ( ) , 200 ) )
111
- . get ( '/stamp-ranking' , cacheMiddleware , async ( c ) => c . json ( await getStampRanking ( ) , 200 ) )
112
- . get ( '/channel-stamps-ranking' , cacheMiddleware , async ( c ) => c . json ( await getChannelStampsRanking ( ) , 200 ) )
113
- . get ( '/gave-stamps-ranking' , cacheMiddleware , async ( c ) => c . json ( await getGaveMessageStampsRanking ( ) , 200 ) )
114
- . get ( '/received-stamps-ranking' , cacheMiddleware , async ( c ) => c . json ( await getReceivedMessageStampsRanking ( ) , 200 ) )
115
+ . get ( '/channel-messages-ranking' , cacheMiddleware , async ( c ) => c . json ( await getChannelMessageRankingCached ( ) , 200 ) )
116
+ . get ( '/messages-ranking' , cacheMiddleware , async ( c ) => c . json ( await getMessagesRankingCached ( ) , 200 ) )
117
+ . get ( '/messages-timeline' , cacheMiddleware , async ( c ) => c . json ( await getMessagesTimelineCached ( ) , 200 ) )
118
+ . get ( '/stamp-ranking' , cacheMiddleware , async ( c ) => c . json ( await getStampRankingCached ( ) , 200 ) )
119
+ . get ( '/channel-stamps-ranking' , cacheMiddleware , async ( c ) => c . json ( await getChannelStampsRankingCached ( ) , 200 ) )
120
+ . get ( '/gave-stamps-ranking' , cacheMiddleware , async ( c ) => c . json ( await getGaveMessageStampsRankingCached ( ) , 200 ) )
121
+ . get ( '/received-stamps-ranking' , cacheMiddleware , async ( c ) =>
122
+ c . json ( await getReceivedMessageStampsRankingCached ( ) , 200 ) ,
123
+ )
115
124
. get (
116
125
'/group-ranking' ,
117
126
zValidator ( 'query' , z . object ( { groupBy : z . enum ( [ 'user' , 'group' ] ) } ) ) ,
118
127
cacheMiddleware ,
119
- async ( c ) => c . json ( await getUserGroupRanking ( c . req . valid ( 'query' ) . groupBy ) , 200 ) ,
128
+ async ( c ) => c . json ( await getUserGroupRankingCached ( c . req . valid ( 'query' ) . groupBy ) , 200 ) ,
120
129
)
121
130
. get (
122
131
'/tag-ranking' ,
123
132
zValidator ( 'query' , z . object ( { groupBy : z . enum ( [ 'user' , 'tag' ] ) } ) ) ,
124
133
cacheMiddleware ,
125
- async ( c ) => c . json ( await getTagRanking ( c . req . valid ( 'query' ) . groupBy ) , 200 ) ,
134
+ async ( c ) => c . json ( await getTagRankingCached ( c . req . valid ( 'query' ) . groupBy ) , 200 ) ,
126
135
)
127
136
. get (
128
137
'/subscription-ranking' ,
129
138
zValidator ( 'query' , z . object ( { groupBy : z . enum ( [ 'user' , 'channel' ] ) } ) ) ,
130
139
cacheMiddleware ,
131
- async ( c ) => c . json ( await getSubscriptionRanking ( c . req . valid ( 'query' ) . groupBy ) , 200 ) ,
140
+ async ( c ) => c . json ( await getSubscriptionRankingCached ( c . req . valid ( 'query' ) . groupBy ) , 200 ) ,
132
141
)
133
142
. get ( '/messages/:id' , cacheMiddleware , async ( c ) => c . json ( await getMessage ( c . req . param ( 'id' ) ) , 200 ) )
134
143
. get ( '/stamps' , zValidator ( 'query' , StampsQuerySchema ) , async ( c ) =>
135
- c . json ( await getStamps ( c . req . valid ( 'query' ) ) , 200 ) ,
144
+ c . json ( await getStampsCached ( c . req . valid ( 'query' ) ) , 200 ) ,
136
145
)
137
146
. get ( '/stamps-mean-usage' , zValidator ( 'query' , StampsMeanUsageQuerySchema ) , async ( c ) =>
138
- c . json ( await getStampsMeanUsage ( c . req . valid ( 'query' ) ) , 200 ) ,
147
+ c . json ( await getStampsMeanUsageCached ( c . req . valid ( 'query' ) ) , 200 ) ,
139
148
)
140
149
. get ( '/stamp-relations' , zValidator ( 'query' , StampRelationsQuerySchema ) , async ( c ) =>
141
- c . json ( await getStampRelations ( c . req . valid ( 'query' ) ) , 200 ) ,
150
+ c . json ( await getStampRelationsCached ( c . req . valid ( 'query' ) ) , 200 ) ,
142
151
)
143
152
. get ( '/users' , cacheMiddleware , async ( c ) => c . json ( await getUsers ( ) , 200 ) )
144
153
. get ( '/groups' , cacheMiddleware , async ( c ) => c . json ( await getUserGroups ( ) , 200 ) )
@@ -170,7 +179,22 @@ const routes = app
170
179
c . header ( 'Cache-Control' , 'private, max-age=31536000' ) ;
171
180
return c . newResponse ( file . stream ( ) ) ;
172
181
} ,
173
- ) ;
182
+ )
183
+ . get ( '/caches' , async ( c ) => {
184
+ if ( c . req . header ( 'x-secret-key' ) !== secretKey ) {
185
+ throw new HTTPException ( 401 , { message : 'Unauthorized' } ) ;
186
+ }
187
+
188
+ return c . json ( getCaches ( ) , 200 ) ;
189
+ } )
190
+ . delete ( '/caches' , async ( c ) => {
191
+ if ( c . req . header ( 'x-secret-key' ) !== secretKey ) {
192
+ throw new HTTPException ( 401 , { message : 'Unauthorized' } ) ;
193
+ }
194
+ forgotCaches ( ) ;
195
+ console . log ( 'Caches cleared' ) ;
196
+ return c . json ( { message : 'Caches cleared' } , 204 ) ;
197
+ } ) ;
174
198
175
199
app . on (
176
200
'GET' ,
0 commit comments