╭ changed ────╮ │src/event.zig│ ╰─────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │2188 .author = author, │ │2189 .event = .{ .repo = event }, │ │2190 }}); │ │2191 +} │ │2192 + │ │2193 +// remove the repo `repo_id` from its owner's user repo, then its dir. tombstone │ │2194 +// first so a missing repo never remains visible │ │2195 +pub fn deleteRepo( │ │2196 + io: std.Io, │ │2197 + allocator: std.mem.Allocator, │ │2198 + users_dir: []const u8, │ │2199 + owner_id: *const [event_id_size]u8, │ │2200 + repo_id: *const [event_id_size]u8, │ │2201 + author: CommitAuthor, │ │2202 +) !void { │ │2203 + { │ │2204 + var user_repo = (try openUserRepo(io, allocator, users_dir, owner_id)) orelse return error.NotFound; │ │2205 + defer user_repo.deinit(io, allocator); │ │2206 + try remove(.{ .server = .{ .users_dir = users_dir } }, .user, .xit, user_repo_opts, io, allocator, &user_repo, repo_id, .repo, author);│ │2207 + } │ │2208 + const path = try repoPath(allocator, users_dir, owner_id, repo_id); │ │2209 + defer allocator.free(path); │ │2210 + try std.Io.Dir.cwd().deleteTree(io, path); │ │2211 } │ │2212 │ │2213 // grant `user_id` `role` on the repo `repo_id` in its owner's user repo, │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │2391 .author = .{ .name = event.name, .email = email }, │ │2392 .event = .{ .user = event }, │ │2393 }}); │ │2394 +} │ │2395 + │ │2396 +// remove a user from the admin repo, then their dir with every repo and fork │ │2397 +// in it. tombstone first so a missing user never remains visible │ │2398 +pub fn deleteUser( │ │2399 + io: std.Io, │ │2400 + allocator: std.mem.Allocator, │ │2401 + users_dir: []const u8, │ │2402 + admin_repo: *rp.Repo(.xit, admin_repo_opts), │ │2403 + user_id: *const [event_id_size]u8, │ │2404 + author: CommitAuthor, │ │2405 +) !void { │ │2406 + try remove(.{ .server = .{ .users_dir = users_dir } }, .admin, .xit, admin_repo_opts, io, allocator, admin_repo, user_id, .user, author);│ │2407 + const path = try std.Io.Dir.path.join(allocator, &.{ users_dir, &std.fmt.bytesToHex(user_id.*, .lower) }); │ │2408 + defer allocator.free(path); │ │2409 + try std.Io.Dir.cwd().deleteTree(io, path); │ │2410 } │ │2411 │ │2412 // add an authorized_keys line to the user's ssh keys │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯