From 45cd16acc23e0f505c3e18a026ad976df9c2ad47 Mon Sep 17 00:00:00 2001 From: Moiz Adnan <67912355+MoizAdnan@users.noreply.github.com> Date: Wed, 20 Sep 2023 15:44:41 +0500 Subject: [PATCH] Changes for project-setting service to use schema, knex & feathers 5 (#8746) * Migrated project-setting service * Updated imports * Updated project find method * Removed project-setting service * Updated imports * Fixed project resolvers * Ensuring cloned params * Updated condition for allowed * Ensuring project-setting is object * Added user in project permission find params * Moved resolver converter * Updated project find return type * Updated fetchProjects * Added useGet * Added paginate false * Updated useGet * Removed paginate false --- .../src/admin/components/Setting/Project.tsx | 24 ++----- .../src/common/services/ProjectService.ts | 12 ++-- .../editor/src/functions/projectFunctions.tsx | 7 +- .../hooks/project-permission-authenticate.ts | 6 +- .../project-permission.class.ts | 18 ++++-- .../src/projects/project/project-helper.ts | 40 ++++++------ .../src/projects/project/project.class.ts | 29 +++++---- .../src/projects/project/project.resolvers.ts | 45 ++++++------- .../src/projects/project/project.test.ts | 13 ++-- .../src/projects/scene/scene.class.ts | 14 ++-- .../src/projects/scene/scene.service.ts | 12 ++-- .../src/projects/scene/scene.test.ts | 8 ++- .../project-setting/project-setting.class.ts | 61 ------------------ .../project-setting/project-setting.hooks.ts | 64 ------------------- .../project-setting.service.ts | 51 --------------- packages/server-core/src/setting/service.ts | 2 - scripts/update-cronjob-image.ts | 11 ++-- 17 files changed, 127 insertions(+), 290 deletions(-) delete mode 100644 packages/server-core/src/setting/project-setting/project-setting.class.ts delete mode 100644 packages/server-core/src/setting/project-setting/project-setting.hooks.ts delete mode 100644 packages/server-core/src/setting/project-setting/project-setting.service.ts diff --git a/packages/client-core/src/admin/components/Setting/Project.tsx b/packages/client-core/src/admin/components/Setting/Project.tsx index 5f4582cacb52..2736a98311d4 100644 --- a/packages/client-core/src/admin/components/Setting/Project.tsx +++ b/packages/client-core/src/admin/components/Setting/Project.tsx @@ -35,31 +35,22 @@ import Button from '@etherealengine/ui/src/primitives/mui/Button' import Grid from '@etherealengine/ui/src/primitives/mui/Grid' import Typography from '@etherealengine/ui/src/primitives/mui/Typography' -import { useFind, useMutation } from '@etherealengine/engine/src/common/functions/FeathersHooks' -import { projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' +import { useGet, useMutation } from '@etherealengine/engine/src/common/functions/FeathersHooks' +import { ProjectSettingType, projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' import { ProjectService, ProjectState } from '../../../common/services/ProjectService' import styles from '../../styles/settings.module.scss' -interface ProjectSetting { - key: string - value: any -} - const Project = () => { const { t } = useTranslation() const projectState = useHookstate(getMutableState(ProjectState)) const projects = projectState.projects - const settings = useHookstate | []>([]) + const settings = useHookstate | []>([]) const selectedProject = useHookstate(projects.get(NO_PROXY).length > 0 ? projects.get(NO_PROXY)[0].id : '') - let projectSetting = useFind('project-setting', { - query: { - $limit: 1, - id: selectedProject.value, - $select: ['settings'] - } - }).data + const project = useGet(projectPath, selectedProject.value, { query: { $select: ['settings'] } }).data + + let projectSetting = project?.settings || [] const patchProjectSetting = useMutation(projectPath).patch @@ -80,7 +71,6 @@ const Project = () => { return } - if (typeof projectSetting === 'string') projectSetting = JSON.parse(projectSetting) const tempSettings = JSON.parse(JSON.stringify(settings.value)) for (const [index, setting] of tempSettings.entries()) { const savedSetting = projectSetting.filter((item) => item.key === setting.key) @@ -96,7 +86,7 @@ const Project = () => { const projectConfig = projectName?.length > 0 && (await loadConfigForProject(projectName[0].name)) if (projectConfig && projectConfig?.settings) { - const tempSetting = [] as ProjectSetting[] + const tempSetting = [] as ProjectSettingType[] for (const setting of projectConfig.settings) { tempSetting.push({ key: setting.key, value: '' }) diff --git a/packages/client-core/src/common/services/ProjectService.ts b/packages/client-core/src/common/services/ProjectService.ts index 77d8fb35f316..f121a738827b 100644 --- a/packages/client-core/src/common/services/ProjectService.ts +++ b/packages/client-core/src/common/services/ProjectService.ts @@ -50,6 +50,7 @@ import { projectGithubPushPath } from '@etherealengine/engine/src/schemas/projec import { projectInvalidatePath } from '@etherealengine/engine/src/schemas/projects/project-invalidate.schema' import { projectPermissionPath } from '@etherealengine/engine/src/schemas/projects/project-permission.schema' import { projectPath, ProjectType } from '@etherealengine/engine/src/schemas/projects/project.schema' +import { Paginated } from '@feathersjs/feathers' import { API } from '../../API' import { NotificationService } from './NotificationService' @@ -106,10 +107,13 @@ export const ProjectServiceReceptor = (action) => { //Service export const ProjectService = { fetchProjects: async () => { - const projects = await API.instance.client.service(projectPath).find({ paginate: false, query: { allowed: true } }) - dispatchAction(ProjectAction.projectsFetched({ projectResult: projects.data })) - for (let error of projects.errors) { - NotificationService.dispatchNotify(error.message || JSON.stringify(error), { variant: 'error' }) + try { + const projects = (await API.instance.client + .service(projectPath) + .find({ query: { allowed: true } })) as Paginated + dispatchAction(ProjectAction.projectsFetched({ projectResult: projects.data })) + } catch (err) { + NotificationService.dispatchNotify(err.message || JSON.stringify(err), { variant: 'error' }) } }, diff --git a/packages/editor/src/functions/projectFunctions.tsx b/packages/editor/src/functions/projectFunctions.tsx index 771b3dc192d5..aaadbce63b85 100644 --- a/packages/editor/src/functions/projectFunctions.tsx +++ b/packages/editor/src/functions/projectFunctions.tsx @@ -29,6 +29,7 @@ import { SceneState } from '@etherealengine/engine/src/ecs/classes/Scene' import { dispatchAction, getMutableState } from '@etherealengine/hyperflux' import { ProjectType, projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' +import { Paginated } from '@feathersjs/feathers' import { EditorHistoryAction } from '../services/EditorHistory' import { EditorControlFunctions } from './EditorControlFunctions' @@ -38,10 +39,10 @@ import { EditorControlFunctions } from './EditorControlFunctions' */ export const getProjects = async (): Promise => { try { - const { data } = await API.instance.client.service(projectPath).find({ + const projects = (await API.instance.client.service(projectPath).find({ query: { allowed: true } - }) - return data + })) as Paginated + return projects.data } catch (error) { throw new Error(error) } diff --git a/packages/server-core/src/hooks/project-permission-authenticate.ts b/packages/server-core/src/hooks/project-permission-authenticate.ts index ede433c2c16f..a8d9ac2aedda 100755 --- a/packages/server-core/src/hooks/project-permission-authenticate.ts +++ b/packages/server-core/src/hooks/project-permission-authenticate.ts @@ -32,7 +32,7 @@ import { ProjectPermissionType, projectPermissionPath } from '@etherealengine/engine/src/schemas/projects/project-permission.schema' -import { projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' +import { ProjectType, projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' import { IdentityProviderType, identityProviderPath @@ -53,12 +53,12 @@ export default (writeAccess) => { let projectId, projectRepoPath const projectName = context.arguments[0]?.projectName || params.query?.projectName if (projectName) { - const project = await app.service(projectPath).find({ + const project = (await app.service(projectPath).find({ query: { name: projectName, $limit: 1 } - }) + })) as Paginated if (project.data.length > 0) { projectRepoPath = project.data[0].repositoryPath diff --git a/packages/server-core/src/projects/project-permission/project-permission.class.ts b/packages/server-core/src/projects/project-permission/project-permission.class.ts index 655c0c583cc1..86afc8623428 100644 --- a/packages/server-core/src/projects/project-permission/project-permission.class.ts +++ b/packages/server-core/src/projects/project-permission/project-permission.class.ts @@ -87,20 +87,26 @@ export class ProjectPermissionService< } async find(params?: ProjectPermissionParams) { - const loggedInUser = params!.user! - if (loggedInUser?.scopes?.find((scope) => scope.type === 'admin:admin')) return super._find(params) - if (params?.query?.projectId) { + if (!params) params = {} + if (!params.query) params.query = {} + + const loggedInUser = params.user + + if (!loggedInUser) throw new BadRequest('User missing from request') + + if (loggedInUser.scopes?.find((scope) => scope.type === 'admin:admin')) return super._find(params) + + if (params.query.projectId) { const permissionStatus = (await super._find({ query: { projectId: params.query.projectId, - userId: loggedInUser?.id, + userId: loggedInUser.id, $limit: 1 } })) as Paginated if (permissionStatus.data.length > 0) return super._find(params) } - if (!params) params = {} - if (!params.query) params.query = {} + params.query.userId = loggedInUser.id return super._find(params) } diff --git a/packages/server-core/src/projects/project/project-helper.ts b/packages/server-core/src/projects/project/project-helper.ts index 3ef0d30b0bf1..718b33fd1fd0 100644 --- a/packages/server-core/src/projects/project/project-helper.ts +++ b/packages/server-core/src/projects/project/project-helper.ts @@ -317,13 +317,15 @@ export const getEnginePackageJson = (): ProjectPackageJsonType => { //DO NOT REMOVE! //Even though an IDE may say that it's not used in the codebase, projects may use this. export const getProjectEnv = async (app: Application, projectName: string) => { - const projectSetting = await app.service('project-setting').find({ + const project = (await app.service(projectPath).find({ query: { $limit: 1, - name: projectName, - $select: ['settings'] + name: projectName } - }) + })) as Paginated + + let projectSetting = project.data[0].settings || [] + const settings: ProjectSettingType[] = [] Object.values(projectSetting).map(({ key, value }) => (settings[key] = value)) return settings @@ -493,13 +495,15 @@ export const checkProjectDestinationMatch = async ( Buffer.from(sourceBlobResponse.data.content, sourceBlobResponse.data.encoding).toString() ) if (!existingProject) { - const projectExists = await app.service(projectPath).find({ + const projectExists = (await app.service(projectPath).find({ query: { name: { $like: sourceContent.name - } + }, + $limit: 1 } - }) + })) as Paginated + if (projectExists.data.length > 0) return { sourceProjectMatchesDestination: false, @@ -1389,14 +1393,12 @@ export const updateProject = async ( if (data.sourceURL === 'default-project') { copyDefaultProject() await uploadLocalProjectToProvider(app, 'default-project') - return ( - await app.service(projectPath).find({ - query: { - name: 'default-project', - $limit: 1 - } - }) - ).data + return (await app.service(projectPath).find({ + query: { + name: 'default-project', + $limit: 1 + } + })) as Paginated } const urlParts = data.sourceURL.split('/') @@ -1415,11 +1417,11 @@ export const updateProject = async ( deleteFolderRecursive(projectDirectory) } - const projectResult = await app.service(projectPath)._find({ + const projectResult = (await app.service(projectPath)._find({ query: { name: projectName } - }) + })) as Paginated let project if (projectResult.data.length > 0) project = projectResult.data[0] @@ -1465,13 +1467,13 @@ export const updateProject = async ( const projectConfig = getProjectConfig(projectName) ?? {} // when we have successfully re-installed the project, remove the database entry if it already exists - const existingProjectResult = await app.service(projectPath)._find({ + const existingProjectResult = (await app.service(projectPath)._find({ query: { name: { $like: projectName } } - }) + })) as Paginated const existingProject = existingProjectResult.total > 0 ? existingProjectResult.data[0] : null let repositoryPath = data.destinationURL || data.sourceURL const publicSignedExec = PUBLIC_SIGNED_REGEX.exec(repositoryPath) diff --git a/packages/server-core/src/projects/project/project.class.ts b/packages/server-core/src/projects/project/project.class.ts index 8ce58f38a475..f18350f1ba10 100644 --- a/packages/server-core/src/projects/project/project.class.ts +++ b/packages/server-core/src/projects/project/project.class.ts @@ -315,9 +315,7 @@ export class ProjectService scope.type === 'admin:admin')) params.query.id = { $in: [...new Set(allowedProjects.map((project) => project.id))] } - delete params.query.allowed - - populateProjectPermissions = true } - params = { + let paramsWithoutExtras = { ...params, + // Explicitly cloned sort object because otherwise it was affecting default params object as well. + query: params?.query ? JSON.parse(JSON.stringify(params?.query)) : {} + } + + paramsWithoutExtras = { + ...paramsWithoutExtras, query: { - ...params?.query, + ...paramsWithoutExtras.query, $limit: params?.query?.$limit || 1000, $sort: params?.query?.$sort || { name: 1 } } } - const data = ((await super._find(params)) as Paginated).data + if (paramsWithoutExtras?.query?.allowed) delete paramsWithoutExtras.query.allowed + + const result = (await super._find(paramsWithoutExtras)) as Paginated | ProjectType[] + + const data: ProjectType[] = result['data'] ? result['data'] : result for (const item of data) { try { const packageJson = getProjectPackageJson(item.name) @@ -420,11 +425,7 @@ export class ProjectService } } -export const projectResolver = resolve({ - projectPermissions: virtual(async (project, context) => { - if (context.params?.query?.allowed) { - const projectPermissions = (await context.app.service(projectPermissionPath).find({ - query: { - projectId: project.id - }, - paginate: false - })) as ProjectPermissionType[] - - return projectPermissions - } - }), - - commitDate: virtual(async (project) => { - if (project.commitDate) return fromDateTimeSql(project.commitDate) - }), - createdAt: virtual(async (project) => fromDateTimeSql(project.createdAt)), - updatedAt: virtual(async (project) => fromDateTimeSql(project.updatedAt)) -}) +export const projectResolver = resolve( + { + projectPermissions: virtual(async (project, context) => { + if (context.params?.query?.allowed) { + const projectPermissions = (await context.app.service(projectPermissionPath).find({ + query: { + projectId: project.id + }, + user: context.params?.user, + paginate: false + })) as ProjectPermissionType[] + + return projectPermissions + } + }), -export const projectExternalResolver = resolve( - {}, + commitDate: virtual(async (project) => { + if (project.commitDate) return fromDateTimeSql(project.commitDate) + }), + createdAt: virtual(async (project) => fromDateTimeSql(project.createdAt)), + updatedAt: virtual(async (project) => fromDateTimeSql(project.updatedAt)) + }, { // Convert the raw data into a new structure before running property resolvers converter: async (rawData, context) => { @@ -91,6 +90,8 @@ export const projectExternalResolver = resolve( } ) +export const projectExternalResolver = resolve({}) + export const projectDataResolver = resolve( { id: async () => { diff --git a/packages/server-core/src/projects/project/project.test.ts b/packages/server-core/src/projects/project/project.test.ts index f313307ed1ce..2a489495c627 100644 --- a/packages/server-core/src/projects/project/project.test.ts +++ b/packages/server-core/src/projects/project/project.test.ts @@ -29,7 +29,8 @@ import path from 'path' import { destroyEngine } from '@etherealengine/engine/src/ecs/classes/Engine' -import { projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' +import { ProjectType, projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' +import { Paginated } from '@feathersjs/feathers' import { Application } from '../../../declarations' import { createFeathersKoaApp } from '../../createApp' import { deleteFolderRecursive } from '../../util/fsHelperFunctions' @@ -79,8 +80,8 @@ describe('project.test', () => { ) let findParams = { ...params, query: { name: newProjectName } } - const { data } = await app.service(projectPath).find(findParams) - assert.strictEqual(data[0].name, newProjectName) + const project = (await app.service(projectPath).find(findParams)) as Paginated + assert.strictEqual(project.data[0].name, newProjectName) }) it('should not add new project with same name as existing project', function () { @@ -98,9 +99,9 @@ describe('project.test', () => { describe('remove', () => { it('should remove project', async function () { let findParams = { ...params, query: { name: newProjectName } } - const { data } = await app.service(projectPath).find(findParams) - await app.service(projectPath).remove(data[0].id, params) - const project = await app.service(projectPath).find(findParams) + const projectData = (await app.service(projectPath).find(findParams)) as Paginated + await app.service(projectPath).remove(projectData.data[0].id, params) + const project = (await app.service(projectPath).find(findParams)) as Paginated assert.strictEqual(project.data.length, 0) }) }) diff --git a/packages/server-core/src/projects/scene/scene.class.ts b/packages/server-core/src/projects/scene/scene.class.ts index e3fb0bf97c20..10c646799909 100644 --- a/packages/server-core/src/projects/scene/scene.class.ts +++ b/packages/server-core/src/projects/scene/scene.class.ts @@ -109,7 +109,7 @@ export class Scene implements ServiceMethods { async setup() {} async find(params?: Params): Promise<{ data: SceneData[] }> { - const projects = await this.app.service(projectPath).find(params) + const projects = (await this.app.service(projectPath).find(params)) as Paginated const scenes: SceneData[] = [] for (const project of projects.data) { @@ -260,8 +260,10 @@ export class Scene implements ServiceMethods { const storageProvider = getStorageProvider(storageProviderName) - const project = await this.app.service(projectPath).find({ ...params, query: { name: projectName } }) - if (!project.data) throw new Error(`No project named ${projectName} exists`) + const project = (await this.app + .service(projectPath) + .find({ ...params, query: { name: projectName }, paginate: false })) as ProjectType[] + if (project.length === 0) throw new Error(`No project named ${projectName} exists`) await downloadAssetsFromScene(this.app, projectName, sceneData) @@ -331,8 +333,10 @@ export class Scene implements ServiceMethods { const name = cleanString(sceneName) - const project = await this.app.service(projectPath).find({ ...params, query: { name: projectName } }) - if (!project.data) throw new Error(`No project named ${projectName} exists`) + const project = (await this.app + .service(projectPath) + .find({ ...params, query: { name: projectName }, paginate: false })) as ProjectType[] + if (project.length === 0) throw new Error(`No project named ${projectName} exists`) for (const ext of sceneAssetFiles) { const assetFilePath = path.resolve(appRootPath.path, `packages/projects/projects/${projectName}/${name}${ext}`) diff --git a/packages/server-core/src/projects/scene/scene.service.ts b/packages/server-core/src/projects/scene/scene.service.ts index dff9b24162f2..d5ad6007c9c4 100755 --- a/packages/server-core/src/projects/scene/scene.service.ts +++ b/packages/server-core/src/projects/scene/scene.service.ts @@ -34,7 +34,7 @@ import { InstanceAttendanceType, instanceAttendancePath } from '@etherealengine/engine/src/schemas/networking/instance-attendance.schema' -import { projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' +import { ProjectType, projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' import { Application } from '../../../declarations' import logger from '../../ServerLogger' import { ServerMode, ServerState } from '../../ServerState' @@ -100,8 +100,10 @@ export const getScenesForProject = (app: Application) => { const storageProvider = getStorageProvider(args.storageProviderName) const { projectName, metadataOnly, internal } = args try { - const project = await app.service(projectPath).find({ ...params, query: { name: projectName } }) - if (!project || !project.data) throw new Error(`No project named ${projectName} exists`) + const project = (await app + .service(projectPath) + .find({ ...params, query: { name: projectName }, paginate: false })) as ProjectType[] + if (project.length === 0) throw new Error(`No project named ${projectName} exists`) const newSceneJsonPath = `projects/${projectName}/` @@ -128,9 +130,9 @@ export const getScenesForProject = (app: Application) => { export const getAllScenes = (app: Application) => { return async function (params: SceneParams): Promise<{ data: SceneData[] }> { - const projects = await app.service(projectPath).find(params) + const projects = (await app.service(projectPath).find({ ...params, paginate: false })) as ProjectType[] const scenes = await Promise.all( - projects.data.map( + projects.map( (project) => new Promise(async (resolve) => { const projectScenes = ( diff --git a/packages/server-core/src/projects/scene/scene.test.ts b/packages/server-core/src/projects/scene/scene.test.ts index 38150dc7a069..c6f5d52314db 100644 --- a/packages/server-core/src/projects/scene/scene.test.ts +++ b/packages/server-core/src/projects/scene/scene.test.ts @@ -32,7 +32,7 @@ import { destroyEngine } from '@etherealengine/engine/src/ecs/classes/Engine' import defaultSceneSeed from '@etherealengine/projects/default-project/default.scene.json' import { parseStorageProviderURLs } from '@etherealengine/engine/src/common/functions/parseSceneJSON' -import { projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' +import { ProjectType, projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' import { Application } from '../../../declarations' import { createFeathersKoaApp } from '../../createApp' import { getStorageProvider } from '../../media/storageprovider/storageprovider' @@ -122,8 +122,10 @@ describe('scene.test', () => { }) after(async () => { - const { data } = await app.service(projectPath).find({ ...params, query: { name: newProjectName } }) - await app.service(projectPath).remove(data[0].id, params) + const project = (await app + .service(projectPath) + .find({ ...params, query: { name: newProjectName }, paginate: false })) as ProjectType[] + await app.service(projectPath).remove(project[0].id, params) }) describe('get', () => { diff --git a/packages/server-core/src/setting/project-setting/project-setting.class.ts b/packages/server-core/src/setting/project-setting/project-setting.class.ts deleted file mode 100644 index 8b1f0170f3e0..000000000000 --- a/packages/server-core/src/setting/project-setting/project-setting.class.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* -CPAL-1.0 License - -The contents of this file are subject to the Common Public Attribution License -Version 1.0. (the "License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at -https://github.com/EtherealEngine/etherealengine/blob/dev/LICENSE. -The License is based on the Mozilla Public License Version 1.1, but Sections 14 -and 15 have been added to cover use of software over a computer network and -provide for limited attribution for the Original Developer. In addition, -Exhibit A has been modified to be consistent with Exhibit B. - -Software distributed under the License is distributed on an "AS IS" basis, -WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the -specific language governing rights and limitations under the License. - -The Original Code is Ethereal Engine. - -The Original Developer is the Initial Developer. The Initial Developer of the -Original Code is the Ethereal Engine team. - -All portions of the code written by the Ethereal Engine team are Copyright © 2021-2023 -Ethereal Engine. All Rights Reserved. -*/ - -import { Params, ServiceMethods } from '@feathersjs/feathers' - -import { projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' -import { Application } from '../../../declarations' - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -interface Data {} -// eslint-disable-next-line @typescript-eslint/no-empty-interface -interface ServiceOptions {} - -export class ProjectSetting implements ServiceMethods { - app: Application - options: ServiceOptions - - constructor(options: ServiceOptions = {}, app: Application) { - this.options = options - this.app = app - } - - async find(params?: Params) { - const result = await this.app.service(projectPath).find(params) - return result?.data[0]?.settings ? result.data[0].settings : [] - } - - async patch(): Promise {} - - async setup(): Promise {} - - async get(): Promise {} - - async create(): Promise {} - - async remove(): Promise {} - - async update(): Promise {} -} diff --git a/packages/server-core/src/setting/project-setting/project-setting.hooks.ts b/packages/server-core/src/setting/project-setting/project-setting.hooks.ts deleted file mode 100644 index 6f4823669987..000000000000 --- a/packages/server-core/src/setting/project-setting/project-setting.hooks.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* -CPAL-1.0 License - -The contents of this file are subject to the Common Public Attribution License -Version 1.0. (the "License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at -https://github.com/EtherealEngine/etherealengine/blob/dev/LICENSE. -The License is based on the Mozilla Public License Version 1.1, but Sections 14 -and 15 have been added to cover use of software over a computer network and -provide for limited attribution for the Original Developer. In addition, -Exhibit A has been modified to be consistent with Exhibit B. - -Software distributed under the License is distributed on an "AS IS" basis, -WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the -specific language governing rights and limitations under the License. - -The Original Code is Ethereal Engine. - -The Original Developer is the Initial Developer. The Initial Developer of the -Original Code is the Ethereal Engine team. - -All portions of the code written by the Ethereal Engine team are Copyright © 2021-2023 -Ethereal Engine. All Rights Reserved. -*/ - -import { disallow, iff, isProvider } from 'feathers-hooks-common' - -import authenticate from '../../hooks/authenticate' -import verifyScope from '../../hooks/verify-scope' - -export default { - before: { - all: [], - find: [authenticate(), iff(isProvider('external'), verifyScope('editor', 'write') as any)], // TODO: project based scopes #5613 - get: [disallow()], - create: [disallow()], - update: [disallow()], - patch: [ - authenticate(), - iff(isProvider('external'), verifyScope('admin', 'admin') as any, verifyScope('editor', 'write') as any) - ], - remove: [disallow()] - }, - - after: { - all: [], - find: [], - get: [], - create: [], - update: [], - patch: [], - remove: [] - }, - - error: { - all: [], - find: [], - get: [], - create: [], - update: [], - patch: [], - remove: [] - } -} as any diff --git a/packages/server-core/src/setting/project-setting/project-setting.service.ts b/packages/server-core/src/setting/project-setting/project-setting.service.ts deleted file mode 100644 index ec82d556fb67..000000000000 --- a/packages/server-core/src/setting/project-setting/project-setting.service.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* -CPAL-1.0 License - -The contents of this file are subject to the Common Public Attribution License -Version 1.0. (the "License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at -https://github.com/EtherealEngine/etherealengine/blob/dev/LICENSE. -The License is based on the Mozilla Public License Version 1.1, but Sections 14 -and 15 have been added to cover use of software over a computer network and -provide for limited attribution for the Original Developer. In addition, -Exhibit A has been modified to be consistent with Exhibit B. - -Software distributed under the License is distributed on an "AS IS" basis, -WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the -specific language governing rights and limitations under the License. - -The Original Code is Ethereal Engine. - -The Original Developer is the Initial Developer. The Initial Developer of the -Original Code is the Ethereal Engine team. - -All portions of the code written by the Ethereal Engine team are Copyright © 2021-2023 -Ethereal Engine. All Rights Reserved. -*/ - -import { Application } from '../../../declarations' -import { updateAppConfig } from '../../updateAppConfig' -import { ProjectSetting } from './project-setting.class' -import hooks from './project-setting.hooks' - -declare module '@etherealengine/common/declarations' { - interface ServiceTypes { - 'project-setting': ProjectSetting - } -} - -export default (app: Application): void => { - const options = { - paginate: app.get('paginate'), - multi: true - } - - const event = new ProjectSetting(options, app) - app.use('project-setting', event) - const service = app.service('project-setting') - service.hooks(hooks) - - service.on('patched', () => { - updateAppConfig() - }) -} diff --git a/packages/server-core/src/setting/service.ts b/packages/server-core/src/setting/service.ts index f945921004f8..0879c9b9278f 100644 --- a/packages/server-core/src/setting/service.ts +++ b/packages/server-core/src/setting/service.ts @@ -31,7 +31,6 @@ import Coil from './coil-setting/coil-setting' import Email from './email-setting/email-setting' import Helm from './helm-setting/helm-setting' import InstanceServer from './instance-server-setting/instance-server-setting' -import ProjectSetting from './project-setting/project-setting.service' import RedisSetting from './redis-setting/redis-setting' import ServerSetting from './server-setting/server-setting' import TaskServer from './task-server-setting/task-server-setting' @@ -47,6 +46,5 @@ export default [ Coil, RedisSetting, TaskServer, - ProjectSetting, Helm ] diff --git a/scripts/update-cronjob-image.ts b/scripts/update-cronjob-image.ts index a94a99efb36a..b0dd6c10b7c6 100644 --- a/scripts/update-cronjob-image.ts +++ b/scripts/update-cronjob-image.ts @@ -27,7 +27,7 @@ import appRootPath from 'app-root-path' import cli from 'cli' import dotenv from 'dotenv-flow' -import { projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' +import { ProjectType, projectPath } from '@etherealengine/engine/src/schemas/projects/project.schema' import { getState } from '@etherealengine/hyperflux' import { ServerMode, ServerState } from '@etherealengine/server-core/src/ServerState' import { createFeathersKoaApp } from '@etherealengine/server-core/src/createApp' @@ -63,7 +63,7 @@ cli.main(async () => { try { const app = createFeathersKoaApp(ServerMode.API) await app.setup() - const autoUpdateProjects = await app.service(projectPath).find({ + const autoUpdateProjects = (await app.service(projectPath).find({ query: { $or: [ { @@ -73,11 +73,12 @@ cli.main(async () => { updateType: 'tag' } ] - } - }) + }, + paginate: false + })) as ProjectType[] const k8BatchClient = getState(ServerState).k8BatchClient if (k8BatchClient) - for (const project of autoUpdateProjects.data) { + for (const project of autoUpdateProjects) { try { await k8BatchClient.patchNamespacedCronJob( `${process.env.RELEASE_NAME}-${project.name}-auto-update`,