Skip to content

Commit 9dec6f5

Browse files
committed
Merge 'recent_save'
2 parents c8503a2 + 96feb52 commit 9dec6f5

25 files changed

Lines changed: 1099 additions & 108 deletions

.github/workflows/preview-service.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
- dev
77
- main
88
- hotfix
9-
- new_card
9+
- recent_save
1010

1111
jobs:
1212
deploy:

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
"react-error-boundary": "^4.0.13",
5050
"react-hook-form": "^7.53.1",
5151
"react-hot-toast": "^2.4.1",
52+
"recharts": "^2.13.0",
5253
"tailwind-merge": "^2.5.2",
5354
"tailwindcss-animate": "^1.0.7",
5455
"zod": "^3.23.8"

packages/server/src/api/data.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Hono } from 'hono'
2+
import type { HonoTypeUserInformation } from '~/constants/binding'
3+
import { getHomeChartData } from '~/model/data'
4+
import result from '~/utils/result'
5+
6+
const app = new Hono<HonoTypeUserInformation>()
7+
8+
app.get('/page_chart_data', async (c) => {
9+
const data = await getHomeChartData(c.env.DB)
10+
11+
return c.json(result.success(data))
12+
})
13+
14+
app.get('/r2_usage', async (c) => {
15+
const res = await c.env.BUCKET.list()
16+
return c.json(result.success({
17+
size: res.objects.reduce((acc, obj) => acc + obj.size, 0),
18+
count: res.objects.length,
19+
}))
20+
})
21+
22+
export default app

packages/server/src/api/pages.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { validator } from 'hono/validator'
33
import { isNil, isNotNil, isNumberString } from '@web-archive/shared/utils'
44
import type { HonoTypeUserInformation } from '~/constants/binding'
55
import result from '~/utils/result'
6-
import { clearDeletedPage, deletePageById, getPageById, insertPage, queryDeletedPage, queryPage, restorePage, selectPageTotalCount } from '~/model/page'
6+
import { clearDeletedPage, deletePageById, getPageById, insertPage, queryDeletedPage, queryPage, queryRecentSavePage, restorePage, selectPageTotalCount } from '~/model/page'
77
import { getFolderById, restoreFolder } from '~/model/folder'
88
import { getFileFromBucket, saveFileToBucket } from '~/utils/file'
99
import type { Page } from '~/sql/types'
@@ -103,6 +103,11 @@ app.post(
103103
},
104104
)
105105

106+
app.get('/recent_save', async (c) => {
107+
const pages = await queryRecentSavePage(c.env.DB)
108+
return c.json(result.success(pages))
109+
})
110+
106111
app.get(
107112
'/detail',
108113
validator('query', (value, c) => {

packages/server/src/model/data.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import type { D1Database } from '@cloudflare/workers-types/experimental'
2+
import { selectAllPageCount, selectPageTotalCount } from './page'
3+
import { selectAllFolders } from './folder'
4+
5+
async function getHomeChartData(DB: D1Database) {
6+
const folderList = await selectAllFolders(DB)
7+
const folderPageCountList = await Promise.all(folderList.map(async (folder) => {
8+
const pageCount = await selectPageTotalCount(DB, { folderId: folder.id })
9+
return {
10+
id: folder.id,
11+
name: folder.name,
12+
pageCount: pageCount as number,
13+
}
14+
}))
15+
16+
const sortedFolderPageCountList = folderPageCountList
17+
.sort((a, b) => b.pageCount - a.pageCount)
18+
.slice(0, 5)
19+
20+
const allPageCount = await selectAllPageCount(DB)
21+
return {
22+
folders: sortedFolderPageCountList,
23+
all: allPageCount,
24+
}
25+
}
26+
27+
export {
28+
getHomeChartData,
29+
}

packages/server/src/model/page.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ async function selectPageTotalCount(DB: D1Database, options: { folderId: number,
1616
return result.count
1717
}
1818

19+
async function selectAllPageCount(DB: D1Database) {
20+
const sql = `
21+
SELECT COUNT(*) as count FROM pages
22+
WHERE isDeleted = 0
23+
`
24+
const result = await DB.prepare(sql).first()
25+
return result.count
26+
}
27+
1928
async function queryPage(DB: D1Database, options: { folderId: number, pageNumber?: number, pageSize?: number, keyword?: string }) {
2029
const { folderId, pageNumber, pageSize, keyword } = options
2130
let sql = `
@@ -151,6 +160,14 @@ async function clearDeletedPage(DB: D1Database) {
151160
return result.success
152161
}
153162

163+
async function queryRecentSavePage(DB: D1Database) {
164+
const sql = `
165+
SELECT * FROM pages WHERE isDeleted = 0 ORDER BY createdAt DESC LIMIT 20
166+
`
167+
const result = await DB.prepare(sql).all<Page>()
168+
return result.results
169+
}
170+
154171
export {
155172
selectPageTotalCount,
156173
queryPage,
@@ -161,4 +178,6 @@ export {
161178
getPageById,
162179
insertPage,
163180
clearDeletedPage,
181+
queryRecentSavePage,
182+
selectAllPageCount,
164183
}

packages/server/src/server.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Hono } from 'hono'
22
import type { Bindings, HonoTypeUserInformation } from './constants/binding'
33
import tokenMiddleware from './middleware/token'
4+
import data from './api/data'
45
import showcase from '~/api/showcase'
56
import pages from '~/api/pages'
67
import auth from '~/api/auth'
@@ -35,6 +36,7 @@ api.use(tokenMiddleware)
3536
api.route('/pages', pages)
3637
api.route('/auth', auth)
3738
api.route('/folders', folders)
39+
api.route('/data', data)
3840
app.route('/api', api)
3941

4042
export default app

0 commit comments

Comments
 (0)