diff options
Diffstat (limited to 'backend/src/Database/UserAccessLayer.zig')
| -rw-r--r-- | backend/src/Database/UserAccessLayer.zig | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/backend/src/Database/UserAccessLayer.zig b/backend/src/Database/UserAccessLayer.zig new file mode 100644 index 0000000..46692ad --- /dev/null +++ b/backend/src/Database/UserAccessLayer.zig @@ -0,0 +1,48 @@ +// You are not supposed to include this file. To access this you should use +// Connection.Users. + +const conn = @import("Connection.zig"); +const std = @import("std"); +const pg = @import("pg"); +const model = @import("../Models/User.zig"); + + +pub fn Create(NewUser: *model.User) !void { + if (try ExistsByUsername(NewUser.Username)) + return conn.ResultErrors.AlreadyExists; + const query = + \\ INSERT INTO Users + \\ (Username, PasswordHash, Role) + \\ VALUES + \\ ($1, $2, $3) + ; + + _ = try conn.pool.exec(query, .{ + NewUser.Username, + NewUser.PasswordHash, + model.Role.ToString(NewUser.Role), + }); +} + +pub fn GetByCredentials(allocator: std.mem.Allocator, username: []const u8, passwordHash: []const u8) !model.User { + const query = + \\ SELECT * FROM Users WHERE + \\ Username = $1 AND PasswordHash = $2 + ; + var row = try conn.pool.row(query, .{ username, passwordHash }) orelse { + return conn.ResultErrors.NotFound; + }; + + const outp = try model.User.MapWithAllocator(allocator, row.row); + try row.deinit(); + return outp; +} + +pub fn ExistsByUsername(username: []const u8) !bool { + const query = "SELECT Id FROM Users WHERE Username = $1"; + var row = try conn.pool.row(query, .{username}) orelse { + return false; + }; + try row.deinit(); + return true; +} |
