feat: fixed metadata to be single origin and return in all scopes

equally and some ui improvement
This commit is contained in:
=
2025-11-06 11:44:46 +05:30
parent a9c4a682d1
commit 4bb13d592f
11 changed files with 165 additions and 116 deletions

View File

@@ -141,7 +141,15 @@ export const registerIdentityProjectMembershipRouter = async (server: FastifyZod
})
),
identity: IdentitiesSchema.pick({ name: true, id: true, orgId: true, projectId: true }).extend({
authMethods: z.array(z.string())
authMethods: z.array(z.string()),
metadata: z
.object({
id: z.string().trim().min(1),
key: z.string().trim().min(1),
value: z.string().trim().min(1)
})
.array()
.optional()
})
})
})

View File

@@ -13,9 +13,7 @@ export const identityV2DALFactory = (db: TDbClient) => {
const doc = await db
.replicaNode()(TableName.Identity)
.leftJoin(TableName.IdentityMetadata, (queryBuilder) => {
void queryBuilder
.on(`${TableName.Identity}.id`, `${TableName.IdentityMetadata}.identityId`)
.andOn(`${TableName.Identity}.orgId`, `${TableName.IdentityMetadata}.orgId`);
void queryBuilder.on(`${TableName.Identity}.id`, `${TableName.IdentityMetadata}.identityId`);
})
.leftJoin(
TableName.IdentityUniversalAuth,
@@ -134,9 +132,7 @@ export const identityV2DALFactory = (db: TDbClient) => {
const query = db
.replicaNode()(TableName.Identity)
.leftJoin(TableName.IdentityMetadata, (queryBuilder) => {
void queryBuilder
.on(`${TableName.Identity}.id`, `${TableName.IdentityMetadata}.identityId`)
.andOn(`${TableName.Identity}.orgId`, `${TableName.IdentityMetadata}.orgId`);
void queryBuilder.on(`${TableName.Identity}.id`, `${TableName.IdentityMetadata}.identityId`);
})
.where(`${TableName.Identity}.orgId`, scopeData.orgId)
.where((qb) => {

View File

@@ -189,9 +189,7 @@ export const identityOrgDALFactory = (db: TDbClient) => {
)
.leftJoin(TableName.Role, `${TableName.MembershipRole}.customRoleId`, `${TableName.Role}.id`)
.leftJoin(TableName.IdentityMetadata, (queryBuilder) => {
void queryBuilder
.on(`paginatedIdentity.actorIdentityId`, `${TableName.IdentityMetadata}.identityId`)
.andOn(`paginatedIdentity.scopeOrgId`, `${TableName.IdentityMetadata}.orgId`);
void queryBuilder.on(`paginatedIdentity.actorIdentityId`, `${TableName.IdentityMetadata}.identityId`);
})
.leftJoin<TIdentityUniversalAuths>(
TableName.IdentityUniversalAuth,
@@ -449,9 +447,7 @@ export const identityOrgDALFactory = (db: TDbClient) => {
.join(TableName.MembershipRole, `${TableName.MembershipRole}.membershipId`, `${TableName.Membership}.id`)
.leftJoin(TableName.Role, `${TableName.MembershipRole}.customRoleId`, `${TableName.Role}.id`)
.leftJoin(TableName.IdentityMetadata, (queryBuilder) => {
void queryBuilder
.on(`${TableName.Membership}.actorIdentityId`, `${TableName.IdentityMetadata}.identityId`)
.andOn(`${TableName.Membership}.scopeOrgId`, `${TableName.IdentityMetadata}.orgId`);
void queryBuilder.on(`${TableName.Membership}.actorIdentityId`, `${TableName.IdentityMetadata}.identityId`);
})
.leftJoin(
TableName.IdentityUniversalAuth,

View File

@@ -222,8 +222,6 @@ export const identityServiceFactory = ({
const identityDetails = await identityDAL.findById(id);
console.log("has project id", identityDetails);
if (identityDetails.projectId) {
throw new BadRequestError({ message: `Identity is managed by project` });
}

View File

@@ -40,9 +40,7 @@ export const membershipIdentityDALFactory = (db: TDbClient) => {
.join(TableName.MembershipRole, `${TableName.Membership}.id`, `${TableName.MembershipRole}.membershipId`)
.leftJoin(TableName.Role, `${TableName.MembershipRole}.customRoleId`, `${TableName.Role}.id`)
.leftJoin(TableName.IdentityMetadata, (queryBuilder) => {
void queryBuilder
.on(`${TableName.Membership}.actorIdentityId`, `${TableName.IdentityMetadata}.identityId`)
.andOn(`${TableName.Membership}.scopeOrgId`, `${TableName.IdentityMetadata}.orgId`);
void queryBuilder.on(`${TableName.Membership}.actorIdentityId`, `${TableName.IdentityMetadata}.identityId`);
})
.where(`${TableName.Membership}.scopeOrgId`, scopeData.orgId)
.where(`${TableName.Membership}.actorIdentityId`, identityId)
@@ -216,7 +214,10 @@ export const membershipIdentityDALFactory = (db: TDbClient) => {
]
});
return data?.[0];
const el = data?.[0];
if (!el) return el;
return { ...el, identity: { ...el.identity, metadata: el.metadata } };
} catch (error) {
throw new DatabaseError({ error, name: "MembershipGetByIdentityId" });
}