aboutsummaryrefslogtreecommitdiff
path: root/src/routes/api
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2025-11-15 11:54:00 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2025-11-15 11:56:24 +0100
commite8ff326f0e5bd61fb0a8c22c48f296fcf0249830 (patch)
tree19d8c026f8460ec577f446a7d61e68c38acddde0 /src/routes/api
parent007bc3fe0615f38cb31d5116759ed3500f6fd3e6 (diff)
backend implement auth-service
Diffstat (limited to 'src/routes/api')
-rw-r--r--src/routes/api/auth/first-login.zig5
-rw-r--r--src/routes/api/auth/login.zig18
-rw-r--r--src/routes/api/auth/root.zig2
-rw-r--r--src/routes/api/root.zig1
-rw-r--r--src/routes/api/session/current.zig23
-rw-r--r--src/routes/api/session/drop.zig8
-rw-r--r--src/routes/api/session/renew.zig8
-rw-r--r--src/routes/api/session/root.zig5
8 files changed, 61 insertions, 9 deletions
diff --git a/src/routes/api/auth/first-login.zig b/src/routes/api/auth/first-login.zig
index 2fb8c02..34f04d8 100644
--- a/src/routes/api/auth/first-login.zig
+++ b/src/routes/api/auth/first-login.zig
@@ -1,14 +1,13 @@
const std = @import("std");
const Context = @import("../../context.zig");
-pub const needs_auth = true;
-pub const method = .POST;
+pub const access = .everyone;
const Result = struct {
is_first: bool,
};
-pub fn handler(ctx: *Context) anyerror!Result {
+pub fn post(ctx: *Context) anyerror!Result {
_ = ctx;
return .{ .is_first = false };
}
diff --git a/src/routes/api/auth/login.zig b/src/routes/api/auth/login.zig
index c3f2bef..76efcf4 100644
--- a/src/routes/api/auth/login.zig
+++ b/src/routes/api/auth/login.zig
@@ -3,9 +3,6 @@ const std = @import("std");
const Context = @import("../../context.zig");
const Storage = @import("../../../storage/root.zig");
-pub const needs_auth = false;
-pub const method = .POST;
-
const Body = struct {
user: []const u8,
password: []const u8,
@@ -15,11 +12,22 @@ const Result = struct {
success: bool,
};
-pub fn handler(ctx: *Context, body: Body) anyerror!Result {
+pub const access = .everyone;
+
+pub fn post(ctx: *Context, body: Body) anyerror!Result {
var user = Storage.User.open(ctx.storage, body.user, ctx.allocator) catch return .{
.success = false
};
defer user.deinit();
- return .{ .success = user.check_password(body.password) };
+ const result = Result {
+ .success = user.check_password(body.password)
+ };
+
+ if (result.success) {
+ const session = try ctx.storage.sessions.add(ctx.storage, user.info);
+ ctx.response.headers.fingerprint = session.fingerprint;
+ }
+
+ return result;
}
diff --git a/src/routes/api/auth/root.zig b/src/routes/api/auth/root.zig
index 785271e..5f45891 100644
--- a/src/routes/api/auth/root.zig
+++ b/src/routes/api/auth/root.zig
@@ -1,4 +1,4 @@
const HandlerInfo = @import("../../handler-info.zig");
pub const login: HandlerInfo = .from_type(@import("login.zig"));
-pub const first_login: HandlerInfo = .from_type(@import("first-login.zig"));
+pub const @"first-login": HandlerInfo = .from_type(@import("first-login.zig"));
diff --git a/src/routes/api/root.zig b/src/routes/api/root.zig
index 19c4074..e3c5d6f 100644
--- a/src/routes/api/root.zig
+++ b/src/routes/api/root.zig
@@ -1 +1,2 @@
pub const auth = @import("auth/root.zig");
+pub const session = @import("session/root.zig");
diff --git a/src/routes/api/session/current.zig b/src/routes/api/session/current.zig
new file mode 100644
index 0000000..31c8476
--- /dev/null
+++ b/src/routes/api/session/current.zig
@@ -0,0 +1,23 @@
+const std = @import("std");
+const Context = @import("../../context.zig");
+
+pub const access = .users;
+
+const Result = struct {
+ name: []const u8,
+ full_name: []const u8,
+ birthday: []const u8,
+};
+
+pub fn get(ctx: *Context) !Result {
+ const session = ctx.storage.sessions.get(
+ ctx.storage,
+ ctx.fingerprint,
+ ) orelse return error.UserDoesNotExist;
+
+ return .{
+ .name = session.info.name,
+ .full_name = session.info.full_name,
+ .birthday = session.info.birthday,
+ };
+}
diff --git a/src/routes/api/session/drop.zig b/src/routes/api/session/drop.zig
new file mode 100644
index 0000000..eacf8ce
--- /dev/null
+++ b/src/routes/api/session/drop.zig
@@ -0,0 +1,8 @@
+const Context = @import("../../context.zig");
+
+pub const access = .users;
+
+pub fn get(ctx: *Context) !void {
+ ctx.storage.sessions.remove(ctx.storage, ctx.fingerprint);
+ ctx.response.headers.fingerprint = "";
+}
diff --git a/src/routes/api/session/renew.zig b/src/routes/api/session/renew.zig
new file mode 100644
index 0000000..7dfa491
--- /dev/null
+++ b/src/routes/api/session/renew.zig
@@ -0,0 +1,8 @@
+const Context = @import("../../context.zig");
+
+pub const access = .users;
+
+pub fn get(ctx: *Context) !void {
+ const new = try ctx.storage.sessions.renew(ctx.storage, ctx.fingerprint);
+ ctx.response.headers.fingerprint = new.fingerprint;
+}
diff --git a/src/routes/api/session/root.zig b/src/routes/api/session/root.zig
new file mode 100644
index 0000000..ea155e5
--- /dev/null
+++ b/src/routes/api/session/root.zig
@@ -0,0 +1,5 @@
+const HandlerInfo = @import("../../handler-info.zig");
+
+pub const current: HandlerInfo = .from_type(@import("current.zig"));
+pub const drop: HandlerInfo = .from_type(@import("renew.zig"));
+pub const renew: HandlerInfo = .from_type(@import("drop.zig"));