feat: game aliases + edit permissions + scoped game select (v0.3.6)

- Add aliases field to games (json array), searchable in game library and team session
- Add edit functionality inside GameDetailDialog (creator/owner/admin can modify)
- Add permission control for delete/edit buttons (only visible to authorized users)
- Scope GameSelectDialog to current group only
- Support aliases in import/export

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
congsh
2026-04-24 16:33:08 +08:00
parent f3fe7d4f2d
commit d76ecb15d6
12 changed files with 469 additions and 17 deletions
@@ -0,0 +1,18 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((db) => {
const dao = new Dao(db)
const collection = dao.findCollectionByNameOrId("x5adjlc0txf16r8")
collection.listRule = "@request.auth.id != \"\" && group.members ~ @request.auth.id"
collection.viewRule = "@request.auth.id != \"\" && group.members ~ @request.auth.id"
return dao.saveCollection(collection)
}, (db) => {
const dao = new Dao(db)
const collection = dao.findCollectionByNameOrId("x5adjlc0txf16r8")
collection.listRule = "group.owner = @request.auth.id || group.members.id = @request.auth.id"
collection.viewRule = "group.owner = @request.auth.id || group.members.id = @request.auth.id"
return dao.saveCollection(collection)
})
@@ -0,0 +1,37 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((db) => {
const dao = new Dao(db)
const collection = dao.findCollectionByNameOrId("x5adjlc0txf16r8")
// add aliases field (json array of strings)
collection.schema.addField(new SchemaField({
"system": false,
"id": "aliases_field",
"name": "aliases",
"type": "json",
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSize": 5000
}
}))
// update rules: allow group admins to update/delete
collection.updateRule = "group.owner = @request.auth.id || addedBy = @request.auth.id || group.admins ~ @request.auth.id"
collection.deleteRule = "group.owner = @request.auth.id || addedBy = @request.auth.id || group.admins ~ @request.auth.id"
return dao.saveCollection(collection)
}, (db) => {
const dao = new Dao(db)
const collection = dao.findCollectionByNameOrId("x5adjlc0txf16r8")
// remove aliases field
collection.schema.removeField("aliases_field")
// restore original rules
collection.updateRule = "group.owner = @request.auth.id || addedBy = @request.auth.id"
collection.deleteRule = "group.owner = @request.auth.id || addedBy = @request.auth.id"
return dao.saveCollection(collection)
})