Files
cobble/src/schemas/user-schema.ts
T
tbenandClaude Opus 5.5 391943a1c2 Set a user's bots and workspaces in their own groups, saved at once
Take the Bots and Workspaces pickers out of the user form. A user's
settings page lists what they reach in two groups, like a workspace's
Bots group: each row links to its settings and can be taken away, and
a select adds one, saved straight away through users/add-access and
users/remove-access (setUserGrant).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 15:44:59 +01:00

56 lines
2.0 KiB
TypeScript

import { z } from "zod";
import { UserTypes } from "@/src/dict/user-types-dict";
export const SaveUserRequestSchema = z
.object({
/**
* Updates this user; creates one when not given.
*/
user_id: z.coerce.number().int().positive().nullish(),
first_name: z.string().trim().min(1, "Enter their first name").max(100),
last_name: z.string().trim().max(100).default(""),
email: z.email("Enter a valid email address"),
username: z.string().trim().min(3, "Usernames must be at least 3 characters").max(32, "Usernames must be at most 32 characters"),
/**
* Required for a new user; on an existing one, empty keeps theirs.
*/
password: z.string().max(128).default(""),
confirm_password: z.string().max(128).default(""),
/**
* Every user type they should hold (`UserTypes`). Types the actor may
* not grant or remove (`super_admin`, the assignment matrix) are left
* as they are.
*/
user_types: z.array(z.enum(UserTypes.map((type) => type.value))).default([]),
/**
* A new profile photo as a base64 data URL; left out keeps theirs.
*/
image: z.string().startsWith("data:image/", "Pick an image").nullish(),
})
.refine((data) => data.password == data.confirm_password, {
message: "The passwords don't match",
path: ["confirm_password"],
});
export type SaveUserRequest = z.infer<typeof SaveUserRequestSchema>;
export const UserIdRequestSchema = z.object({
user_id: z.coerce.number().int().positive("Pick a user"),
});
export type UserIdRequest = z.infer<typeof UserIdRequestSchema>;
export const UserGrantKinds = ["bot", "workspace"] as const;
export type UserGrantKind = (typeof UserGrantKinds)[number];
/**
* One worker or workspace to give a user or take away
* (`users/add-access`, `users/remove-access`).
*/
export const UserGrantRequestSchema = z.object({
user_id: z.coerce.number().int().positive(),
kind: z.enum(UserGrantKinds),
id: z.coerce.number().int().positive(),
});