Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f4769c5

Browse files
authored
Support adding multiple enum cases at once (#190)
* Support adding multiple enum cases at once * Add testcase to update enum by adding multiple cases
1 parent 9872d57 commit f4769c5

File tree

2 files changed

+93
-6
lines changed

2 files changed

+93
-6
lines changed

β€ŽSources/FluentPostgresDriver/FluentPostgresDatabase.swift

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,13 @@ extension _FluentPostgresDatabase: Database {
6666
guard !e.createCases.isEmpty else {
6767
return self.eventLoop.makeSucceededFuture(())
6868
}
69-
let builder = self.sql().alter(enum: e.name)
70-
for create in e.createCases {
71-
_ = builder.add(value: create)
72-
}
73-
self.logger.log(level: self.sqlLogLevel, "\(builder.query)")
74-
return builder.run()
69+
70+
return database.eventLoop.flatten(e.createCases.map { create in
71+
let builder = self.sql().alter(enum: e.name)
72+
builder.add(value: create)
73+
self.logger.log(level: self.sqlLogLevel, "\(builder.query)")
74+
return builder.run()
75+
})
7576
case .delete:
7677
let builder = self.sql().drop(enum: e.name)
7778
self.logger.log(level: self.sqlLogLevel, "\(builder.query)")

β€ŽTests/FluentPostgresDriverTests/FluentPostgresDriverTests.swift

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,26 @@ final class FluentPostgresDriverTests: XCTestCase {
154154
XCTAssertEqual(rows[0].metadata["createdAt"], expected)
155155
}
156156

157+
func testEnumAddingMultipleCases() throws {
158+
try EnumMigration().prepare(on: self.db).wait()
159+
try EventWithFooMigration().prepare(on: self.db).wait()
160+
161+
let event = EventWithFoo()
162+
event.foobar = .foo
163+
try event.save(on: self.db).wait()
164+
165+
XCTAssertNoThrow(try EnumAddMultipleCasesMigration().prepare(on: self.db).wait())
166+
167+
event.foobar = .baz
168+
XCTAssertNoThrow(try event.update(on: self.db).wait())
169+
event.foobar = .qux
170+
XCTAssertNoThrow(try event.update(on: self.db).wait())
171+
172+
XCTAssertNoThrow(try EnumAddMultipleCasesMigration().revert(on: self.db).wait())
173+
try! EventWithFooMigration().revert(on: self.db).wait()
174+
try! EnumMigration().revert(on: self.db).wait()
175+
}
176+
157177

158178
var benchmarker: FluentBenchmarker {
159179
return .init(databases: self.dbs)
@@ -260,6 +280,72 @@ struct EventMigration: Migration {
260280
}
261281
}
262282

283+
final class EventWithFoo: Model {
284+
static let schema = "foobar_events"
285+
286+
@ID
287+
var id: UUID?
288+
289+
@Enum(key: "foo")
290+
var foobar: Foobar
291+
}
292+
293+
enum Foobar: String, Codable {
294+
static let schema = "foobars"
295+
case foo
296+
case bar
297+
case baz
298+
case qux
299+
}
300+
301+
struct EventWithFooMigration: Migration {
302+
func prepare(on database: Database) -> EventLoopFuture<Void> {
303+
return database.enum(Foobar.schema).read()
304+
.flatMap { foobar in
305+
database.schema(EventWithFoo.schema)
306+
.id()
307+
.field("foo", foobar, .required)
308+
.create()
309+
}
310+
}
311+
312+
func revert(on database: Database) -> EventLoopFuture<Void> {
313+
return database.schema(EventWithFoo.schema).delete()
314+
}
315+
}
316+
317+
struct EnumMigration: Migration {
318+
func prepare(on database: Database) -> EventLoopFuture<Void> {
319+
return database.enum(Foobar.schema)
320+
.case("foo")
321+
.case("bar")
322+
.create()
323+
.transform(to: ())
324+
}
325+
326+
func revert(on database: Database) -> EventLoopFuture<Void> {
327+
return database.enum(Foobar.schema).delete()
328+
}
329+
}
330+
331+
struct EnumAddMultipleCasesMigration: Migration {
332+
func prepare(on database: Database) -> EventLoopFuture<Void> {
333+
return database.enum(Foobar.schema)
334+
.case("baz")
335+
.case("qux")
336+
.update()
337+
.transform(to: ())
338+
}
339+
340+
func revert(on database: Database) -> EventLoopFuture<Void> {
341+
return database.enum(Foobar.schema)
342+
.deleteCase("baz")
343+
.deleteCase("qux")
344+
.update()
345+
.transform(to: ())
346+
}
347+
}
348+
263349
let isLoggingConfigured: Bool = {
264350
LoggingSystem.bootstrap { label in
265351
var handler = StreamLogHandler.standardOutput(label: label)

0 commit comments

Comments
(0)

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /