Schema Array in paralell?
Hi, I have this code for converting a column in a database to a file model.
export const FileDatabase = Schema.Struct({
id: FileId,
name: Schema.String,
size: Schema.Number,
hashed_key: Schema.String,
visibility: Schema.Literal("private", "public"),
content_type: Schema.String,
}).pipe(
Schema.rename({
hashed_key: "hashedKey",
content_type: "contentType",
})
)
export const FileDomainWithUrl = Schema.Struct({
id: FileId,
size: Schema.Number,
contentType: Schema.String,
name: Schema.String,
hashedKey: Schema.String,
url: Schema.String,
visibility: Schema.Literal("private", "public"),
})
const InitialSchema = Schema.Union(Schema.parseJson(FileDatabase), FileDatabase)
export const FileFromDatabaseToFileDomain = Schema.transformOrFail(InitialSchema, FileDomainWithUrl, {
strict: true,
decode: Effect.fn("files.from-database-to-domain")(function* (file) {
const fileService = yield* FilesDataAccessLayer
return {
id: file.id,
size: file.size,
contentType: file.contentType,
name: file.name.split("/").at(-1) ?? "no-name",
hashedKey: file.hashedKey,
visibility: file.visibility,
url: yield* fileService.getUploadUrl({
hashedKey: file.hashedKey,
visibility: file.visibility,
duration: Duration.hours(1),
}),
}
}),
encode: Effect.fn("files.from-domain-to-database")(function* (file) {
yield* Effect.log("Transforming file from domain to database")
return {
id: FileId.make(file.id),
size: file.size,
contentType: file.contentType,
name: file.name,
hashedKey: file.hashedKey,
visibility: file.visibility,
}
}),
})export const FileDatabase = Schema.Struct({
id: FileId,
name: Schema.String,
size: Schema.Number,
hashed_key: Schema.String,
visibility: Schema.Literal("private", "public"),
content_type: Schema.String,
}).pipe(
Schema.rename({
hashed_key: "hashedKey",
content_type: "contentType",
})
)
export const FileDomainWithUrl = Schema.Struct({
id: FileId,
size: Schema.Number,
contentType: Schema.String,
name: Schema.String,
hashedKey: Schema.String,
url: Schema.String,
visibility: Schema.Literal("private", "public"),
})
const InitialSchema = Schema.Union(Schema.parseJson(FileDatabase), FileDatabase)
export const FileFromDatabaseToFileDomain = Schema.transformOrFail(InitialSchema, FileDomainWithUrl, {
strict: true,
decode: Effect.fn("files.from-database-to-domain")(function* (file) {
const fileService = yield* FilesDataAccessLayer
return {
id: file.id,
size: file.size,
contentType: file.contentType,
name: file.name.split("/").at(-1) ?? "no-name",
hashedKey: file.hashedKey,
visibility: file.visibility,
url: yield* fileService.getUploadUrl({
hashedKey: file.hashedKey,
visibility: file.visibility,
duration: Duration.hours(1),
}),
}
}),
encode: Effect.fn("files.from-domain-to-database")(function* (file) {
yield* Effect.log("Transforming file from domain to database")
return {
id: FileId.make(file.id),
size: file.size,
contentType: file.contentType,
name: file.name,
hashedKey: file.hashedKey,
visibility: file.visibility,
}
}),
})