fediglam/src/api/services/notes.zig

60 lines
1.2 KiB
Zig

const std = @import("std");
const util = @import("util");
const sql = @import("sql");
const Uuid = util.Uuid;
const DateTime = util.DateTime;
pub const Note = struct {
id: Uuid,
author_id: Uuid,
content: []const u8,
created_at: DateTime,
};
pub const CreateError = error{
DatabaseFailure,
};
pub fn create(
db: anytype,
author: Uuid,
content: []const u8,
alloc: std.mem.Allocator,
) CreateError!Uuid {
const id = Uuid.randV4(util.getThreadPrng());
db.insert("note", .{
.id = id,
.author_id = author,
.content = content,
.created_at = DateTime.now(),
}, alloc) catch return error.DatabaseFailure;
return id;
}
pub const GetError = error{
DatabaseFailure,
NotFound,
};
const selectStarFromNote = std.fmt.comptimePrint(
\\SELECT {s}
\\FROM note
\\
, .{util.comptimeJoin(",", std.meta.fieldNames(Note))});
pub fn get(db: anytype, id: Uuid, alloc: std.mem.Allocator) GetError!Note {
return db.queryRow(
Note,
selectStarFromNote ++
\\WHERE id = $1
\\LIMIT 1
,
.{id},
alloc,
) catch |err| switch (err) {
error.NoRows => error.NotFound,
else => error.DatabaseFailure,
};
}