finnow/finnow-api/source/attachment/data_impl_sqlite.d

69 lines
1.7 KiB
D

module attachment.data_impl_sqlite;
import handy_httpd.components.optional;
import d2sqlite3;
import attachment.model;
import attachment.data;
import util.sqlite;
import std.datetime;
import std.format;
class SqliteAttachmentRepository : AttachmentRepository {
private Database db;
this(Database db) {
this.db = db;
}
Optional!Attachment findById(ulong id) {
return findOne(
db,
"SELECT * FROM attachment WHERE id = ?",
&parseAttachment,
id
);
}
Attachment[] findAllByLinkedEntity(string subquery, ulong entityId) {
const query = format!"SELECT * FROM attachment WHERE id IN (%s)"(subquery);
return findAll(db, query, &parseAttachment, entityId);
}
ulong save(SysTime uploadedAt, string filename, string contentType, ubyte[] content) {
util.sqlite.update(
db,
q"SQL
INSERT INTO attachment
(uploaded_at, filename, content_type, size, content)
VALUES (?, ?, ?, ?, ?)
SQL",
uploadedAt.toISOExtString(),
filename,
contentType,
cast(ulong) content.length,
content
);
return db.lastInsertRowid();
}
void remove(ulong id) {
util.sqlite.update(
db,
"DELETE FROM attachment WHERE id = ?",
id
);
}
static Attachment parseAttachment(Row row) {
return Attachment(
row.peek!ulong(0),
SysTime.fromISOExtString(row.peek!string(1), UTC()),
row.peek!string(2),
row.peek!string(3),
row.peek!ulong(4),
row.peek!(ubyte[])(5)
);
}
}