fluent-kit
fluent-kit copied to clipboard
Migration Crash
Describe the issue
A migration configuration is causing a crash
Vapor version
hummingbird-main branch 56336d7
Operating system and version
macOS 14.5 (23F79)
Swift version
swift-driver version: 1.115 Apple Swift version 6.0 (swiftlang-6.0.0.9.10 clang-1600.0.26.2)
Steps to reproduce
I'm not 100% sure this isn't just me holding it wrong, or that this is even the right project (tho I'm more certain of the latter).
To get the error/crash, I have the following migration:
struct UpdateUserWithLocaleDBModel_5: AsyncMigration {
func prepare(on database: any Database) async throws {
try await database.schema(User.schema)
.field(User.Key.locale, .string)
.field(User.Key.timezone, .string)
.update()
}
func revert(on database: any Database) async throws {
try await database.schema(User.schema)
.deleteField(User.Key.locale)
.deleteField(User.Key.timezone)
.update()
}
}
with the following model:
final class User: Model, PasswordAuthenticatable, @unchecked Sendable {
static let schema = "user"
enum Key {
static let firstName: FieldKey = "firstName"
static let lastName: FieldKey = "lastName"
static let email: FieldKey = "email"
static let password: FieldKey = "password"
static let isAdmin: FieldKey = "isAdmin"
static let locale: FieldKey = "locale"
static let timezone: FieldKey = "timezone"
}
@ID(key: .id)
var id: UUID?
@Field(key: Key.email)
var email: String
@Field(key: Key.firstName)
var firstName: String
@Field(key: Key.lastName)
var lastName: String
@Field(key: Key.password)
var passwordHash: String?
@Field(key: Key.isAdmin)
var isAdmin: Bool
@Children(for: \.$owner)
var photos: [Photo]
@Children(for: \.$owner)
var albums: [Album]
var primaryAlbum: Album? {
$albums.value?.first
}
@OptionalField(key: Key.locale)
private var _locale: String?
var locale: Locale {
get { _locale.map { Locale(identifier: $0) } ?? .us }
set { _locale = newValue.identifier }
}
@OptionalField(key: Key.timezone)
private var _timezone: String?
var timezone: TimeZone {
get { _timezone.flatMap { TimeZone(identifier: $0) } ?? .chicago }
set { _timezone = newValue.identifier }
}
init() {}
init(
id: UUID? = nil,
email: String,
firstName: String,
lastName: String,
passwordHash: String,
isAdmin: Bool
) {
self.id = id
self.email = email
self.firstName = firstName
self.lastName = lastName
self.passwordHash = passwordHash
self.isAdmin = isAdmin
}
}
and, for context, here's the initial user creation migration (and the only other user migration):
struct CreateUserDBModel_1: AsyncMigration {
func prepare(on database: any Database) async throws {
try await database.schema(User.schema)
.id()
.field(User.Key.firstName, .string, .required)
.field(User.Key.lastName, .string, .required)
.field(User.Key.email, .string, .required)
.field(User.Key.password, .string)
.field(User.Key.isAdmin, .datetime)
.unique(on: User.Key.email)
.create()
}
func revert(on database: any Database) async throws {
try await database.schema(User.schema).delete()
}
}
So, with this setup, I just build and run and the crash happens on startup when running migrations.
Outcome
I get this error and a crash:
2024-10-01T03:19:34-0500 error photoshare : database-id=sqlite error=error: near ",": syntax error migration=photoshare.UpdateUserWithLocaleDBModel_5 [FluentKit] [Migrator] Failed prepare
- I'm thinking the bug is in FluentKit because it's explicitly logging an error and saying as such.
Additional notes
M1 - just running debug build in Xcode.