チャンネルの非掲載・フォロー承認制・フォロワー管理に対応 - #22
Conversation
|
Warning Review limit reached
Next review available in: 28 minutes Limit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?Wait for the limit to reset, then comment An organization admin can change what happens after included review limits in Billing. How do review limits work?CodeRabbit enforces per-developer PR review limits within each organization. For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (41)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
このPRによるapi.jsonの差分 差分はこちら--- base
+++ head
@@ -27354,6 +27354,14 @@
"isLocalOnly": {
"type": "boolean",
"default": false
+ },
+ "isUnlisted": {
+ "type": "boolean",
+ "default": false
+ },
+ "isFollowApprovalRequired": {
+ "type": "boolean",
+ "default": false
}
},
"required": [
@@ -27840,8 +27848,27 @@
}
},
"responses": {
- "204": {
- "description": "OK (without any results)"
+ "200": {
+ "description": "OK (with results)",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "state": {
+ "type": "string",
+ "enum": [
+ "following",
+ "pending"
+ ]
+ }
+ },
+ "required": [
+ "state"
+ ]
+ }
+ }
+ }
},
"400": {
"description": "Client error",
@@ -27969,6 +27996,574 @@
}
}
},
+ "/channels/follow-requests/approve": {
+ "post": {
+ "operationId": "post___channels___follow-requests___approve",
+ "summary": "channels/follow-requests/approve",
+ "description": "No description provided.\n\n**Credential required**: *Yes* / **Permission**: *write:channels*",
+ "externalDocs": {
+ "description": "Source code",
+ "url": "https://github.com/misskey-dev/misskey/blob/develop/packages/backend/src/server/api/endpoints/channels/follow-requests/approve.ts"
+ },
+ "tags": [
+ "channels"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "channelId": {
+ "type": "string",
+ "format": "misskey:id"
+ },
+ "userId": {
+ "type": "string",
+ "format": "misskey:id"
+ }
+ },
+ "required": [
+ "channelId",
+ "userId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "204": {
+ "description": "OK (without any results)"
+ },
+ "400": {
+ "description": "Client error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "NO_SUCH_CHANNEL": {
+ "value": {
+ "error": {
+ "message": "No such channel.",
+ "code": "NO_SUCH_CHANNEL",
+ "id": "99490eaf-ef2c-4431-98db-7b632ec6002f"
+ }
+ }
+ },
+ "ACCESS_DENIED": {
+ "value": {
+ "error": {
+ "message": "You do not have permission to manage this channel.",
+ "code": "ACCESS_DENIED",
+ "id": "f357e948-98bc-40c6-b25e-f76ebfdd75b5"
+ }
+ }
+ },
+ "NO_SUCH_CHANNEL_FOLLOW_REQUEST": {
+ "value": {
+ "error": {
+ "message": "No such channel follow request.",
+ "code": "NO_SUCH_CHANNEL_FOLLOW_REQUEST",
+ "id": "bcac94b8-f83b-48e5-84da-3281b94a10b0"
+ }
+ }
+ },
+ "INVALID_PARAM": {
+ "value": {
+ "error": {
+ "message": "Invalid param.",
+ "code": "INVALID_PARAM",
+ "id": "3d81ceae-475f-4600-b2a8-2bc116157532"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "CREDENTIAL_REQUIRED": {
+ "value": {
+ "error": {
+ "message": "Credential required.",
+ "code": "CREDENTIAL_REQUIRED",
+ "id": "1384574d-a912-4b81-8601-c7b1c4085df1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Forbidden error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "AUTHENTICATION_FAILED": {
+ "value": {
+ "error": {
+ "message": "Authentication failed. Please ensure your token is correct.",
+ "code": "AUTHENTICATION_FAILED",
+ "id": "b0a7f5f8-dc2f-4171-b91f-de88ad238e14"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "418": {
+ "description": "I'm Ai",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "I_AM_AI": {
+ "value": {
+ "error": {
+ "message": "You sent a request to Ai-chan, Misskey's showgirl, instead of the server.",
+ "code": "I_AM_AI",
+ "id": "60c46cd1-f23a-46b1-bebe-5d2b73951a84"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "INTERNAL_ERROR": {
+ "value": {
+ "error": {
+ "message": "Internal error occurred. Please contact us if the error persists.",
+ "code": "INTERNAL_ERROR",
+ "id": "5d37dbcb-891e-41ca-a3d6-e690c97775ac"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/channels/follow-requests/list": {
+ "post": {
+ "operationId": "post___channels___follow-requests___list",
+ "summary": "channels/follow-requests/list",
+ "description": "No description provided.\n\n**Credential required**: *Yes* / **Permission**: *read:channels*",
+ "externalDocs": {
+ "description": "Source code",
+ "url": "https://github.com/misskey-dev/misskey/blob/develop/packages/backend/src/server/api/endpoints/channels/follow-requests/list.ts"
+ },
+ "tags": [
+ "channels"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "channelId": {
+ "type": "string",
+ "format": "misskey:id"
+ },
+ "sinceId": {
+ "type": "string",
+ "format": "misskey:id"
+ },
+ "untilId": {
+ "type": "string",
+ "format": "misskey:id"
+ },
+ "limit": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 100,
+ "default": 10
+ }
+ },
+ "required": [
+ "channelId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK (with results)",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "id"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "user": {
+ "$ref": "#/components/schemas/UserLite"
+ }
+ },
+ "required": [
+ "id",
+ "createdAt",
+ "user"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Client error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "NO_SUCH_CHANNEL": {
+ "value": {
+ "error": {
+ "message": "No such channel.",
+ "code": "NO_SUCH_CHANNEL",
+ "id": "448f1a4e-9cd0-4d6b-a9b8-302c486ad552"
+ }
+ }
+ },
+ "ACCESS_DENIED": {
+ "value": {
+ "error": {
+ "message": "You do not have permission to manage this channel.",
+ "code": "ACCESS_DENIED",
+ "id": "34fc619d-9f19-4e52-8a29-04642575f7cf"
+ }
+ }
+ },
+ "INVALID_PARAM": {
+ "value": {
+ "error": {
+ "message": "Invalid param.",
+ "code": "INVALID_PARAM",
+ "id": "3d81ceae-475f-4600-b2a8-2bc116157532"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "CREDENTIAL_REQUIRED": {
+ "value": {
+ "error": {
+ "message": "Credential required.",
+ "code": "CREDENTIAL_REQUIRED",
+ "id": "1384574d-a912-4b81-8601-c7b1c4085df1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Forbidden error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "AUTHENTICATION_FAILED": {
+ "value": {
+ "error": {
+ "message": "Authentication failed. Please ensure your token is correct.",
+ "code": "AUTHENTICATION_FAILED",
+ "id": "b0a7f5f8-dc2f-4171-b91f-de88ad238e14"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "418": {
+ "description": "I'm Ai",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "I_AM_AI": {
+ "value": {
+ "error": {
+ "message": "You sent a request to Ai-chan, Misskey's showgirl, instead of the server.",
+ "code": "I_AM_AI",
+ "id": "60c46cd1-f23a-46b1-bebe-5d2b73951a84"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "INTERNAL_ERROR": {
+ "value": {
+ "error": {
+ "message": "Internal error occurred. Please contact us if the error persists.",
+ "code": "INTERNAL_ERROR",
+ "id": "5d37dbcb-891e-41ca-a3d6-e690c97775ac"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/channels/follow-requests/reject": {
+ "post": {
+ "operationId": "post___channels___follow-requests___reject",
+ "summary": "channels/follow-requests/reject",
+ "description": "No description provided.\n\n**Credential required**: *Yes* / **Permission**: *write:channels*",
+ "externalDocs": {
+ "description": "Source code",
+ "url": "https://github.com/misskey-dev/misskey/blob/develop/packages/backend/src/server/api/endpoints/channels/follow-requests/reject.ts"
+ },
+ "tags": [
+ "channels"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "channelId": {
+ "type": "string",
+ "format": "misskey:id"
+ },
+ "userId": {
+ "type": "string",
+ "format": "misskey:id"
+ }
+ },
+ "required": [
+ "channelId",
+ "userId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "204": {
+ "description": "OK (without any results)"
+ },
+ "400": {
+ "description": "Client error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "NO_SUCH_CHANNEL": {
+ "value": {
+ "error": {
+ "message": "No such channel.",
+ "code": "NO_SUCH_CHANNEL",
+ "id": "f9bad040-6ccb-438d-a2a5-14aea3efc318"
+ }
+ }
+ },
+ "ACCESS_DENIED": {
+ "value": {
+ "error": {
+ "message": "You do not have permission to manage this channel.",
+ "code": "ACCESS_DENIED",
+ "id": "93f735ad-e05d-470d-8612-2aa23d2a4a45"
+ }
+ }
+ },
+ "NO_SUCH_CHANNEL_FOLLOW_REQUEST": {
+ "value": {
+ "error": {
+ "message": "No such channel follow request.",
+ "code": "NO_SUCH_CHANNEL_FOLLOW_REQUEST",
+ "id": "b06622f9-6a22-479e-914c-13b37d944eb2"
+ }
+ }
+ },
+ "INVALID_PARAM": {
+ "value": {
+ "error": {
+ "message": "Invalid param.",
+ "code": "INVALID_PARAM",
+ "id": "3d81ceae-475f-4600-b2a8-2bc116157532"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "CREDENTIAL_REQUIRED": {
+ "value": {
+ "error": {
+ "message": "Credential required.",
+ "code": "CREDENTIAL_REQUIRED",
+ "id": "1384574d-a912-4b81-8601-c7b1c4085df1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Forbidden error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "AUTHENTICATION_FAILED": {
+ "value": {
+ "error": {
+ "message": "Authentication failed. Please ensure your token is correct.",
+ "code": "AUTHENTICATION_FAILED",
+ "id": "b0a7f5f8-dc2f-4171-b91f-de88ad238e14"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "418": {
+ "description": "I'm Ai",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "I_AM_AI": {
+ "value": {
+ "error": {
+ "message": "You sent a request to Ai-chan, Misskey's showgirl, instead of the server.",
+ "code": "I_AM_AI",
+ "id": "60c46cd1-f23a-46b1-bebe-5d2b73951a84"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "INTERNAL_ERROR": {
+ "value": {
+ "error": {
+ "message": "Internal error occurred. Please contact us if the error persists.",
+ "code": "INTERNAL_ERROR",
+ "id": "5d37dbcb-891e-41ca-a3d6-e690c97775ac"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/channels/followed": {
"post": {
"operationId": "post___channels___followed",
@@ -28140,6 +28735,385 @@
}
}
},
+ "/channels/followers": {
+ "post": {
+ "operationId": "post___channels___followers",
+ "summary": "channels/followers",
+ "description": "No description provided.\n\n**Credential required**: *Yes* / **Permission**: *read:channels*",
+ "externalDocs": {
+ "description": "Source code",
+ "url": "https://github.com/misskey-dev/misskey/blob/develop/packages/backend/src/server/api/endpoints/channels/followers.ts"
+ },
+ "tags": [
+ "channels"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "channelId": {
+ "type": "string",
+ "format": "misskey:id"
+ },
+ "sinceId": {
+ "type": "string",
+ "format": "misskey:id"
+ },
+ "untilId": {
+ "type": "string",
+ "format": "misskey:id"
+ },
+ "limit": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 100,
+ "default": 10
+ }
+ },
+ "required": [
+ "channelId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "OK (with results)",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "format": "id"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "user": {
+ "$ref": "#/components/schemas/UserLite"
+ }
+ },
+ "required": [
+ "id",
+ "createdAt",
+ "user"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Client error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "NO_SUCH_CHANNEL": {
+ "value": {
+ "error": {
+ "message": "No such channel.",
+ "code": "NO_SUCH_CHANNEL",
+ "id": "d662d052-7760-46d1-83cc-60f857c88c4f"
+ }
+ }
+ },
+ "ACCESS_DENIED": {
+ "value": {
+ "error": {
+ "message": "You do not have permission to manage this channel.",
+ "code": "ACCESS_DENIED",
+ "id": "d9c62aa5-3331-41fe-8f73-666b549b895d"
+ }
+ }
+ },
+ "INVALID_PARAM": {
+ "value": {
+ "error": {
+ "message": "Invalid param.",
+ "code": "INVALID_PARAM",
+ "id": "3d81ceae-475f-4600-b2a8-2bc116157532"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "CREDENTIAL_REQUIRED": {
+ "value": {
+ "error": {
+ "message": "Credential required.",
+ "code": "CREDENTIAL_REQUIRED",
+ "id": "1384574d-a912-4b81-8601-c7b1c4085df1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Forbidden error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "AUTHENTICATION_FAILED": {
+ "value": {
+ "error": {
+ "message": "Authentication failed. Please ensure your token is correct.",
+ "code": "AUTHENTICATION_FAILED",
+ "id": "b0a7f5f8-dc2f-4171-b91f-de88ad238e14"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "418": {
+ "description": "I'm Ai",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "I_AM_AI": {
+ "value": {
+ "error": {
+ "message": "You sent a request to Ai-chan, Misskey's showgirl, instead of the server.",
+ "code": "I_AM_AI",
+ "id": "60c46cd1-f23a-46b1-bebe-5d2b73951a84"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "INTERNAL_ERROR": {
+ "value": {
+ "error": {
+ "message": "Internal error occurred. Please contact us if the error persists.",
+ "code": "INTERNAL_ERROR",
+ "id": "5d37dbcb-891e-41ca-a3d6-e690c97775ac"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/channels/followers/remove": {
+ "post": {
+ "operationId": "post___channels___followers___remove",
+ "summary": "channels/followers/remove",
+ "description": "No description provided.\n\n**Credential required**: *Yes* / **Permission**: *write:channels*",
+ "externalDocs": {
+ "description": "Source code",
+ "url": "https://github.com/misskey-dev/misskey/blob/develop/packages/backend/src/server/api/endpoints/channels/followers/remove.ts"
+ },
+ "tags": [
+ "channels"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "channelId": {
+ "type": "string",
+ "format": "misskey:id"
+ },
+ "userId": {
+ "type": "string",
+ "format": "misskey:id"
+ }
+ },
+ "required": [
+ "channelId",
+ "userId"
+ ]
+ }
+ }
+ }
+ },
+ "responses": {
+ "204": {
+ "description": "OK (without any results)"
+ },
+ "400": {
+ "description": "Client error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "NO_SUCH_CHANNEL": {
+ "value": {
+ "error": {
+ "message": "No such channel.",
+ "code": "NO_SUCH_CHANNEL",
+ "id": "0426c4c2-11e0-4c62-8004-97e5b42b9bee"
+ }
+ }
+ },
+ "ACCESS_DENIED": {
+ "value": {
+ "error": {
+ "message": "You do not have permission to manage this channel.",
+ "code": "ACCESS_DENIED",
+ "id": "450ed3ae-138c-4ab3-8538-92fb50c9dec7"
+ }
+ }
+ },
+ "INVALID_PARAM": {
+ "value": {
+ "error": {
+ "message": "Invalid param.",
+ "code": "INVALID_PARAM",
+ "id": "3d81ceae-475f-4600-b2a8-2bc116157532"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "CREDENTIAL_REQUIRED": {
+ "value": {
+ "error": {
+ "message": "Credential required.",
+ "code": "CREDENTIAL_REQUIRED",
+ "id": "1384574d-a912-4b81-8601-c7b1c4085df1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Forbidden error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "AUTHENTICATION_FAILED": {
+ "value": {
+ "error": {
+ "message": "Authentication failed. Please ensure your token is correct.",
+ "code": "AUTHENTICATION_FAILED",
+ "id": "b0a7f5f8-dc2f-4171-b91f-de88ad238e14"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "418": {
+ "description": "I'm Ai",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "I_AM_AI": {
+ "value": {
+ "error": {
+ "message": "You sent a request to Ai-chan, Misskey's showgirl, instead of the server.",
+ "code": "I_AM_AI",
+ "id": "60c46cd1-f23a-46b1-bebe-5d2b73951a84"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Internal server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Error"
+ },
+ "examples": {
+ "INTERNAL_ERROR": {
+ "value": {
+ "error": {
+ "message": "Internal error occurred. Please contact us if the error persists.",
+ "code": "INTERNAL_ERROR",
+ "id": "5d37dbcb-891e-41ca-a3d6-e690c97775ac"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/channels/mute/create": {
"post": {
"operationId": "post___channels___mute___create",
@@ -29856,6 +30830,12 @@
"isLocalOnly": {
"type": "boolean"
},
+ "isUnlisted": {
+ "type": "boolean"
+ },
+ "isFollowApprovalRequired": {
+ "type": "boolean"
+ },
"transferAdminUserId": {
"type": "string",
"format": "misskey:id"
@@ -100066,6 +101046,9 @@
"usersCount": {
"type": "number"
},
+ "followersCount": {
+ "type": "number"
+ },
"notesCount": {
"type": "number"
},
@@ -100078,6 +101061,9 @@
"isFollowing": {
"type": "boolean"
},
+ "hasPendingFollowRequest": {
+ "type": "boolean"
+ },
"isFavorited": {
"type": "boolean"
},
@@ -100099,6 +101085,12 @@
},
"isLocalOnly": {
"type": "boolean"
+ },
+ "isUnlisted": {
+ "type": "boolean"
+ },
+ "isFollowApprovalRequired": {
+ "type": "boolean"
}
},
"required": [
@@ -100114,10 +101106,13 @@
"color",
"isArchived",
"usersCount",
+ "followersCount",
"notesCount",
"isSensitive",
"allowRenoteToExternal",
- "isLocalOnly"
+ "isLocalOnly",
+ "isUnlisted",
+ "isFollowApprovalRequired"
]
},
"QueueCount": { |
|
Thank you for sending us a great Pull Request! 👍 example: pnpm run build-misskey-js-with-types |
⚙️ Backend Diagnostics ReportMemory: After GC
Only metrics showing significant changes are displayed. V8 Heap Snapshot Statistics
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a4aea9537a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| }, ...(canManageChannelEvents.value ? [{ | ||
| }, ...(canManageChannelFollowers.value ? [{ | ||
| key: 'followers', | ||
| title: i18n.ts._channel.followRequests, |
There was a problem hiding this comment.
Label the tab as follower management
Managers who want to remove an existing follower only see a tab labeled “Follow requests,” even though the tab also contains the complete follower list and removal controls. This makes the newly added follower-management feature difficult to discover; the same commit adds the more accurate _channel.followerManagement locale key, but it is otherwise unused.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2b6895cac5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| for (const request of requests) { | ||
| if (await this.insertFollowing(manager, request.followerId, targetChannel.id)) { | ||
| approvedFollowerIds.push(request.followerId); |
There was a problem hiding this comment.
Batch pending approvals instead of issuing per-request writes
When approval is disabled on a channel with many pending requests, this loop performs a following insert and a separate counter update for every request, sequentially, while holding the channel's write lock. A popular channel with thousands of requests can therefore generate thousands of round trips, time out the channels/update call, and block follow/unfollow operations for the duration; convert the requests to followings and update the count with bounded bulk queries.
Useful? React with 👍 / 👎.
| }, ...(canManageChannelFollowers.value ? [{ | ||
| key: 'followRequests', | ||
| title: i18n.ts._channel.followRequests, | ||
| icon: 'ti ti-user-check', | ||
| indicate: hasPendingChannelFollowRequests.value, | ||
| }, { | ||
| key: 'followerManagement', |
There was a problem hiding this comment.
Reset manager-only tabs when switching channels
When this page instance is reused for another channel, tab retains followRequests or followerManagement; the channel watcher only changes it when the destination is followed or favorited. If a manager opens one of these tabs and then navigates to an unfollowed channel they do not manage, the tab is removed from headerTabs and both guarded content branches are false, leaving a blank page with no selected tab until the user manually chooses another tab.
Useful? React with 👍 / 👎.
What
チャンネルを身内・個人向けに運用しやすくするため、次の機能を追加します。
flowchart LR U[ユーザー] -->|フォロー| C{承認制?} C -->|いいえ| F[フォロー中] C -->|はい| R[申請中] R -->|承認| F R -->|拒否・本人が取消| X[未フォロー] F -->|管理者が削除・本人が解除| XerDiagram channel ||--o{ channel_follow_request : has user ||--o{ channel_follow_request : submits channel ||--o{ channel_following : has user ||--o{ channel_following : followsWhy
身内チャンネルや個人チャンネルを通常の発見面に載せずに運用し、参加者をチャンネル管理者側で管理できるようにするためです。共同管理者にも申請・フォロワー管理を許可することで、オーナーだけに管理負荷が集中しないようにします。
Additional info (optional)
origin/developを通常マージし、PRの競合を解消済みです。確認済み:
ChannelFollowingService16件ALREADY_FOLLOWINGgit diff --checkcodex review --base origin/develop(指摘なし)Frontend全体のtypecheckは、今回の変更外にある
MkLightbox.item.audio-visualizer.vue、MkLightbox.item.vue、admin/job-queue.vueの上流エラー3件により完走しません。Checklist