-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathnamespaces.ts
More file actions
115 lines (103 loc) · 4.54 KB
/
Copy pathnamespaces.ts
File metadata and controls
115 lines (103 loc) · 4.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { z } from 'zod';
import {
HandleSchema,
NamespaceSchema,
NamespaceMemberSchema,
BrandColorSchema,
WorkspaceLogoSchema,
} from '@mediforce/platform-core';
export const GetNamespaceInputSchema = z.object({ handle: HandleSchema });
export const GetNamespaceOutputSchema = z.object({
namespace: NamespaceSchema,
members: z.array(NamespaceMemberSchema),
personalHandles: z.record(z.string(), z.string()).optional(),
});
export type GetNamespaceInput = z.infer<typeof GetNamespaceInputSchema>;
export type GetNamespaceOutput = z.infer<typeof GetNamespaceOutputSchema>;
export const CreateNamespaceInputSchema = z.object({
handle: HandleSchema,
displayName: z.string().min(1).max(128),
bio: z.string().max(2048).optional(),
});
export const CreateNamespaceOutputSchema = z.object({
namespace: NamespaceSchema,
});
export type CreateNamespaceInput = z.infer<typeof CreateNamespaceInputSchema>;
export type CreateNamespaceOutput = z.infer<typeof CreateNamespaceOutputSchema>;
/**
* PATCH /api/namespaces/:handle — workspace metadata edit (owner/admin only).
* Omitting a field leaves it unchanged; passing an empty string for `bio`
* clears it.
*/
const UpdateNamespaceFieldsSchema = z.object({
displayName: z.string().min(1).max(128).optional(),
bio: z.string().max(2048).optional(),
icon: z.string().min(1).max(64).optional(),
logo: WorkspaceLogoSchema.optional(),
brandPrimaryColor: BrandColorSchema.optional(),
brandAccentColor: BrandColorSchema.optional(),
});
const atLeastOneUpdateField = (v: z.infer<typeof UpdateNamespaceFieldsSchema>): boolean =>
v.displayName !== undefined ||
v.bio !== undefined ||
v.icon !== undefined ||
v.logo !== undefined ||
v.brandPrimaryColor !== undefined ||
v.brandAccentColor !== undefined;
const atLeastOneUpdateFieldMessage =
'At least one of displayName, bio, icon, logo, brandPrimaryColor, brandAccentColor must be provided';
export const UpdateNamespaceBodySchema = UpdateNamespaceFieldsSchema.refine(
atLeastOneUpdateField,
{ message: atLeastOneUpdateFieldMessage },
);
export const UpdateNamespaceInputSchema = UpdateNamespaceFieldsSchema
.extend({ handle: HandleSchema })
.refine(atLeastOneUpdateField, { message: atLeastOneUpdateFieldMessage });
export const UpdateNamespaceOutputSchema = z.object({ namespace: NamespaceSchema });
export type UpdateNamespaceInput = z.infer<typeof UpdateNamespaceInputSchema>;
export type UpdateNamespaceOutput = z.infer<typeof UpdateNamespaceOutputSchema>;
/**
* DELETE /api/namespaces/:handle — cascade delete (owner only).
*/
export const DeleteNamespaceInputSchema = z.object({ handle: HandleSchema });
export const DeleteNamespaceOutputSchema = z.object({ handle: HandleSchema });
export type DeleteNamespaceInput = z.infer<typeof DeleteNamespaceInputSchema>;
export type DeleteNamespaceOutput = z.infer<typeof DeleteNamespaceOutputSchema>;
/**
* POST /api/namespaces/:handle/leave — caller removes self from workspace.
* Owner blocked → 409 `precondition_failed` per ADR-0005 §3.
*/
export const LeaveNamespaceInputSchema = z.object({ handle: HandleSchema });
export const LeaveNamespaceOutputSchema = z.object({ handle: HandleSchema });
export type LeaveNamespaceInput = z.infer<typeof LeaveNamespaceInputSchema>;
export type LeaveNamespaceOutput = z.infer<typeof LeaveNamespaceOutputSchema>;
/**
* DELETE /api/namespaces/:handle/members/:uid — owner/admin removes member.
* Removing the owner is rejected — transfer / delete workspace instead.
*/
export const RemoveNamespaceMemberInputSchema = z.object({
handle: HandleSchema,
uid: z.string().min(1),
});
export const RemoveNamespaceMemberOutputSchema = z.object({
handle: HandleSchema,
uid: z.string().min(1),
});
export type RemoveNamespaceMemberInput = z.infer<typeof RemoveNamespaceMemberInputSchema>;
export type RemoveNamespaceMemberOutput = z.infer<typeof RemoveNamespaceMemberOutputSchema>;
/**
* PATCH /api/namespaces/:handle/members/:uid — owner flips admin/member role.
* Promoting / demoting `owner` is rejected at this endpoint.
*/
export const UpdateNamespaceMemberRoleBodySchema = z.object({
role: z.enum(['admin', 'member']),
});
export const UpdateNamespaceMemberRoleInputSchema = UpdateNamespaceMemberRoleBodySchema.extend({
handle: HandleSchema,
uid: z.string().min(1),
});
export const UpdateNamespaceMemberRoleOutputSchema = z.object({
member: NamespaceMemberSchema,
});
export type UpdateNamespaceMemberRoleInput = z.infer<typeof UpdateNamespaceMemberRoleInputSchema>;
export type UpdateNamespaceMemberRoleOutput = z.infer<typeof UpdateNamespaceMemberRoleOutputSchema>;