╭ changed ────╮ │src/serve.zig│ ╰─────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │20 data_dir: []const u8 = ".", │ │21 git_ssh_prefix: []const u8 = "", │ │22 fallback_on_address_in_use: bool = false, │ │23 +}; │ │24 + │ │25 +pub const DeleteUserOptions = struct { │ │26 + name: []const u8, │ │27 + data_dir: []const u8 = ".", │ │28 }; │ │29 │ │30 +// delete the named user as their own delete tab does, minus the password check │ │31 +pub fn deleteUser( │ │32 + io: std.Io, │ │33 + allocator: std.mem.Allocator, │ │34 + cwd_path: []const u8, │ │35 + options: DeleteUserOptions, │ │36 + out: *std.Io.Writer, │ │37 + err: *std.Io.Writer, │ │38 +) !void { │ │39 + const data_dir_path = try std.Io.Dir.path.resolveAlloc(allocator, &.{ cwd_path, options.data_dir }); │ │40 + defer allocator.free(data_dir_path); │ │41 + const users_dir = try std.Io.Dir.path.resolveAlloc(allocator, &.{ data_dir_path, "users" }); │ │42 + defer allocator.free(users_dir); │ │43 + const admin_repo_path = try std.Io.Dir.path.resolveAlloc(allocator, &.{ data_dir_path, "admin" }); │ │44 + defer allocator.free(admin_repo_path); │ │45 + │ │46 + var admin_repo = rp.Repo(.xit, evt.admin_repo_opts).open(io, allocator, .{ .path = admin_repo_path }) catch |open_err| switch (open_err) {│ │47 + error.RepoNotFound, error.FileNotFound => { │ │48 + try err.print("no haxy data in {s}\n", .{data_dir_path}); │ │49 + return error.HandledError; │ │50 + }, │ │51 + else => |e| return e, │ │52 + }; │ │53 + defer admin_repo.deinit(io, allocator); │ │54 + │ │55 + var arena = std.heap.ArenaAllocator.init(allocator); │ │56 + defer arena.deinit(); │ │57 + const moment = try evt.currentMoment(evt.admin_repo_opts, &admin_repo); │ │58 + const user_id, const user = blk: { │ │59 + if (try evt.User.readIdByName(evt.AdminDB, evt.admin_repo_opts.hash, moment, options.name)) |id| { │ │60 + if (try ui.activeUser(moment, &arena, id)) |found| break :blk .{ id, found }; │ │61 + } │ │62 + try err.print("no user named {s}\n", .{options.name}); │ │63 + return error.HandledError; │ │64 + }; │ │65 + │ │66 + try evt.deleteUser(io, allocator, users_dir, &admin_repo, &user_id, .{ .name = user.event.name, .email = user.event.email }); │ │67 + try out.print("deleted user {s}\n", .{user.event.name}); │ │68 +} │ │69 + │ │70 const ListenAddress = struct { │ │71 host: []const u8, │ │72 port: u16, │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯