-
Notifications
You must be signed in to change notification settings - Fork 0
/
PlayerRepository.swift
130 lines (116 loc) · 4.12 KB
/
PlayerRepository.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import Foundation
import GRDB
import os.log
import SQLiteChangesetSync
/// A repository of players.
///
/// You create a `PlayerRepository` with a
/// [connection to an SQLite database](https://swiftpackageindex.com/groue/grdb.swift/documentation/grdb/databaseconnections),
/// created with a configuration returned from
/// ``makeConfiguration(_:)``.
///
/// For example:
///
/// ```swift
/// // Create an in-memory PlayerRepository
/// let config = PlayerRepository.makeConfiguration()
/// let dbQueue = try DatabaseQueue(configuration: config)
/// let repository = try PlayerRepository(dbQueue)
/// ```
///
/// ## Topics
///
/// ### Creating a repository
///
/// - ``init(_:)``
/// - ``makeConfiguration(_:)``
///
/// ### Performing read-only accesses
///
/// - ``reader``
///
/// ### Performing writes
///
/// - ``deleteAllPlayer()``
/// - ``insert(_:)``
/// - ``update(_:)``
public struct PlayerRepository {
/// Creates a `PlayerRepository`, and makes sure the database schema
/// is ready.
///
/// - important: Create the `DatabaseWriter` with a configuration
/// returned by ``makeConfiguration(_:)``.
public init(_ changesetRepository: ChangesetRepository) throws {
self.changesetRepository = changesetRepository
try changesetRepository.migrate(migrator)
}
private let changesetRepository: ChangesetRepository
/// The DatabaseMigrator that defines the database schema.
///
/// See <https://swiftpackageindex.com/groue/grdb.swift/documentation/grdb/migrations>
private var migrator: DatabaseMigrator {
var migrator = DatabaseMigrator()
migrator.registerMigration("createPlayer") { db in
// Create a table
// See <https://swiftpackageindex.com/groue/grdb.swift/documentation/grdb/databaseschema>
try db.create(table: "player") { t in
t.primaryKey("uuid", .text)
t.column("name", .text).notNull()
t.column("score", .integer).notNull()
t.column("photoID", .integer).notNull()
}
}
// Migrations for future application versions will be inserted here:
// migrator.registerMigration(...) { db in
// ...
// }
return migrator
}
public func reset() throws {
try deleteAllPlayer()
}
}
// MARK: - Database Access: Writes
// The write methods execute invariant-preserving database transactions.
// In this demo repository, they are pretty simple.
extension PlayerRepository {
/// Inserts a player and returns the inserted player.
public func insert(_ player: Player) throws -> Player {
let meta = ChangesetMeta(message: "Insert \(player.name)")
return try changesetRepository.commit(meta: meta.asJSONString()) { db in
try player.inserted(db)
}
}
/// Updates the player.
public func update(_ player: Player) throws {
let meta = ChangesetMeta(message: "Update \(player.name) score=\(player.score)")
return try changesetRepository.commit(meta: meta.asJSONString()) { db in
try player.update(db)
}
}
/// Deletes all players.
public func deleteAllPlayer() throws {
let meta = ChangesetMeta(message: "Delete all players")
return try changesetRepository.commit(meta: meta.asJSONString()) { db in
_ = try Player.deleteAll(db)
}
}
/// Delete a player.
public func deletePlayer(_ player: Player) throws {
let meta = ChangesetMeta(message: "Delete player \(player.name)")
return try changesetRepository.commit(meta: meta.asJSONString()) { db in
try player.delete(db)
}
}
}
// MARK: - Database Access: Reads
// This demo app does not provide any specific reading method, and instead
// gives an unrestricted read-only access to the rest of the application.
// In your app, you are free to choose another path, and define focused
// reading methods.
extension PlayerRepository {
/// Provides a read-only access to the database.
public var reader: any GRDB.DatabaseReader {
changesetRepository.reader
}
}