feat(activities): let creators lock edit and delete to themselves

Add editPolicy (default creator-only), enforce it in the API, surface clear permission messages, and drop the redundant edit menu now that detail is editable.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-11-11 15:56:36 +03:30
co-authored by Cursor
parent ec9a7cf9c9
commit 1a05eee46d
10 changed files with 279 additions and 57 deletions
+13
View File
@@ -2124,6 +2124,14 @@ export interface ActivityImageDto {
export type ActivityCompletionMode = "any" | "all";
/** چه کسانی می‌توانند فعالیت را ویرایش یا حذف کنند (علاوه بر owner/admin) */
export type ActivityEditPolicy = "creator" | "assignees";
export const ACTIVITY_EDIT_POLICY_LABELS: Record<ActivityEditPolicy, string> = {
creator: "فقط ایجادکننده",
assignees: "همهٔ مسئولان",
};
export interface ActivityDto {
id: string;
type: ActivityType;
@@ -2145,6 +2153,8 @@ export interface ActivityDto {
completionMode?: ActivityCompletionMode;
/** شناسهٔ مسئولانی که سهم خود را در حالت all ثبت کرده‌اند */
completedByIds?: string[];
/** پیش‌فرض creator؛ assignees یعنی همهٔ مسئولان هم می‌توانند ویرایش/حذف کنند */
editPolicy?: ActivityEditPolicy;
/** manual یا didar؛ برای جدا کردن سابقهٔ قبلی */
importSource?: string;
promotedFromPriorAt?: string | null;
@@ -2204,6 +2214,8 @@ export interface CreateActivityRequest {
assigneeIds?: string[];
/** پیش‌فرض any. فقط وقتی چند مسئول دارد معنی دارد */
completionMode?: ActivityCompletionMode;
/** پیش‌فرض creator */
editPolicy?: ActivityEditPolicy;
}
export interface UpdateActivityRequest {
@@ -2229,6 +2241,7 @@ export interface UpdateActivityRequest {
assigneeId?: string | null;
assigneeIds?: string[];
completionMode?: ActivityCompletionMode;
editPolicy?: ActivityEditPolicy;
}
export interface ActivitySummaryDto {