feat: cluster groups (#30739)

Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
This commit is contained in:
Jason Rasmussen
2026-08-20 20:03:00 +02:00
committed by GitHub
co-authored by Daniel Dietzler
parent f88fb628ff
commit 11b1aa5ecf
100 changed files with 4299 additions and 1006 deletions
+422
View File
@@ -5861,6 +5861,355 @@
"x-immich-state": "Stable"
}
},
"/cluster-groups/requests": {
"get": {
"description": "Retrieve the pending requests for the current user to join a cluster group.",
"operationId": "getClusterGroupRequests",
"parameters": [],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/ClusterGroupRequestResponseDto"
},
"type": "array"
}
}
},
"description": ""
}
},
"security": [
{
"bearer": []
},
{
"cookie": []
},
{
"api_key": []
}
],
"summary": "Retrieve cluster group requests",
"tags": [
"Cluster groups"
],
"x-immich-history": [
{
"version": "v3.2.0",
"state": "Added"
}
],
"x-immich-permission": "clusterGroupRequest.read"
}
},
"/cluster-groups/requests/{id}": {
"delete": {
"description": "Delete a pending request to join a cluster group.",
"operationId": "deleteClusterGroupRequest",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
],
"responses": {
"204": {
"description": ""
}
},
"security": [
{
"bearer": []
},
{
"cookie": []
},
{
"api_key": []
}
],
"summary": "Decline a cluster group request",
"tags": [
"Cluster groups"
],
"x-immich-history": [
{
"version": "v3.2.0",
"state": "Added"
}
],
"x-immich-permission": "clusterGroupRequest.delete"
}
},
"/cluster-groups/requests/{id}/accept": {
"post": {
"description": "Join the cluster group the request was created for.",
"operationId": "acceptClusterGroupRequest",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
],
"responses": {
"204": {
"description": ""
}
},
"security": [
{
"bearer": []
},
{
"cookie": []
},
{
"api_key": []
}
],
"summary": "Accept a cluster group request",
"tags": [
"Cluster groups"
],
"x-immich-history": [
{
"version": "v3.2.0",
"state": "Added"
}
],
"x-immich-permission": "clusterGroupRequest.create"
}
},
"/cluster-groups/{id}/leave": {
"post": {
"description": "Move the current user into a new cluster group of their own.",
"operationId": "leaveClusterGroup",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
],
"responses": {
"204": {
"description": ""
}
},
"security": [
{
"bearer": []
},
{
"cookie": []
},
{
"api_key": []
}
],
"summary": "Leave a cluster group",
"tags": [
"Cluster groups"
],
"x-immich-history": [
{
"version": "v3.2.0",
"state": "Added"
}
],
"x-immich-permission": "clusterGroup.leave"
}
},
"/cluster-groups/{id}/requests": {
"get": {
"description": "Retrieve the pending requests for other users to join the cluster group.",
"operationId": "getClusterGroupRequestsForGroup",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/ClusterGroupRequestResponseDto"
},
"type": "array"
}
}
},
"description": ""
}
},
"security": [
{
"bearer": []
},
{
"cookie": []
},
{
"api_key": []
}
],
"summary": "Retrieve the requests sent by a cluster group",
"tags": [
"Cluster groups"
],
"x-immich-history": [
{
"version": "v3.2.0",
"state": "Added"
}
],
"x-immich-permission": "clusterGroupRequest.read"
},
"put": {
"description": "Ask another user to join the cluster group of the current user.",
"operationId": "createClusterGroupRequest",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ClusterGroupRequestCreateDto"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ClusterGroupRequestResponseDto"
}
}
},
"description": ""
}
},
"security": [
{
"bearer": []
},
{
"cookie": []
},
{
"api_key": []
}
],
"summary": "Create a cluster group request",
"tags": [
"Cluster groups"
],
"x-immich-history": [
{
"version": "v3.2.0",
"state": "Added"
}
],
"x-immich-permission": "clusterGroupRequest.create"
}
},
"/cluster-groups/{id}/users": {
"get": {
"description": "Retrieve the users that are a member of the cluster group.",
"operationId": "getClusterGroupUsers",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"items": {
"$ref": "#/components/schemas/UserResponseDto"
},
"type": "array"
}
}
},
"description": ""
}
},
"security": [
{
"bearer": []
},
{
"cookie": []
},
{
"api_key": []
}
],
"summary": "Retrieve the users of a cluster group",
"tags": [
"Cluster groups"
],
"x-immich-history": [
{
"version": "v3.2.0",
"state": "Added"
}
],
"x-immich-permission": "clusterGroup.read"
}
},
"/config": {
"get": {
"description": "Retrieve the system configuration properties that are visible to logged in users.",
@@ -16764,6 +17113,10 @@
"name": "Authentication (admin)",
"description": "Administrative endpoints related to authentication."
},
{
"name": "Cluster groups",
"description": "A cluster group is a set of users whose faces are clustered together, so that a person can be shared between them."
},
{
"name": "Config (user)",
"description": "The system configuration properties that are visible to logged in users."
@@ -20142,6 +20495,56 @@
],
"type": "object"
},
"ClusterGroupRequestCreateDto": {
"properties": {
"userId": {
"description": "User to invite into the cluster group",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
"required": [
"userId"
],
"type": "object"
},
"ClusterGroupRequestResponseDto": {
"properties": {
"clusterGroupId": {
"description": "Cluster group the user is invited to join",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
},
"createdAt": {
"description": "Creation date",
"example": "2024-01-01T00:00:00.000Z",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"id": {
"description": "Request ID",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
},
"userId": {
"description": "User the request was created for",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
"required": [
"clusterGroupId",
"createdAt",
"id",
"userId"
],
"type": "object"
},
"Colorspace": {
"description": "Colorspace",
"enum": [
@@ -22105,6 +22508,7 @@
"SystemMessage",
"AlbumInvite",
"AlbumUpdate",
"ClusterGroupRequest",
"Custom"
],
"type": "string"
@@ -22530,6 +22934,11 @@
"backup.download",
"backup.upload",
"backup.delete",
"clusterGroup.read",
"clusterGroup.leave",
"clusterGroupRequest.create",
"clusterGroupRequest.read",
"clusterGroupRequest.delete",
"adminConfig.read",
"adminConfig.update",
"userConfig.read",
@@ -28040,6 +28449,18 @@
"avatarColor": {
"$ref": "#/components/schemas/UserAvatarColor"
},
"clusterGroupId": {
"description": "Cluster group the user is a member of",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string",
"x-immich-history": [
{
"version": "v3.2.0",
"state": "Added"
}
]
},
"createdAt": {
"description": "Creation date",
"example": "2024-01-01T00:00:00.000Z",
@@ -28132,6 +28553,7 @@
},
"required": [
"avatarColor",
"clusterGroupId",
"createdAt",
"deletedAt",
"email",