diff options
Diffstat (limited to 'src/routes/api')
| -rw-r--r-- | src/routes/api/auth/first-login.zig | 5 | ||||
| -rw-r--r-- | src/routes/api/auth/login.zig | 18 | ||||
| -rw-r--r-- | src/routes/api/auth/root.zig | 2 | ||||
| -rw-r--r-- | src/routes/api/root.zig | 1 | ||||
| -rw-r--r-- | src/routes/api/session/current.zig | 23 | ||||
| -rw-r--r-- | src/routes/api/session/drop.zig | 8 | ||||
| -rw-r--r-- | src/routes/api/session/renew.zig | 8 | ||||
| -rw-r--r-- | src/routes/api/session/root.zig | 5 |
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")); |