Repository: ir-engine/ir-engine
Pull request #1301: Implement user ban checks in instance server and signaling logic
Author: login: mshafiqmk
Created: 2025-03-10T17:25:25Z | Merged: 2025-04-09T04:22:55Z

## Summary

## Subtasks Checklist

## Breaking Changes

## References
[IR-7903](https://tsu.atlassian.net/browse/IR-7903)
## QA Steps


[IR-7903]: https://tsu.atlassian.net/browse/IR-7903?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ


Diff:
diff --git a/packages/client-core/src/social/services/LocationService.ts b/packages/client-core/src/social/services/LocationService.ts
index 93782c1b9ab..9ba3de17616 100755
--- a/packages/client-core/src/social/services/LocationService.ts
+++ b/packages/client-core/src/social/services/LocationService.ts
@@ -24,12 +24,12 @@ Infinite Reality Engine. All Rights Reserved.
 */
 
 import { Paginated } from '@feathersjs/feathers'
-
 import {
-  locationBanPath,
+  AbuseReasonsType,
   LocationID,
   locationPath,
   LocationType,
+  moderationBanPath,
   UserID,
   userPath
 } from '@ir-engine/common/src/schema.type.module'
@@ -63,7 +63,6 @@ export const LocationSeed: LocationType = {
     updatedAt: ''
   },
   locationAuthorizedUsers: [],
-  locationBans: [],
   updatedBy: '' as UserID,
   createdAt: '',
   updatedAt: ''
@@ -75,7 +74,6 @@ export const LocationState = defineState({
     locationName: null! as string,
     currentLocation: {
       location: LocationSeed as LocationType,
-      bannedUsers: [] as string[],
       selfUserBanned: false,
       selfNotAuthorized: false
     },
@@ -90,7 +88,6 @@ export const LocationState = defineState({
     getMutableState(LocationState).merge({
       currentLocation: {
         location: LocationSeed as LocationType,
-        bannedUsers: [] as string[],
         selfUserBanned: false,
         selfNotAuthorized: false
       }
@@ -98,17 +95,11 @@ export const LocationState = defineState({
   },
 
   socialLocationRetrieved: (location: LocationType) => {
-    let bannedUsers = [] as string[]
-    location.locationBans.forEach((ban) => {
-      bannedUsers.push(ban.userId)
-    })
-    bannedUsers = [...new Set(bannedUsers)]
     getMutableState(LocationState).merge({
       currentLocation: {
         location: {
           ...location
         },
-        bannedUsers,
         selfUserBanned: false,
         selfNotAuthorized: false
       }
@@ -119,7 +110,6 @@ export const LocationState = defineState({
     getMutableState(LocationState).merge({
       currentLocation: {
         location: LocationSeed,
-        bannedUsers: [],
         selfUserBanned: false,
         selfNotAuthorized: false
       },
@@ -177,11 +167,13 @@ export const LocationService = {
         })
     }
   },
-  banUserFromLocation: async (userId: UserID, locationId: LocationID) => {
+  banUserFromLocation: async (userId: UserID, locationId: LocationID, banReason?: AbuseReasonsType) => {
     try {
-      await API.instance.service(locationBanPath).create({
-        userId: userId,
-        locationId: locationId
+      await API.instance.service(moderationBanPath).create({
+        banUserId: userId,
+        banned: true,
+        banReason: banReason ?? 'somethingElse',
+        reportedLocationId: locationId
       })
     } catch (err) {
       NotificationService.dispatchNotify(err.message, { variant: 'error' })
@@ -199,9 +191,9 @@ export const LocationService = {
           getMutableState(AuthState).merge({ user })
         }
       }
-      API.instance.service(locationBanPath).on('created', locationBanCreatedListener)
+      API.instance.service(moderationBanPath).on('created', locationBanCreatedListener)
       return () => {
-        API.instance.service(locationBanPath).off('created', locationBanCreatedListener)
+        API.instance.service(moderationBanPath).off('created', locationBanCreatedListener)
       }
     }, [])
   }
diff --git a/packages/common/src/schema.type.module.ts b/packages/common/src/schema.type.module.ts
index d0d83b1d8d4..0777e9edbc2 100644
--- a/packages/common/src/schema.type.module.ts
+++ b/packages/common/src/schema.type.module.ts
@@ -80,7 +80,6 @@ export type * from './schemas/social/invite-type.schema'
 export type * from './schemas/social/invite.schema'
 export type * from './schemas/social/location-admin.schema'
 export type * from './schemas/social/location-authorized-user.schema'
-export type * from './schemas/social/location-ban.schema'
 export type * from './schemas/social/location-setting.schema'
 export type * from './schemas/social/location-type.schema'
 export type * from './schemas/social/location.schema'
@@ -176,8 +175,6 @@ export const locationAdminPath = 'location-admin'
 
 export const channelPath = 'channel'
 
-export const locationBanPath = 'location-ban'
-
 export const locationSettingPath = 'location-setting'
 
 export const assetLibraryPath = 'asset-library'
diff --git a/packages/common/src/schemas/moderation/moderation-ban.schema.ts b/packages/common/src/schemas/moderation/moderation-ban.schema.ts
index 19fe8860195..be4b500b12b 100644
--- a/packages/common/src/schemas/moderation/moderation-ban.schema.ts
+++ b/packages/common/src/schemas/moderation/moderation-ban.schema.ts
@@ -97,6 +97,9 @@ export const moderationBanQuerySchema = Type.Intersect(
       banUserId: {
         $like: Type.String()
       },
+      reportedLocationId: TypedString<LocationID>({
+        format: 'uuid'
+      }),
       banReason: {
         $like: Type.String()
       }
diff --git a/packages/common/src/schemas/social/location-ban.schema.ts b/packages/common/src/schemas/social/location-ban.schema.ts
deleted file mode 100644
index dbee4912299..00000000000
--- a/packages/common/src/schemas/social/location-ban.schema.ts
+++ /dev/null
@@ -1,86 +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/ir-engine/ir-engine/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 Infinite Reality Engine.
-
-The Original Developer is the Initial Developer. The Initial Developer of the
-Original Code is the Infinite Reality Engine team.
-
-All portions of the code written by the Infinite Reality Engine team are Copyright © 2021-2023 
-Infinite Reality Engine. All Rights Reserved.
-*/
-
-// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html
-import type { Static } from '@feathersjs/typebox'
-import { getValidator, querySyntax, Type } from '@feathersjs/typebox'
-
-import { TypedString } from '../../types/TypeboxUtils'
-import { UserID } from '../user/user.schema'
-import { dataValidator, queryValidator } from '../validators'
-import { LocationID } from './location.schema'
-
-export const locationBanPath = 'location-ban'
-
-export const locationBanMethods = ['find', 'create', 'patch', 'remove', 'get'] as const
-
-// Main data model schema
-export const locationBanSchema = Type.Object(
-  {
-    id: Type.String({
-      format: 'uuid'
-    }),
-    userId: TypedString<UserID>({
-      format: 'uuid'
-    }),
-    locationId: TypedString<LocationID>({
-      format: 'uuid'
-    }),
-    createdAt: Type.String({ format: 'date-time' }),
-    updatedAt: Type.String({ format: 'date-time' })
-  },
-  { $id: 'LocationBan', additionalProperties: false }
-)
-export interface LocationBanType extends Static<typeof locationBanSchema> {}
-
-// Schema for creating new entries
-export const locationBanDataSchema = Type.Pick(locationBanSchema, ['userId', 'locationId'], {
-  $id: 'LocationBanData'
-})
-export interface LocationBanData extends Static<typeof locationBanDataSchema> {}
-
-// Schema for updating existing entries
-export const locationBanPatchSchema = Type.Partial(locationBanSchema, {
-  $id: 'LocationBanPatch'
-})
-export interface LocationBanPatch extends Static<typeof locationBanPatchSchema> {}
-
-// Schema for allowed query properties
-export const locationBanQueryProperties = Type.Pick(locationBanSchema, ['id', 'userId', 'locationId'])
-export const locationBanQuerySchema = Type.Intersect(
-  [
-    querySyntax(locationBanQueryProperties),
-    // Add additional query properties here
-    Type.Object({}, { additionalProperties: false })
-  ],
-  { additionalProperties: false }
-)
-
-export interface LocationBanQuery extends Static<typeof locationBanQuerySchema> {}
-
-export const locationBanValidator = /* @__PURE__ */ getValidator(locationBanSchema, dataValidator)
-export const locationBanDataValidator = /* @__PURE__ */ getValidator(locationBanDataSchema, dataValidator)
-export const locationBanPatchValidator = /* @__PURE__ */ getValidator(locationBanPatchSchema, dataValidator)
-export const locationBanQueryValidator = /* @__PURE__ */ getValidator(locationBanQuerySchema, queryValidator)
diff --git a/packages/common/src/schemas/social/location.schema.ts b/packages/common/src/schemas/social/location.schema.ts
index 49ddfe77379..9bf75e95db2 100644
--- a/packages/common/src/schemas/social/location.schema.ts
+++ b/packages/common/src/schemas/social/location.schema.ts
@@ -34,7 +34,6 @@ import { TypedString } from '../../types/TypeboxUtils'
 import { dataValidator, queryValidator } from '../validators'
 import { locationAdminDataSchema, locationAdminSchema } from './location-admin.schema'
 import { locationAuthorizedUserSchema } from './location-authorized-user.schema'
-import { locationBanSchema } from './location-ban.schema'
 import { locationSettingDataSchema, locationSettingPatchSchema, locationSettingSchema } from './location-setting.schema'
 
 export const locationPath = 'location'
@@ -66,7 +65,6 @@ export const locationSchema = Type.Object(
     locationSetting: Type.Ref(locationSettingSchema),
     locationAdmin: Type.Optional(Type.Ref(locationAdminSchema)),
     locationAuthorizedUsers: Type.Array(Type.Ref(locationAuthorizedUserSchema)),
-    locationBans: Type.Array(Type.Ref(locationBanSchema)),
     updatedBy: TypedString<UserID>({
       format: 'uuid'
     }),
@@ -78,10 +76,7 @@ export const locationSchema = Type.Object(
 export interface LocationType extends Static<typeof locationSchema> {}
 
 export interface LocationDatabaseType
-  extends Omit<
-    LocationType,
-    'locationSetting' | 'locationAuthorizedUsers' | 'locationBans' | 'locationAdmin' | 'sceneURL' | 'url'
-  > {}
+  extends Omit<LocationType, 'locationSetting' | 'locationAuthorizedUsers' | 'locationAdmin' | 'sceneURL' | 'url'> {}
 
 // Schema for creating new entries
 export const locationDataProperties = Type.Pick(locationSchema, [
diff --git a/packages/instanceserver/src/NetworkFunctions.ts b/packages/instanceserver/src/NetworkFunctions.ts
index 0f460c12176..d1facc8c9f6 100755
--- a/packages/instanceserver/src/NetworkFunctions.ts
+++ b/packages/instanceserver/src/NetworkFunctions.ts
@@ -38,6 +38,7 @@ import {
   inviteCodeLookupPath,
   locationPath,
   messagePath,
+  moderationBanPath,
   UserID,
   userKickPath,
   userPath,
@@ -152,6 +153,17 @@ export const authorizeUserToJoinServer = async (app: Application, instance: Inst
   const userId = user.id
   // disallow users from joining media servers if they are not age verified
   if (instance.channelId && !user.ageVerified) return false
+  const thisUserBanned = (await app.service(moderationBanPath).find({
+    query: {
+      banUserId: userId,
+      banned: true,
+      $limit: 0
+    }
+  })) as any
+  if (thisUserBanned.total > 0) {
+    logger.info(`User "${userId}" is banned.`)
+    return false
+  }
 
   const authorizedUsers = (await app.service(instanceAuthorizedUserPath).find({
     query: {
diff --git a/packages/server-core/src/social/location-ban/location-ban.docs.ts b/packages/server-core/src/moderation/moderation/migrations/20250403102127_drop-location-ban.ts
old mode 100755
new mode 100644
similarity index 69%
rename from packages/server-core/src/social/location-ban/location-ban.docs.ts
rename to packages/server-core/src/moderation/moderation/migrations/20250403102127_drop-location-ban.ts
index 4e6d9b03923..28c6b8096d2
--- a/packages/server-core/src/social/location-ban/location-ban.docs.ts
+++ b/packages/server-core/src/moderation/moderation/migrations/20250403102127_drop-location-ban.ts
@@ -23,24 +23,16 @@ All portions of the code written by the Infinite Reality Engine team are Copyrig
 Infinite Reality Engine. All Rights Reserved.
 */
 
-import { createSwaggerServiceOptions } from 'feathers-swagger'
-
-import {
-  locationBanDataSchema,
-  locationBanPatchSchema,
-  locationBanQuerySchema,
-  locationBanSchema
-} from '@ir-engine/common/src/schemas/social/location-ban.schema'
-
-export default createSwaggerServiceOptions({
-  schemas: {
-    locationBanDataSchema,
-    locationBanPatchSchema,
-    locationBanQuerySchema,
-    locationBanSchema
-  },
-  docs: {
-    description: 'Location ban service description',
-    securities: ['all']
+import type { Knex } from 'knex'
+
+/**
+ * @param { import("knex").Knex } knex
+ * @returns { Promise<void> }
+ */
+export async function up(knex: Knex): Promise<void> {
+  const tableExists = await knex.schema.hasTable('location-ban')
+  if (tableExists) {
+    await knex.schema.dropTable('location-ban')
   }
-})
+}
+export async function down(knex: Knex): Promise<void> {}
diff --git a/packages/server-core/src/networking/instance-provision/instance-provision.hooks.ts b/packages/server-core/src/networking/instance-provision/instance-provision.hooks.ts
index 59c18bb6a8d..6c86ab729c5 100755
--- a/packages/server-core/src/networking/instance-provision/instance-provision.hooks.ts
+++ b/packages/server-core/src/networking/instance-provision/instance-provision.hooks.ts
@@ -23,12 +23,33 @@ All portions of the code written by the Infinite Reality Engine team are Copyrig
 Infinite Reality Engine. All Rights Reserved.
 */
 
+import { Forbidden } from '@feathersjs/errors'
+import { moderationBanPath } from '@ir-engine/common/src/schema.type.module'
 import { disallow } from 'feathers-hooks-common'
 
+const isThisUserBanned = async (context: any) => {
+  const { app, params } = context
+  const { user } = params
+
+  if (user) {
+    const thisUserBanned = await app.service(moderationBanPath).find({
+      query: {
+        banUserId: user.id,
+        banned: true,
+        $limit: 0
+      }
+    })
+    if (thisUserBanned.total > 0) {
+      return new Forbidden('You are banned')
+    }
+  }
+  return context
+}
+
 export default {
   before: {
     all: [],
-    find: [],
+    find: [isThisUserBanned],
     get: [disallow() /*iff(isProvider('external'), verifyScope('admin', 'admin') as any)*/],
     create: [disallow() /*iff(isProvider('external'), verifyScope('admin', 'admin') as any)*/],
     update: [disallow() /*iff(isProvider('external'), verifyScope('admin', 'admin') as any)*/],
diff --git a/packages/server-core/src/networking/instance-signaling/instance-signaling.ts b/packages/server-core/src/networking/instance-signaling/instance-signaling.ts
index a3f220ce908..c536f129f57 100644
--- a/packages/server-core/src/networking/instance-signaling/instance-signaling.ts
+++ b/packages/server-core/src/networking/instance-signaling/instance-signaling.ts
@@ -23,7 +23,7 @@ All portions of the code written by the Infinite Reality Engine team are Copyrig
 Infinite Reality Engine. All Rights Reserved.
 */
 
-import { BadRequest } from '@feathersjs/errors'
+import { BadRequest, Forbidden } from '@feathersjs/errors'
 import { Params } from '@feathersjs/feathers'
 import {
   CREDENTIAL_OFFSET,
@@ -43,7 +43,8 @@ import {
   instanceAttendancePath,
   instancePath,
   instanceSignalingPath,
-  locationPath
+  locationPath,
+  moderationBanPath
 } from '@ir-engine/common/src/schema.type.module'
 import { getDateTimeSql } from '@ir-engine/common/src/utils/datetime-sql'
 import { unflattenArrayToObject } from '@ir-engine/common/src/utils/jsonHelperUtils'
@@ -81,7 +82,16 @@ const peerJoin = async (app: Application, data: InstanceSignalingDataType, param
 
   const user = params.user
   if (!user) throw new BadRequest('Must be logged in to join instance')
-
+  const thisUserBanned = await app.service(moderationBanPath).find({
+    query: {
+      banUserId: user.id,
+      banned: true,
+      $limit: 0
+    }
+  })
+  if (thisUserBanned.total > 0) {
+    throw new Forbidden('You are banned')
+  }
   if (!peerID) throw new BadRequest('PeerID required')
 
   if (!data?.instanceID) throw new BadRequest('InstanceID required')
@@ -187,6 +197,18 @@ export default (app: Application): void => {
       const instanceId = data.instanceID
       if (!peerID || !instanceId) throw new BadRequest('instanceID required')
 
+      const user = params!.user
+      const thisUserBanned = await app.service(moderationBanPath).find({
+        query: {
+          banUserId: user!.id,
+          banned: true,
+          $limit: 0
+        }
+      })
+      if (thisUserBanned.total > 0) {
+        throw new Forbidden('You are banned')
+      }
+
       const now = await getDateTimeSql()
       await app.service(instanceAttendancePath).patch(
         null,
diff --git a/packages/server-core/src/social/location-ban/location-ban.class.ts b/packages/server-core/src/social/location-ban/location-ban.class.ts
deleted file mode 100755
index f6ef295a3d1..00000000000
--- a/packages/server-core/src/social/location-ban/location-ban.class.ts
+++ /dev/null
@@ -1,41 +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/ir-engine/ir-engine/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 Infinite Reality Engine.
-
-The Original Developer is the Initial Developer. The Initial Developer of the
-Original Code is the Infinite Reality Engine team.
-
-All portions of the code written by the Infinite Reality Engine team are Copyright © 2021-2023 
-Infinite Reality Engine. All Rights Reserved.
-*/
-
-import type { Params } from '@feathersjs/feathers'
-import { KnexAdapterParams, KnexService } from '@feathersjs/knex'
-
-import {
-  LocationBanData,
-  LocationBanPatch,
-  LocationBanQuery,
-  LocationBanType
-} from '@ir-engine/common/src/schemas/social/location-ban.schema'
-
-export interface LocationBanParams extends KnexAdapterParams<LocationBanQuery> {}
-
-export class LocationBanService<
-  T = LocationBanType,
-  ServiceParams extends Params = LocationBanParams
-> extends KnexService<LocationBanType, LocationBanData, LocationBanParams, LocationBanPatch> {}
diff --git a/packages/server-core/src/social/location-ban/location-ban.hooks.ts b/packages/server-core/src/social/location-ban/location-ban.hooks.ts
deleted file mode 100755
index 5e77c4a6d01..00000000000
--- a/packages/server-core/src/social/location-ban/location-ban.hooks.ts
+++ /dev/null
@@ -1,86 +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/ir-engine/ir-engine/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 Infinite Reality Engine.
-
-The Original Developer is the Initial Developer. The Initial Developer of the
-Original Code is the Infinite Reality Engine team.
-
-All portions of the code written by the Infinite Reality Engine team are Copyright © 2021-2023 
-Infinite Reality Engine. All Rights Reserved.
-*/
-
-import { hooks as schemaHooks } from '@feathersjs/schema'
-import { disallow, iff, isProvider } from 'feathers-hooks-common'
-
-import {
-  locationBanDataValidator,
-  locationBanPatchValidator,
-  locationBanQueryValidator
-} from '@ir-engine/common/src/schemas/social/location-ban.schema'
-
-import verifyLocationAdmin from '../../hooks/verify-location-admin'
-import {
-  locationBanDataResolver,
-  locationBanExternalResolver,
-  locationBanPatchResolver,
-  locationBanQueryResolver,
-  locationBanResolver
-} from './location-ban.resolvers'
-
-export default {
-  around: {
-    all: [schemaHooks.resolveExternal(locationBanExternalResolver), schemaHooks.resolveResult(locationBanResolver)]
-  },
-
-  before: {
-    all: [schemaHooks.validateQuery(locationBanQueryValidator), schemaHooks.resolveQuery(locationBanQueryResolver)],
-    find: [],
-    get: [],
-    create: [
-      iff(isProvider('external'), verifyLocationAdmin()),
-      schemaHooks.validateData(locationBanDataValidator),
-      schemaHooks.resolveData(locationBanDataResolver)
-    ],
-    update: [disallow()],
-    patch: [
-      disallow(),
-      schemaHooks.validateData(locationBanPatchValidator),
-      schemaHooks.resolveData(locationBanPatchResolver)
-    ],
-    remove: [iff(isProvider('external'), verifyLocationAdmin())]
-  },
-
-  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/social/location-ban/location-ban.resolvers.ts b/packages/server-core/src/social/location-ban/location-ban.resolvers.ts
deleted file mode 100644
index fbd9765ad5b..00000000000
--- a/packages/server-core/src/social/location-ban/location-ban.resolvers.ts
+++ /dev/null
@@ -1,53 +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/ir-engine/ir-engine/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 Infinite Reality Engine.
-
-The Original Developer is the Initial Developer. The Initial Developer of the
-Original Code is the Infinite Reality Engine team.
-
-All portions of the code written by the Infinite Reality Engine team are Copyright © 2021-2023 
-Infinite Reality Engine. All Rights Reserved.
-*/
-
-// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html
-import { resolve, virtual } from '@feathersjs/schema'
-import { v4 as uuidv4 } from 'uuid'
-
-import { LocationBanQuery, LocationBanType } from '@ir-engine/common/src/schemas/social/location-ban.schema'
-import { fromDateTimeSql, getDateTimeSql } from '@ir-engine/common/src/utils/datetime-sql'
-import type { HookContext } from '@ir-engine/server-core/declarations'
-
-export const locationBanResolver = resolve<LocationBanType, HookContext>({
-  createdAt: virtual(async (locationBan) => fromDateTimeSql(locationBan.createdAt)),
-  updatedAt: virtual(async (locationBan) => fromDateTimeSql(locationBan.updatedAt))
-})
-
-export const locationBanExternalResolver = resolve<LocationBanType, HookContext>({})
-
-export const locationBanDataResolver = resolve<LocationBanType, HookContext>({
-  id: async () => {
-    return uuidv4()
-  },
-  createdAt: getDateTimeSql,
-  updatedAt: getDateTimeSql
-})
-
-export const locationBanPatchResolver = resolve<LocationBanType, HookContext>({
-  updatedAt: getDateTimeSql
-})
-
-export const locationBanQueryResolver = resolve<LocationBanQuery, HookContext>({})
diff --git a/packages/server-core/src/social/location-ban/location-ban.ts b/packages/server-core/src/social/location-ban/location-ban.ts
deleted file mode 100755
index 374ee4665ab..00000000000
--- a/packages/server-core/src/social/location-ban/location-ban.ts
+++ /dev/null
@@ -1,70 +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/ir-engine/ir-engine/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 Infinite Reality Engine.
-
-The Original Developer is the Initial Developer. The Initial Developer of the
-Original Code is the Infinite Reality Engine team.
-
-All portions of the code written by the Infinite Reality Engine team are Copyright © 2021-2023 
-Infinite Reality Engine. All Rights Reserved.
-*/
-
-import {
-  locationBanMethods,
-  locationBanPath,
-  LocationBanType
-} from '@ir-engine/common/src/schemas/social/location-ban.schema'
-
-import { Application } from '../../../declarations'
-import logger from '../../ServerLogger'
-import { LocationBanService } from './location-ban.class'
-import locationBanDocs from './location-ban.docs'
-import hooks from './location-ban.hooks'
-
-declare module '@ir-engine/common/declarations' {
-  interface ServiceTypes {
-    [locationBanPath]: LocationBanService
-  }
-}
-
-export default (app: Application): void => {
-  const options = {
-    name: locationBanPath,
-    paginate: app.get('paginate'),
-    Model: app.get('knexClient'),
-    multi: true
-  }
-
-  app.use(locationBanPath, new LocationBanService(options), {
-    // A list of all methods this service exposes externally
-    methods: locationBanMethods,
-    // You can add additional custom events to be sent to clients here
-    events: [],
-    docs: locationBanDocs
-  })
-
-  const service = app.service(locationBanPath)
-  service.hooks(hooks)
-
-  service.publish('created', async (data: LocationBanType) => {
-    try {
-      return Promise.all([app.channel(`userIds/${data.userId}`).send({ locationBan: data })])
-    } catch (err) {
-      logger.error(err)
-    }
-  })
-}
diff --git a/packages/server-core/src/social/location-ban/migrations/20230727072648_location-ban.ts b/packages/server-core/src/social/location-ban/migrations/20230727072648_location-ban.ts
index 3be55073f1c..97a2c7b1966 100644
--- a/packages/server-core/src/social/location-ban/migrations/20230727072648_location-ban.ts
+++ b/packages/server-core/src/social/location-ban/migrations/20230727072648_location-ban.ts
@@ -25,12 +25,11 @@ Infinite Reality Engine. All Rights Reserved.
 
 import type { Knex } from 'knex'
 
-import { locationBanPath } from '@ir-engine/common/src/schemas/social/location-ban.schema'
-
 /**
  * @param { import("knex").Knex } knex
  * @returns { Promise<void> }
  */
+const locationBanPath = 'location-ban'
 export async function up(knex: Knex): Promise<void> {
   const oldTableName = 'location_ban'
 
diff --git a/packages/server-core/src/social/location/location.resolvers.ts b/packages/server-core/src/social/location/location.resolvers.ts
index 744fbdfe40c..28814a2b56b 100644
--- a/packages/server-core/src/social/location/location.resolvers.ts
+++ b/packages/server-core/src/social/location/location.resolvers.ts
@@ -34,7 +34,6 @@ import {
   LocationAuthorizedUserType,
   locationAuthorizedUserPath
 } from '@ir-engine/common/src/schemas/social/location-authorized-user.schema'
-import { LocationBanType, locationBanPath } from '@ir-engine/common/src/schemas/social/location-ban.schema'
 import { locationSettingPath } from '@ir-engine/common/src/schemas/social/location-setting.schema'
 import { LocationID, LocationQuery, LocationType } from '@ir-engine/common/src/schemas/social/location.schema'
 import { UserID } from '@ir-engine/common/src/schemas/user/user.schema'
@@ -64,14 +63,6 @@ export const locationResolver = resolve<LocationType, HookContext>({
       paginate: false
     })) as LocationAuthorizedUserType[]
   }),
-  locationBans: virtual(async (location, context) => {
-    return (await context.app.service(locationBanPath).find({
-      query: {
-        locationId: location.id as LocationID
-      },
-      paginate: false
-    })) as LocationBanType[]
-  }),
   sceneURL: virtual(async (location, context) => {
     return (await context.app.service(staticResourcePath).get(location.sceneId)).url
   }),
diff --git a/packages/server-core/src/social/services.ts b/packages/server-core/src/social/services.ts
index 77fea8debcd..4687417db60 100755
--- a/packages/server-core/src/social/services.ts
+++ b/packages/server-core/src/social/services.ts
@@ -30,7 +30,6 @@ import InviteType from './invite-type/invite-type'
 import Invite from './invite/invite'
 import LocationAdmin from './location-admin/location-admin'
 import LocationAuthorizedUser from './location-authorized-user/location-authorized-user'
-import LocationBan from './location-ban/location-ban'
 import LocationSetting from './location-setting/location-setting'
 import LocationType from './location-type/location-type'
 import Location from './location/location'
@@ -46,7 +45,6 @@ export default [
   Message,
   LocationType,
   LocationSetting,
-  LocationBan,
   LocationAdmin,
   LocationAuthorizedUser
 ]


Reviews:
user: login: HexaField
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-18T00:07:16Z
user: login: HexaField
body: we also want to remove the old location ban table and service
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-18T00:08:21Z
user: login: mshafiqmk
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-19T10:06:18Z
user: login: mshafiqmk
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-19T10:06:27Z
user: login: HexaField
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-04T01:17:12Z
user: login: HexaField
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T01:14:49Z
user: login: mshafiqmk
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T02:17:01Z
user: login: HexaField
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T22:37:22Z
user: login: HexaField
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-09T02:07:44Z

Review comments:
diff_hunk: @@ -23,12 +23,33 @@ All portions of the code written by the Infinite Reality Engine team are Copyrig
 Infinite Reality Engine. All Rights Reserved.
 */
 
+import { Forbidden } from '@feathersjs/errors'
+import { moderationBanPath } from '@ir-engine/common/src/schema.type.module'
 import { disallow } from 'feathers-hooks-common'
 
+const isThisUserBanned = async (context: any) => {
path: packages/server-core/src/networking/instance-provision/instance-provision.hooks.ts
user: login: HexaField
body: this will apply to all locations and channels, we only want the ban to apply for the requested location
created_at: 2025-03-18T00:06:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -152,6 +153,17 @@ export const authorizeUserToJoinServer = async (app: Application, instance: Inst
   const userId = user.id
   // disallow users from joining media servers if they are not age verified
   if (instance.channelId && !user.ageVerified) return false
+  const thisUserBanned = (await app.service(moderationBanPath).find({
path: packages/instanceserver/src/NetworkFunctions.ts
user: login: HexaField
body: same here, we must scope this to the specific channel or location
created_at: 2025-03-18T00:07:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -81,7 +82,16 @@ const peerJoin = async (app: Application, data: InstanceSignalingDataType, param
 
   const user = params.user
   if (!user) throw new BadRequest('Must be logged in to join instance')
-
+  const thisUserBanned = await app.service(moderationBanPath).find({
path: packages/server-core/src/networking/instance-signaling/instance-signaling.ts
user: login: HexaField
body: these must also only apply for the requesting location or channel
created_at: 2025-03-18T00:07:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -23,12 +23,33 @@ All portions of the code written by the Infinite Reality Engine team are Copyrig
 Infinite Reality Engine. All Rights Reserved.
 */
 
+import { Forbidden } from '@feathersjs/errors'
+import { moderationBanPath } from '@ir-engine/common/src/schema.type.module'
 import { disallow } from 'feathers-hooks-common'
 
+const isThisUserBanned = async (context: any) => {
path: packages/server-core/src/networking/instance-provision/instance-provision.hooks.ts
user: login: mshafiqmk
body: Based on what was decided, if a user is banned from one location, the ban will apply to all locations.

created_at: 2025-03-19T10:06:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -152,6 +153,17 @@ export const authorizeUserToJoinServer = async (app: Application, instance: Inst
   const userId = user.id
   // disallow users from joining media servers if they are not age verified
   if (instance.channelId && !user.ageVerified) return false
+  const thisUserBanned = (await app.service(moderationBanPath).find({
path: packages/instanceserver/src/NetworkFunctions.ts
user: login: mshafiqmk
body: Based on what was decided, if a user is banned from one location, the ban will apply to all locations.
created_at: 2025-03-19T10:06:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -152,6 +153,17 @@ export const authorizeUserToJoinServer = async (app: Application, instance: Inst
   const userId = user.id
   // disallow users from joining media servers if they are not age verified
   if (instance.channelId && !user.ageVerified) return false
+  const thisUserBanned = (await app.service(moderationBanPath).find({
path: packages/instanceserver/src/NetworkFunctions.ts
user: login: HexaField
body: all locations across all domains? that doesn't sound right
created_at: 2025-04-04T01:17:12Z
author_association: CONTRIBUTOR
diff_hunk: @@ -99,9 +98,6 @@ export const LocationState = defineState({
 
   socialLocationRetrieved: (location: LocationType) => {
     let bannedUsers = [] as string[]
-    location.locationBans.forEach((ban) => {
path: packages/client-core/src/social/services/LocationService.ts
user: login: HexaField
body: we can also remove the other `bannedUsers` array creation, deduplication and removal from currentLocation state, as it is already unused
created_at: 2025-04-08T01:11:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -63,7 +63,6 @@ export const LocationSeed: LocationType = {
     updatedAt: ''
   },
   locationAuthorizedUsers: [],
-  locationBans: [],
path: packages/client-core/src/social/services/LocationService.ts
user: login: HexaField
body: we should also remove `bannedUsers` from `currentLocation` in `LocationState`
created_at: 2025-04-08T01:12:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,94 +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/ir-engine/ir-engine/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 Infinite Reality Engine.
-
-The Original Developer is the Initial Developer. The Initial Developer of the
-Original Code is the Infinite Reality Engine team.
-
-All portions of the code written by the Infinite Reality Engine team are Copyright © 2021-2023 
-Infinite Reality Engine. All Rights Reserved.
-*/
-
-import type { Knex } from 'knex'
-
-import { locationBanPath } from '@ir-engine/common/src/schemas/social/location-ban.schema'
path: packages/server-core/src/social/location-ban/migrations/20230727072648_location-ban.ts
user: login: HexaField
body: we do not want to remove this (or any) migration, we just need to in-line the `locationBanPath` as a const 
created_at: 2025-04-08T01:13:50Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,94 +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/ir-engine/ir-engine/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 Infinite Reality Engine.
-
-The Original Developer is the Initial Developer. The Initial Developer of the
-Original Code is the Infinite Reality Engine team.
-
-All portions of the code written by the Infinite Reality Engine team are Copyright © 2021-2023 
-Infinite Reality Engine. All Rights Reserved.
-*/
-
-import type { Knex } from 'knex'
-
-import { locationBanPath } from '@ir-engine/common/src/schemas/social/location-ban.schema'
path: packages/server-core/src/social/location-ban/migrations/20230727072648_location-ban.ts
user: login: mshafiqmk
body: in this is case we should only keep migration right , we can remove services and other files ?
created_at: 2025-04-08T02:17:01Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,94 +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/ir-engine/ir-engine/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 Infinite Reality Engine.
-
-The Original Developer is the Initial Developer. The Initial Developer of the
-Original Code is the Infinite Reality Engine team.
-
-All portions of the code written by the Infinite Reality Engine team are Copyright © 2021-2023 
-Infinite Reality Engine. All Rights Reserved.
-*/
-
-import type { Knex } from 'knex'
-
-import { locationBanPath } from '@ir-engine/common/src/schemas/social/location-ban.schema'
path: packages/server-core/src/social/location-ban/migrations/20230727072648_location-ban.ts
user: login: HexaField
body: yes
created_at: 2025-04-08T22:37:21Z
author_association: CONTRIBUTOR

PR comments:
user: login: HexaField
created_at: 2025-03-29T00:52:49Z
body: @mshafiqmk ^^ changes still requested
author_association: CONTRIBUTOR
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:45:12Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_network&pullRequest=1301) **Quality Gate passed for 'ir-engine_network'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_network&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_network&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_network&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_network&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_network&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_network&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:45:13Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_client&pullRequest=1301) **Quality Gate passed for 'ir-engine_client'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_client&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_client&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_client&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_client&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_client&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_client&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:45:22Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_hyperflux&pullRequest=1301) **Quality Gate passed for 'ir-engine_hyperflux'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_hyperflux&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_hyperflux&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_hyperflux&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_hyperflux&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_hyperflux&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_hyperflux&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:45:25Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_common&pullRequest=1301) **Quality Gate passed for 'ir-engine_common'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_common&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_common&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_common&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_common&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_common&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_common&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:45:26Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_ecs&pullRequest=1301) **Quality Gate passed for 'ir-engine_ecs'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_ecs&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_ecs&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_ecs&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_ecs&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_ecs&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_ecs&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:45:32Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_client-core&pullRequest=1301) **Quality Gate passed for 'ir-engine_client-core'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_client-core&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_client-core&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_client-core&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_client-core&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_client-core&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_client-core&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:45:35Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_editor&pullRequest=1301) **Quality Gate passed for 'ir-engine_editor'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_editor&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_editor&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_editor&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_editor&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_editor&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_editor&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:45:35Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_matchmaking&pullRequest=1301) **Quality Gate passed for 'ir-engine_matchmaking'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_matchmaking&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_matchmaking&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_matchmaking&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_matchmaking&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_matchmaking&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_matchmaking&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:45:43Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_taskserver&pullRequest=1301) **Quality Gate passed for 'ir-engine_taskserver'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_taskserver&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_taskserver&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_taskserver&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_taskserver&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_taskserver&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_taskserver&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:46:00Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_server&pullRequest=1301) **Quality Gate passed for 'ir-engine_server'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_server&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_server&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_server&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_server&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_server&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_server&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:46:03Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_spatial&pullRequest=1301) **Quality Gate passed for 'ir-engine_spatial'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_spatial&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_spatial&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_spatial&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_spatial&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_spatial&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_spatial&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:46:04Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_engine&pullRequest=1301) **Quality Gate passed for 'ir-engine_engine'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_engine&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_engine&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_engine&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [91.7% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_engine&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_engine&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_engine&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:46:23Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=ir-engine_instanceserver&pullRequest=1301) **Quality Gate passed for 'ir-engine_instanceserver'**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=ir-engine_instanceserver&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=ir-engine_instanceserver&pullRequest=1301&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=ir-engine_instanceserver&pullRequest=1301&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [50.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_instanceserver&pullRequest=1301&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=ir-engine_instanceserver&pullRequest=1301&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_instanceserver&pullRequest=1301)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-03T11:55:25Z
body: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=ir-engine_server-core&pullRequest=1301) **Quality Gate failed for 'ir-engine_server-core'**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [4.3% Coverage on New Code](https://sonarcloud.io/component_measures?id=ir-engine_server-core&pullRequest=1301&metric=new_coverage&view=list) (required ≥ 70%)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ir-engine_server-core&pullRequest=1301)


author_association: NONE