Added the catalogue models and seed to support phase 2 of the POC prototype in the Persistence package.

This commit is contained in:
javier committed 2026-09-21 11:44:41 +02:00
1 parent ea89ea892a
commit 09c7b8a1a7
10 files changed
+238 -21

No files matched your search

@@ -25,6 +25,7 @@ public struct PrepareDB: Sendable {
CreateShop(),
CreateListing(),
SeedCatalogue(),
CreateUser(),
])
}
@@ -0,0 +1,27 @@
import Foundation
/// A `Sendable` snapshot of an account.
public struct User: Sendable, Equatable {
// MARK: Properties
/// The account's identifier.
public let id: UUID
/// The account's normalized email address.
public let email: String
/// The name other people see.
public let displayName: String
// MARK: Initializers
public init(
id: UUID,
email: String,
displayName: String
) {
self.id = id
self.email = email
self.displayName = displayName
}
}
@@ -0,0 +1,53 @@
import FluentKit
import HummingbirdFluent
/// Reads and creates accounts through the default database.
public struct AccountRepository: Sendable {
// MARK: Constants
/// The email of the demo buyer the prototype's stubbed passkey signs in.
public static let demoEmail = Seed.accounts[0].email
// MARK: Properties
private let fluent: Fluent
// MARK: Initializers
/// Creates a repository backed by the given `Fluent` service.
/// - Parameter fluent: the service whose default database the repository operates on.
public init(
fluent: Fluent
) {
self.fluent = fluent
}
// MARK: Methods
/// Fetches the account with the given email, creating it when there is none: one step both signs in and joins.
///
/// A new account is named after the email's local part until its owner picks a display name.
/// - Parameter email: the account's normalized email address.
/// - Returns: the account, existing or new.
public func account(
email: String
) async throws -> User {
if let record = try await UserRecord.query(on: fluent.db())
.filter(\.$email == email)
.first()
{
return try record.snapshot
}
let record = UserRecord(
email: email,
displayName: String(email.prefix { $0 != "@" })
)
try await record.save(on: fluent.db())
return try record.snapshot
}
}