UNPKG

@xrengine/server-core

Version:

Shared components for XREngine server

127 lines (113 loc) 5.32 kB
import { Id, NullableId, Paginated, Params } from '@feathersjs/feathers' import { SequelizeServiceOptions, Service } from 'feathers-sequelize' import path from 'path' import { ClientSetting as ClientSettingInterface } from '@xrengine/common/src/interfaces/ClientSetting' import { Application } from '../../../declarations' import config from '../../appconfig' import { getCacheDomain } from '../../media/storageprovider/getCacheDomain' import { getStorageProvider } from '../../media/storageprovider/storageprovider' import logger from '../../ServerLogger' import { getContentType } from '../../util/fileUtils' export type ClientSettingDataType = ClientSettingInterface export class ClientSetting<T = ClientSettingDataType> extends Service<T> { app: Application constructor(options: Partial<SequelizeServiceOptions>, app: Application) { super(options) this.app = app } async find(params?: Params): Promise<T[] | Paginated<T>> { const clientSettings = (await super.find(params)) as any const data = clientSettings.data.map((el) => { let appSocialLinks = JSON.parse(el.appSocialLinks) let themeSettings = JSON.parse(el.themeSettings) let themeModes = JSON.parse(el.themeModes) if (typeof appSocialLinks === 'string') appSocialLinks = JSON.parse(appSocialLinks) if (typeof themeSettings === 'string') themeSettings = JSON.parse(themeSettings) if (typeof themeModes === 'string') themeModes = JSON.parse(themeModes) return { ...el, appSocialLinks: appSocialLinks, themeSettings: themeSettings, themeModes: themeModes, homepageLinkButtonEnabled: el.homepageLinkButtonEnabled === 1 } }) return { total: clientSettings.total, limit: clientSettings.limit, skip: clientSettings.skip, data } } async get(id: Id, params?: Params): Promise<T> { const clientSettings = (await super.get(id, params)) as any let appSocialLinks = JSON.parse(clientSettings.appSocialLinks) let themeSettings = JSON.parse(clientSettings.themeSettings) let themeModes = JSON.parse(clientSettings.themeModes) if (typeof appSocialLinks === 'string') appSocialLinks = JSON.parse(appSocialLinks) if (typeof themeSettings === 'string') themeSettings = JSON.parse(themeSettings) if (typeof themeModes === 'string') themeModes = JSON.parse(themeModes) return { ...clientSettings, appSocialLinks: appSocialLinks, themeSettings: themeSettings, themeModes: themeModes, homepageLinkButtonEnabled: clientSettings.homepageLinkButtonEnabled === 1 } } async patch(id: NullableId, data: any, params?: Params): Promise<T | T[]> { const webmanifestPath = process.env.SERVE_CLIENT_FROM_STORAGE_PROVIDER === 'true' ? `client/site.webmanifest` : 'site.webmanifest' const storageProvider = getStorageProvider() try { const webmanifestResponse = await storageProvider.getObject(webmanifestPath) const webmanifest = JSON.parse(webmanifestResponse.Body.toString('utf-8')) data.startPath = data.startPath.replace(/https:\/\//, '/') const icon192px = /https:\/\//.test(data.icon192px) ? data.icon192px : path.join('client', data.icon192px) const icon512px = /https:\/\//.test(data.icon512px) ? data.icon512px : path.join('client', data.icon512px) webmanifest.name = data.title webmanifest.short_name = data.shortTitle webmanifest.start_url = config.client.url[config.client.url.length - 1] === '/' && data.startPath[0] === '/' ? config.client.url + data.startPath.slice(1) : config.client.url[config.client.url.length - 1] !== '/' && data.startPath[0] !== '/' ? config.client.url + '/' + data.startPath : config.client.url + data.startPath const cacheDomain = getCacheDomain(storageProvider) webmanifest.icons = [ { src: /https:\/\//.test(icon192px) ? icon192px : cacheDomain[cacheDomain.length - 1] === '/' && icon192px[0] === '/' ? `https://${cacheDomain}${icon192px.slice(1)}` : cacheDomain[cacheDomain.length - 1] !== '/' && icon192px[0] !== '/' ? `https://${cacheDomain}/${icon192px}` : `https://${cacheDomain}${icon192px}`, sizes: '192x192', type: getContentType(icon192px) }, { src: /https:\/\//.test(icon512px) ? icon512px : cacheDomain[cacheDomain.length - 1] === '/' && icon512px[0] === '/' ? `https://${cacheDomain}${icon512px.slice(1)}` : cacheDomain[cacheDomain.length - 1] !== '/' && icon512px[0] !== '/' ? `https://${cacheDomain}/${icon512px}` : `https://${cacheDomain}${icon512px}`, sizes: '512x512', type: getContentType(icon512px) } ] await storageProvider.createInvalidation([webmanifestPath]) await storageProvider.putObject({ Body: Buffer.from(JSON.stringify(webmanifest)), ContentType: 'application/manifest+json', Key: 'client/site.webmanifest' }) } catch (err) { logger.info('Error with manifest update', webmanifestPath) logger.error(err) } return super.patch(id, data, params) } }