enhance: 送信したチャットルームへの招待を確認できるように
This commit is contained in:
parent
1736955694
commit
c51e862b7d
|
@ -5424,6 +5424,10 @@ export interface Locale extends ILocale {
|
||||||
* ユーザーを招待
|
* ユーザーを招待
|
||||||
*/
|
*/
|
||||||
"inviteUser": string;
|
"inviteUser": string;
|
||||||
|
/**
|
||||||
|
* 送信した招待
|
||||||
|
*/
|
||||||
|
"sentInvitations": string;
|
||||||
/**
|
/**
|
||||||
* 参加
|
* 参加
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1353,6 +1353,7 @@ _chat:
|
||||||
noHistory: "履歴はありません"
|
noHistory: "履歴はありません"
|
||||||
noRooms: "ルームはありません"
|
noRooms: "ルームはありません"
|
||||||
inviteUser: "ユーザーを招待"
|
inviteUser: "ユーザーを招待"
|
||||||
|
sentInvitations: "送信した招待"
|
||||||
join: "参加"
|
join: "参加"
|
||||||
ignore: "無視"
|
ignore: "無視"
|
||||||
leave: "ルームから退出"
|
leave: "ルームから退出"
|
||||||
|
|
|
@ -547,6 +547,16 @@ export class ChatService {
|
||||||
return created;
|
return created;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async getSentRoomInvitationsWithPagination(roomId: MiChatRoom['id'], limit: number, sinceId?: MiChatRoomInvitation['id'] | null, untilId?: MiChatRoomInvitation['id'] | null) {
|
||||||
|
const query = this.queryService.makePaginationQuery(this.chatRoomInvitationsRepository.createQueryBuilder('invitation'), sinceId, untilId)
|
||||||
|
.where('invitation.roomId = :roomId', { roomId });
|
||||||
|
|
||||||
|
const invitations = await query.take(limit).getMany();
|
||||||
|
|
||||||
|
return invitations;
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async getOwnedRoomsWithPagination(ownerId: MiUser['id'], limit: number, sinceId?: MiChatRoom['id'] | null, untilId?: MiChatRoom['id'] | null) {
|
public async getOwnedRoomsWithPagination(ownerId: MiUser['id'], limit: number, sinceId?: MiChatRoom['id'] | null, untilId?: MiChatRoom['id'] | null) {
|
||||||
const query = this.queryService.makePaginationQuery(this.chatRoomsRepository.createQueryBuilder('room'), sinceId, untilId)
|
const query = this.queryService.makePaginationQuery(this.chatRoomsRepository.createQueryBuilder('room'), sinceId, untilId)
|
||||||
|
|
|
@ -417,5 +417,6 @@ export * as 'chat/rooms/members' from './endpoints/chat/rooms/members.js';
|
||||||
export * as 'chat/rooms/invitations/create' from './endpoints/chat/rooms/invitations/create.js';
|
export * as 'chat/rooms/invitations/create' from './endpoints/chat/rooms/invitations/create.js';
|
||||||
export * as 'chat/rooms/invitations/ignore' from './endpoints/chat/rooms/invitations/ignore.js';
|
export * as 'chat/rooms/invitations/ignore' from './endpoints/chat/rooms/invitations/ignore.js';
|
||||||
export * as 'chat/rooms/invitations/inbox' from './endpoints/chat/rooms/invitations/inbox.js';
|
export * as 'chat/rooms/invitations/inbox' from './endpoints/chat/rooms/invitations/inbox.js';
|
||||||
|
export * as 'chat/rooms/invitations/outbox' from './endpoints/chat/rooms/invitations/outbox.js';
|
||||||
export * as 'chat/history' from './endpoints/chat/history.js';
|
export * as 'chat/history' from './endpoints/chat/history.js';
|
||||||
export * as 'v2/admin/emoji/list' from './endpoints/v2/admin/emoji/list.js';
|
export * as 'v2/admin/emoji/list' from './endpoints/v2/admin/emoji/list.js';
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
|
import ms from 'ms';
|
||||||
|
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||||
|
import { DI } from '@/di-symbols.js';
|
||||||
|
import { ApiError } from '@/server/api/error.js';
|
||||||
|
import { ChatService } from '@/core/ChatService.js';
|
||||||
|
import { ChatEntityService } from '@/core/entities/ChatEntityService.js';
|
||||||
|
|
||||||
|
export const meta = {
|
||||||
|
tags: ['chat'],
|
||||||
|
|
||||||
|
requireCredential: true,
|
||||||
|
|
||||||
|
kind: 'read:chat',
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
ref: 'ChatRoomInvitation',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
errors: {
|
||||||
|
noSuchRoom: {
|
||||||
|
message: 'No such room.',
|
||||||
|
code: 'NO_SUCH_ROOM',
|
||||||
|
id: 'a3c6b309-9717-4316-ae94-a69b53437237',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export const paramDef = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
roomId: { type: 'string', format: 'misskey:id' },
|
||||||
|
limit: { type: 'integer', minimum: 1, maximum: 100, default: 30 },
|
||||||
|
sinceId: { type: 'string', format: 'misskey:id' },
|
||||||
|
untilId: { type: 'string', format: 'misskey:id' },
|
||||||
|
},
|
||||||
|
required: ['roomId'],
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
|
||||||
|
constructor(
|
||||||
|
private chatService: ChatService,
|
||||||
|
private chatEntityService: ChatEntityService,
|
||||||
|
) {
|
||||||
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
const room = await this.chatService.findMyRoomById(me.id, ps.roomId);
|
||||||
|
if (room == null) {
|
||||||
|
throw new ApiError(meta.errors.noSuchRoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
const invitations = await this.chatService.getSentRoomInvitationsWithPagination(ps.roomId, ps.limit, ps.sinceId, ps.untilId);
|
||||||
|
return this.chatEntityService.packRoomInvitations(invitations, me);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,6 +18,18 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<MkUserCardMini :user="membership.user"/>
|
<MkUserCardMini :user="membership.user"/>
|
||||||
</MkA>
|
</MkA>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<template v-if="isOwner">
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<div>{{ i18n.ts._chat.sentInvitations }}</div>
|
||||||
|
|
||||||
|
<div v-for="invitation in invitations" :key="invitation.id" :class="$style.invitation">
|
||||||
|
<MkA :class="$style.invitationBody" :to="`${userPage(invitation.user)}`">
|
||||||
|
<MkUserCardMini :user="invitation.user"/>
|
||||||
|
</MkA>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -47,12 +59,20 @@ const isOwner = computed(() => {
|
||||||
});
|
});
|
||||||
|
|
||||||
const memberships = ref<Misskey.entities.ChatRoomMembership[]>([]);
|
const memberships = ref<Misskey.entities.ChatRoomMembership[]>([]);
|
||||||
|
const invitations = ref<Misskey.entities.ChatRoomInvitation[]>([]);
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
memberships.value = await misskeyApi('chat/rooms/members', {
|
memberships.value = await misskeyApi('chat/rooms/members', {
|
||||||
roomId: props.room.id,
|
roomId: props.room.id,
|
||||||
limit: 50,
|
limit: 50,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (isOwner.value) {
|
||||||
|
invitations.value = await misskeyApi('chat/rooms/invitations/outbox', {
|
||||||
|
roomId: props.room.id,
|
||||||
|
limit: 50,
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -65,9 +85,15 @@ onMounted(async () => {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
&:hover {
|
.invitation {
|
||||||
text-decoration: none;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.invitationBody {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
margin-right: 8px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1046,6 +1046,12 @@ type ChatRoomsInvitationsInboxRequest = operations['chat___rooms___invitations__
|
||||||
// @public (undocumented)
|
// @public (undocumented)
|
||||||
type ChatRoomsInvitationsInboxResponse = operations['chat___rooms___invitations___inbox']['responses']['200']['content']['application/json'];
|
type ChatRoomsInvitationsInboxResponse = operations['chat___rooms___invitations___inbox']['responses']['200']['content']['application/json'];
|
||||||
|
|
||||||
|
// @public (undocumented)
|
||||||
|
type ChatRoomsInvitationsOutboxRequest = operations['chat___rooms___invitations___outbox']['requestBody']['content']['application/json'];
|
||||||
|
|
||||||
|
// @public (undocumented)
|
||||||
|
type ChatRoomsInvitationsOutboxResponse = operations['chat___rooms___invitations___outbox']['responses']['200']['content']['application/json'];
|
||||||
|
|
||||||
// @public (undocumented)
|
// @public (undocumented)
|
||||||
type ChatRoomsJoiningRequest = operations['chat___rooms___joining']['requestBody']['content']['application/json'];
|
type ChatRoomsJoiningRequest = operations['chat___rooms___joining']['requestBody']['content']['application/json'];
|
||||||
|
|
||||||
|
@ -1619,6 +1625,8 @@ declare namespace entities {
|
||||||
ChatRoomsInvitationsIgnoreResponse,
|
ChatRoomsInvitationsIgnoreResponse,
|
||||||
ChatRoomsInvitationsInboxRequest,
|
ChatRoomsInvitationsInboxRequest,
|
||||||
ChatRoomsInvitationsInboxResponse,
|
ChatRoomsInvitationsInboxResponse,
|
||||||
|
ChatRoomsInvitationsOutboxRequest,
|
||||||
|
ChatRoomsInvitationsOutboxResponse,
|
||||||
ChatRoomsJoinRequest,
|
ChatRoomsJoinRequest,
|
||||||
ChatRoomsJoinResponse,
|
ChatRoomsJoinResponse,
|
||||||
ChatRoomsJoiningRequest,
|
ChatRoomsJoiningRequest,
|
||||||
|
|
|
@ -1688,6 +1688,17 @@ declare module '../api.js' {
|
||||||
credential?: string | null,
|
credential?: string | null,
|
||||||
): Promise<SwitchCaseResponseType<E, P>>;
|
): Promise<SwitchCaseResponseType<E, P>>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No description provided.
|
||||||
|
*
|
||||||
|
* **Credential required**: *Yes* / **Permission**: *read:chat*
|
||||||
|
*/
|
||||||
|
request<E extends 'chat/rooms/invitations/outbox', P extends Endpoints[E]['req']>(
|
||||||
|
endpoint: E,
|
||||||
|
params: P,
|
||||||
|
credential?: string | null,
|
||||||
|
): Promise<SwitchCaseResponseType<E, P>>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* No description provided.
|
* No description provided.
|
||||||
*
|
*
|
||||||
|
|
|
@ -235,6 +235,8 @@ import type {
|
||||||
ChatRoomsInvitationsIgnoreResponse,
|
ChatRoomsInvitationsIgnoreResponse,
|
||||||
ChatRoomsInvitationsInboxRequest,
|
ChatRoomsInvitationsInboxRequest,
|
||||||
ChatRoomsInvitationsInboxResponse,
|
ChatRoomsInvitationsInboxResponse,
|
||||||
|
ChatRoomsInvitationsOutboxRequest,
|
||||||
|
ChatRoomsInvitationsOutboxResponse,
|
||||||
ChatRoomsJoinRequest,
|
ChatRoomsJoinRequest,
|
||||||
ChatRoomsJoinResponse,
|
ChatRoomsJoinResponse,
|
||||||
ChatRoomsJoiningRequest,
|
ChatRoomsJoiningRequest,
|
||||||
|
@ -784,6 +786,7 @@ export type Endpoints = {
|
||||||
'chat/rooms/invitations/create': { req: ChatRoomsInvitationsCreateRequest; res: ChatRoomsInvitationsCreateResponse };
|
'chat/rooms/invitations/create': { req: ChatRoomsInvitationsCreateRequest; res: ChatRoomsInvitationsCreateResponse };
|
||||||
'chat/rooms/invitations/ignore': { req: ChatRoomsInvitationsIgnoreRequest; res: ChatRoomsInvitationsIgnoreResponse };
|
'chat/rooms/invitations/ignore': { req: ChatRoomsInvitationsIgnoreRequest; res: ChatRoomsInvitationsIgnoreResponse };
|
||||||
'chat/rooms/invitations/inbox': { req: ChatRoomsInvitationsInboxRequest; res: ChatRoomsInvitationsInboxResponse };
|
'chat/rooms/invitations/inbox': { req: ChatRoomsInvitationsInboxRequest; res: ChatRoomsInvitationsInboxResponse };
|
||||||
|
'chat/rooms/invitations/outbox': { req: ChatRoomsInvitationsOutboxRequest; res: ChatRoomsInvitationsOutboxResponse };
|
||||||
'chat/rooms/join': { req: ChatRoomsJoinRequest; res: ChatRoomsJoinResponse };
|
'chat/rooms/join': { req: ChatRoomsJoinRequest; res: ChatRoomsJoinResponse };
|
||||||
'chat/rooms/joining': { req: ChatRoomsJoiningRequest; res: ChatRoomsJoiningResponse };
|
'chat/rooms/joining': { req: ChatRoomsJoiningRequest; res: ChatRoomsJoiningResponse };
|
||||||
'chat/rooms/leave': { req: ChatRoomsLeaveRequest; res: ChatRoomsLeaveResponse };
|
'chat/rooms/leave': { req: ChatRoomsLeaveRequest; res: ChatRoomsLeaveResponse };
|
||||||
|
|
|
@ -238,6 +238,8 @@ export type ChatRoomsInvitationsIgnoreRequest = operations['chat___rooms___invit
|
||||||
export type ChatRoomsInvitationsIgnoreResponse = operations['chat___rooms___invitations___ignore']['responses']['200']['content']['application/json'];
|
export type ChatRoomsInvitationsIgnoreResponse = operations['chat___rooms___invitations___ignore']['responses']['200']['content']['application/json'];
|
||||||
export type ChatRoomsInvitationsInboxRequest = operations['chat___rooms___invitations___inbox']['requestBody']['content']['application/json'];
|
export type ChatRoomsInvitationsInboxRequest = operations['chat___rooms___invitations___inbox']['requestBody']['content']['application/json'];
|
||||||
export type ChatRoomsInvitationsInboxResponse = operations['chat___rooms___invitations___inbox']['responses']['200']['content']['application/json'];
|
export type ChatRoomsInvitationsInboxResponse = operations['chat___rooms___invitations___inbox']['responses']['200']['content']['application/json'];
|
||||||
|
export type ChatRoomsInvitationsOutboxRequest = operations['chat___rooms___invitations___outbox']['requestBody']['content']['application/json'];
|
||||||
|
export type ChatRoomsInvitationsOutboxResponse = operations['chat___rooms___invitations___outbox']['responses']['200']['content']['application/json'];
|
||||||
export type ChatRoomsJoinRequest = operations['chat___rooms___join']['requestBody']['content']['application/json'];
|
export type ChatRoomsJoinRequest = operations['chat___rooms___join']['requestBody']['content']['application/json'];
|
||||||
export type ChatRoomsJoinResponse = operations['chat___rooms___join']['responses']['200']['content']['application/json'];
|
export type ChatRoomsJoinResponse = operations['chat___rooms___join']['responses']['200']['content']['application/json'];
|
||||||
export type ChatRoomsJoiningRequest = operations['chat___rooms___joining']['requestBody']['content']['application/json'];
|
export type ChatRoomsJoiningRequest = operations['chat___rooms___joining']['requestBody']['content']['application/json'];
|
||||||
|
|
|
@ -1484,6 +1484,15 @@ export type paths = {
|
||||||
*/
|
*/
|
||||||
post: operations['chat___rooms___invitations___inbox'];
|
post: operations['chat___rooms___invitations___inbox'];
|
||||||
};
|
};
|
||||||
|
'/chat/rooms/invitations/outbox': {
|
||||||
|
/**
|
||||||
|
* chat/rooms/invitations/outbox
|
||||||
|
* @description No description provided.
|
||||||
|
*
|
||||||
|
* **Credential required**: *Yes* / **Permission**: *read:chat*
|
||||||
|
*/
|
||||||
|
post: operations['chat___rooms___invitations___outbox'];
|
||||||
|
};
|
||||||
'/chat/rooms/join': {
|
'/chat/rooms/join': {
|
||||||
/**
|
/**
|
||||||
* chat/rooms/join
|
* chat/rooms/join
|
||||||
|
@ -14737,6 +14746,66 @@ export type operations = {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* chat/rooms/invitations/outbox
|
||||||
|
* @description No description provided.
|
||||||
|
*
|
||||||
|
* **Credential required**: *Yes* / **Permission**: *read:chat*
|
||||||
|
*/
|
||||||
|
chat___rooms___invitations___outbox: {
|
||||||
|
requestBody: {
|
||||||
|
content: {
|
||||||
|
'application/json': {
|
||||||
|
/** Format: misskey:id */
|
||||||
|
roomId: string;
|
||||||
|
/** @default 30 */
|
||||||
|
limit?: number;
|
||||||
|
/** Format: misskey:id */
|
||||||
|
sinceId?: string;
|
||||||
|
/** Format: misskey:id */
|
||||||
|
untilId?: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
responses: {
|
||||||
|
/** @description OK (with results) */
|
||||||
|
200: {
|
||||||
|
content: {
|
||||||
|
'application/json': components['schemas']['ChatRoomInvitation'][];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/** @description Client error */
|
||||||
|
400: {
|
||||||
|
content: {
|
||||||
|
'application/json': components['schemas']['Error'];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/** @description Authentication error */
|
||||||
|
401: {
|
||||||
|
content: {
|
||||||
|
'application/json': components['schemas']['Error'];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/** @description Forbidden error */
|
||||||
|
403: {
|
||||||
|
content: {
|
||||||
|
'application/json': components['schemas']['Error'];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/** @description I'm Ai */
|
||||||
|
418: {
|
||||||
|
content: {
|
||||||
|
'application/json': components['schemas']['Error'];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/** @description Internal server error */
|
||||||
|
500: {
|
||||||
|
content: {
|
||||||
|
'application/json': components['schemas']['Error'];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
/**
|
/**
|
||||||
* chat/rooms/join
|
* chat/rooms/join
|
||||||
* @description No description provided.
|
* @description No description provided.
|
||||||
|
|
Loading…
Reference in New Issue