import GRDB struct User: Codable, FetchableRecord, PersistableRecord { var userId: String var publicKey: String var isSpammer: Bool } final class Database: Sendable { private var dbWriter: any DatabaseWriter init(_ dbWriter: any GRDB.DatabaseWriter) throws { self.dbWriter = dbWriter try migrator.migrate(dbWriter) } let dbQueue = try DatabaseQueue(path: "./db.sqlite") let db = try Connection("./db.sqlite") #if DEBUG // Speed up development by nuking the database when migrations change // See migrator.eraseDatabaseOnSchemaChange = true #endif private var migrator: DatabaseMigrator { var migrator = DatabaseMigrator() migrator.registerMigration("v1") { db in try db.create(table: "users", { t in t.primaryKey("userId", .text).NotNull() t.column("publicKey", .text).NotNull() t.column("isSpammer", .bool) }) return migrator } } } extension Database { static func makeConfiguration(_ base: Configuration = Configuration()) -> Configuration { var config = base return config } } extension Database { func saveUser(_ userId: String, _ publicKey: String, _ isSpammer: Bool) throws { try dbWriter.write { db in try User.init(userId: userId, publicKey: publicKey, isSpammer: isSpammer).insert(db) } } }