feat(services): add GET /guilds/[guildId]/members

This commit is contained in:
Divlo 2021-12-29 12:43:04 +00:00
parent 7bc593093c
commit 712a92b25f
No known key found for this signature in database
GPG Key ID: 8F9478F220CE65E9
3 changed files with 158 additions and 0 deletions

View File

@ -0,0 +1,53 @@
import { application } from '../../../../../application.js'
import { authenticateUserTest } from '../../../../../__test__/utils/authenticateUserTest.js'
import { prismaMock } from '../../../../../__test__/setup.js'
import { memberExample } from '../../../../../models/Member.js'
import { userExample } from '../../../../../models/User.js'
describe('GET /guilds/[guildId]/members', () => {
it('succeeds', async () => {
prismaMock.member.findFirst.mockResolvedValue(memberExample)
prismaMock.member.findMany.mockResolvedValue([
{ ...memberExample, user: userExample }
] as any)
const { accessToken } = await authenticateUserTest()
const response = await application.inject({
method: 'GET',
url: `/guilds/${memberExample.guildId}/members`,
headers: {
authorization: `Bearer ${accessToken}`
}
})
const responseJson = response.json()
expect(response.statusCode).toEqual(200)
expect(responseJson.length).toEqual(1)
expect(responseJson[0].id).toEqual(memberExample.id)
expect(responseJson[0].isOwner).toEqual(memberExample.isOwner)
expect(responseJson[0].user.id).toEqual(userExample.id)
expect(responseJson[0].user.name).toEqual(userExample.name)
expect(responseJson[0].user.email).toEqual(null)
})
it('fails with not found member', async () => {
prismaMock.member.findFirst.mockResolvedValue(null)
const { accessToken } = await authenticateUserTest()
const response = await application.inject({
method: 'GET',
url: '/guilds/1/members',
headers: {
authorization: `Bearer ${accessToken}`
}
})
const responseJson = response.json()
expect(response.statusCode).toEqual(404)
expect(responseJson.message).toEqual('Member not found')
})
it('fails with unauthenticated user', async () => {
const response = await application.inject({
method: 'GET',
url: '/guilds/1/members'
})
expect(response.statusCode).toEqual(401)
})
})

View File

@ -0,0 +1,103 @@
import { Static, Type } from '@sinclair/typebox'
import { FastifyPluginAsync, FastifySchema } from 'fastify'
import prisma from '../../../../tools/database/prisma.js'
import { fastifyErrors } from '../../../../models/utils.js'
import authenticateUser from '../../../../tools/plugins/authenticateUser.js'
import { guildSchema } from '../../../../models/Guild.js'
import {
getPaginationOptions,
queryPaginationObjectSchema
} from '../../../../tools/database/pagination.js'
import { memberSchema } from '../../../../models/Member.js'
import { userPublicWithoutSettingsSchema } from '../../../../models/User.js'
type QuerySchemaType = Static<typeof queryPaginationObjectSchema>
const parametersSchema = Type.Object({
guildId: guildSchema.id
})
type Parameters = Static<typeof parametersSchema>
const getServiceSchema: FastifySchema = {
description: 'GET all the members of a guild with its id.',
tags: ['members'] as string[],
security: [
{
bearerAuth: []
}
] as Array<{ [key: string]: [] }>,
params: parametersSchema,
querystring: queryPaginationObjectSchema,
response: {
200: Type.Array(
Type.Object({
...memberSchema,
user: Type.Object(userPublicWithoutSettingsSchema)
})
),
400: fastifyErrors[400],
401: fastifyErrors[401],
403: fastifyErrors[403],
404: fastifyErrors[404],
500: fastifyErrors[500]
}
} as const
export const getMembersByGuildIdService: FastifyPluginAsync = async (
fastify
) => {
await fastify.register(authenticateUser)
fastify.route<{
Params: Parameters
Querystring: QuerySchemaType
}>({
method: 'GET',
url: '/guilds/:guildId/members',
schema: getServiceSchema,
handler: async (request, reply) => {
if (request.user == null) {
throw fastify.httpErrors.forbidden()
}
const { guildId } = request.params
const memberCheck = await prisma.member.findFirst({
where: { guildId, userId: request.user.current.id }
})
if (memberCheck == null) {
throw fastify.httpErrors.notFound('Member not found')
}
const membersRequest = await prisma.member.findMany({
...getPaginationOptions(request.query),
orderBy: { createdAt: 'asc' },
where: { guildId },
include: {
user: {
select: {
id: true,
name: true,
logo: true,
status: true,
biography: true,
website: true,
createdAt: true,
updatedAt: true
}
}
}
})
const members = membersRequest.map((member) => {
return {
...member,
user: {
...member.user,
email: null
}
}
})
reply.statusCode = 200
return members
}
})
}

View File

@ -6,6 +6,7 @@ import { getGuildsPublic } from './public/get.js'
import { getChannelsByGuildIdService } from './[guildId]/channels/get.js'
import { getGuildMemberByIdService } from './[guildId]/get.js'
import { putGuildIconById } from './[guildId]/icon/put.js'
import { getMembersByGuildIdService } from './[guildId]/members/get.js'
export const guildsService: FastifyPluginAsync = async (fastify) => {
await fastify.register(postGuilds)
@ -14,4 +15,5 @@ export const guildsService: FastifyPluginAsync = async (fastify) => {
await fastify.register(getGuildMemberByIdService)
await fastify.register(getChannelsByGuildIdService)
await fastify.register(getGuildsPublic)
await fastify.register(getMembersByGuildIdService)
}