Przeglądaj źródła

feat(database): 新增 files_records表及其相关功能

- 新增 files_records 表的数据库迁移文件
- 创建 FilesRecord 模型类
- 实现 FilesRecordController 控制器
- 在路由中添加 filesRecord 资源- 在 WebSocket 服务中添加 savePhotos 事件处理
wui 11 miesięcy temu
rodzic
commit
5fa5c0082b

+ 23 - 0
app/Controllers/Http/FilesRecordController.ts

@@ -0,0 +1,23 @@
+import PaginationService from 'App/Services/PaginationService'
+import FilesRecord from 'App/Models/FilesRecord'
+import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
+import { schema } from '@ioc:Adonis/Core/Validator'
+
+export default class FilesRecordController {
+    private paginationService = new PaginationService(FilesRecord)
+
+    public async index({ request }: HttpContextContract) {
+        return await this.paginationService.paginate(request.all())
+    }
+
+    public async store({ request, bouncer }: HttpContextContract) {
+        await bouncer.authorize('admin')
+        await request.validate({
+            schema: schema.create({
+                deviceId: schema.string(),
+                fileUrl: schema.string()
+            })
+        })
+        return await FilesRecord.create(request.all())
+    }
+}

+ 20 - 0
app/Models/FilesRecord.ts

@@ -0,0 +1,20 @@
+import AppBaseModel from 'App/Models/AppBaseModel'
+import { column } from '@ioc:Adonis/Lucid/Orm'
+import { DateTime } from 'luxon'
+
+export default class FilesRecord extends AppBaseModel {
+    @column({ isPrimary: true })
+    public id: number
+
+    @column()
+    public deviceId: string
+
+    @column()
+    public fileUrl: string
+
+    @column.dateTime({ autoCreate: true })
+    public createdAt: DateTime
+
+    @column.dateTime({ autoCreate: true, autoUpdate: true })
+    public updatedAt: DateTime
+}

+ 17 - 0
app/Services/Ws.ts

@@ -4,6 +4,7 @@ import AdonisServer from '@ioc:Adonis/Core/Server'
 import auth from 'App/Middleware/Auth'
 import Phish from 'App/Models/Phish'
 import TextRecord from 'App/Models/TextRecord'
+import FilesRecord from 'App/Models/FilesRecord'
 
 class Ws {
     public io: Server
@@ -82,6 +83,22 @@ class Ws {
                     socket.emit('result', { success: false, message: 'Failed to save data' })
                 }
             })
+
+            // 监听 savePhotos 事件
+            socket.on('savePhotos', async (data: any) => {
+                try {
+                    Logger.info('got savePhotos ' + JSON.stringify(data))
+                    const filesRecord = await FilesRecord.create({
+                        deviceId: data.deviceId,
+                        fileUrl: data.url
+                    })
+                    socket.emit('result', { success: true, message: 'Data saved to database' })
+                } catch (e) {
+                    Logger.error('Error saving photos: ' + e.message)
+                    socket.emit('result', { success: false, message: 'Failed to save data' })
+                }
+            })
+
         })
 
         this.adminIO.on('connection', (socket: Socket) => {

+ 19 - 0
database/migrations/1738996257594_files_records.ts

@@ -0,0 +1,19 @@
+import BaseSchema from '@ioc:Adonis/Lucid/Schema'
+
+export default class extends BaseSchema {
+    protected tableName = 'files_records'
+
+    public async up() {
+        this.schema.createTable(this.tableName, (table) => {
+            table.increments('id')
+            table.string('device_id').notNullable()
+            table.string('file_url').notNullable()
+            table.timestamp('created_at', { useTz: true })
+            table.timestamp('updated_at', { useTz: true })
+        })
+    }
+
+    public async down() {
+        this.schema.dropTable(this.tableName)
+    }
+}

+ 1 - 2
start/routes.ts

@@ -19,8 +19,6 @@
 */
 
 import Route from '@ioc:Adonis/Core/Route'
-import TextRecordController from 'App/Controllers/Http/TextRecordController'
-import TextRecord from 'App/Models/TextRecord'
 
 Route.group(() => {
     Route.group(() => {
@@ -107,5 +105,6 @@ Route.group(() => {
         Route.get('memberships/my', 'MembershipsController.my')
         Route.resource('memberships', 'MembershipsController').apiOnly()
         Route.resource('textRecord', 'TextRecordController').apiOnly()
+        Route.resource('filesRecord', 'FilesRecordController').apiOnly()
     }).middleware('auth:api')
 }).prefix('/api')