UNPKG

@xrengine/server-core

Version:

Shared components for XREngine server

169 lines (153 loc) 5.45 kB
import { Paginated, Params } from '@feathersjs/feathers' import { SequelizeServiceOptions, Service } from 'feathers-sequelize' import { Op } from 'sequelize' import { AvatarInterface } from '@xrengine/common/src/interfaces/AvatarInterface' import { Application } from '../../../declarations' import { checkScope } from '../../hooks/verify-scope' import logger from '../../ServerLogger' import { UnauthorizedException } from '../../util/exceptions/exception' import { UserParams } from '../user/user.class' import { AvatarCreateArguments, AvatarPatchArguments } from './avatar-helper' export class Avatar extends Service<AvatarInterface> { app: Application docs: any constructor(options: Partial<SequelizeServiceOptions>, app: Application) { super(options) this.app = app } async get(id: string, params?: Params): Promise<AvatarInterface> { const avatar = await super.get(id, params) if (avatar.modelResourceId) try { avatar.modelResource = await this.app.service('static-resource').get(avatar.modelResourceId) } catch (err) { logger.error(err) } if (avatar.thumbnailResourceId) try { avatar.thumbnailResource = await this.app.service('static-resource').get(avatar.thumbnailResourceId) } catch (err) { logger.error(err) } return avatar } async find(params?: UserParams): Promise<AvatarInterface[] | Paginated<AvatarInterface>> { let isAdmin = false if (params && params.user && params.user.id) { isAdmin = await checkScope(params?.user, this.app, 'admin', 'admin') } if (params?.query?.search != null) { if (params.query.search.length > 0) params.query.name = { [Op.like]: `%${params.query.search}%` } } if (params?.query) delete params.query.search if (!isAdmin && params) { if (params.user && params.user.id) { params.query = { ...params?.query, [Op.or]: [ { isPublic: true }, { isPublic: false, userId: params.user.id } ] } } else { params.query = { ...params?.query, isPublic: true } } } const avatars = (await super.find(params)) as Paginated<AvatarInterface> await Promise.all( avatars.data.map(async (avatar) => { if (avatar.modelResourceId) try { avatar.modelResource = await this.app.service('static-resource').get(avatar.modelResourceId) } catch (err) {} if (avatar.thumbnailResourceId) try { avatar.thumbnailResource = await this.app.service('static-resource').get(avatar.thumbnailResourceId) } catch (err) {} return avatar }) ) return avatars } async create(data: AvatarCreateArguments, params?: UserParams): Promise<AvatarInterface> { let avatar = (await super.create({ name: data.name, isPublic: data.isPublic ?? true, userId: params?.user!.id, modelResourceId: data.modelResourceId, thumbnailResourceId: data.thumbnailResourceId, project: data.project })) as AvatarInterface avatar = await this.patch(avatar.id, { identifierName: avatar.name + '_' + avatar.id }) return avatar } async patch(id: string, data: AvatarPatchArguments, params?: UserParams): Promise<AvatarInterface> { let avatar = (await super.get(id, params)) as AvatarInterface if (avatar.userId !== params?.user!.id && params && params.user && params.user.id) { const hasPermission = await checkScope(params?.user, this.app, 'admin', 'admin') if (!hasPermission) { throw new UnauthorizedException(`Unauthorized to perform this action.`) } } avatar = (await super.patch(id, data, params)) as AvatarInterface avatar = (await super.patch(avatar.id, { identifierName: avatar.name + '_' + avatar.id })) as AvatarInterface if (avatar.modelResourceId) try { avatar.modelResource = await this.app.service('static-resource').get(avatar.modelResourceId) } catch (err) {} if (avatar.thumbnailResourceId) try { avatar.thumbnailResource = await this.app.service('static-resource').get(avatar.thumbnailResourceId) } catch (err) {} return avatar } async remove(id: string, params?: Params): Promise<AvatarInterface> { const avatar = await this.get(id, params) try { await this.app.service('static-resource').remove(avatar.modelResourceId) } catch (err) { logger.error(err) } try { await this.app.service('static-resource').remove(avatar.thumbnailResourceId) } catch (err) {} const avatars = (await super.Model.findAll({ where: { id: { [Op.ne]: id } } })) as AvatarInterface[] //Users that have the avatar that's being deleted will have theirs replaced with a random one, if there are other //avatars to use if (id && avatars.length > 0) { const randomReplacementAvatar = avatars[Math.floor(Math.random() * avatars.length)] await this.app.service('user').Model.update( { avatarId: randomReplacementAvatar.id }, { where: { avatarId: id } } ) } return super.remove(id, params) as Promise<AvatarInterface> } }