|
1 | | -import type { Cluster, Kubeconfig, Project, ProjectRole, Zone } from '@prisma/client' |
2 | | -import type { ClusterObject, HookResult, KubeCluster, KubeUser, Project as ProjectPayload, RepoCreds, Repository, Store, ZoneObject } from '@cpn-console/hooks' |
| 1 | +import type { Cluster, Kubeconfig, Project, ProjectRole, Zone, ProjectMembers } from '@prisma/client' |
| 2 | +import type { ClusterObject, HookResult, KubeCluster, KubeUser, ProjectMemberPayload, Project as ProjectPayload, RepoCreds, Repository, Store, ZoneObject } from '@cpn-console/hooks' |
3 | 3 | import { hooks } from '@cpn-console/hooks' |
4 | 4 | import type { AsyncReturnType } from '@cpn-console/shared' |
5 | 5 | import { ProjectAuthorized, getPermsByUserRoles, resourceListToDict } from '@cpn-console/shared' |
@@ -139,6 +139,65 @@ const user = { |
139 | 139 | }, |
140 | 140 | } as const |
141 | 141 |
|
| 142 | +const projectMember = { |
| 143 | + upsert: async (projectId: Project['id'], userId: ProjectMembers['userId']) => { |
| 144 | + const project = await getHookProjectInfos(projectId) |
| 145 | + const store = dbToObj(await getAdminPlugin()) |
| 146 | + |
| 147 | + const member = project.members.find(m => m.userId === userId) |
| 148 | + if (!member) throw new Error('Member not found') |
| 149 | + |
| 150 | + const memberRoles = project.roles |
| 151 | + .filter(role => member.roleIds.includes(role.id)) |
| 152 | + .map(role => ({ ...role, oidcGroup: role.oidcGroup ?? undefined })) |
| 153 | + |
| 154 | + const payload = { |
| 155 | + userId: member.userId, |
| 156 | + roleIds: member.roleIds, |
| 157 | + firstName: member.user.firstName, |
| 158 | + lastName: member.user.lastName, |
| 159 | + email: member.user.email, |
| 160 | + type: member.user.type as 'human' | 'bot' | 'ghost', |
| 161 | + createdAt: member.user.createdAt.toISOString(), |
| 162 | + updatedAt: member.user.updatedAt.toISOString(), |
| 163 | + lastLogin: member.user.lastLogin?.toISOString(), |
| 164 | + projectId: project.id, |
| 165 | + roles: memberRoles, |
| 166 | + project: { id: project.id, slug: project.slug }, |
| 167 | + } as unknown as ProjectMemberPayload |
| 168 | + |
| 169 | + return hooks.upsertProjectMember.execute(payload, store) |
| 170 | + }, |
| 171 | + delete: async (projectId: Project['id'], userId: ProjectMembers['userId']) => { |
| 172 | + const project = await getHookProjectInfos(projectId) |
| 173 | + const store = dbToObj(await getAdminPlugin()) |
| 174 | + |
| 175 | + const member = project.members.find(m => m.userId === userId) |
| 176 | + if (!member) throw new Error('Member not found') |
| 177 | + |
| 178 | + const memberRoles = project.roles |
| 179 | + .filter(role => member.roleIds.includes(role.id)) |
| 180 | + .map(role => ({ ...role, oidcGroup: role.oidcGroup ?? undefined })) |
| 181 | + |
| 182 | + const payload = { |
| 183 | + userId: member.userId, |
| 184 | + roleIds: member.roleIds, |
| 185 | + firstName: member.user.firstName, |
| 186 | + lastName: member.user.lastName, |
| 187 | + email: member.user.email, |
| 188 | + type: member.user.type as 'human' | 'bot' | 'ghost', |
| 189 | + createdAt: member.user.createdAt.toISOString(), |
| 190 | + updatedAt: member.user.updatedAt.toISOString(), |
| 191 | + lastLogin: member.user.lastLogin?.toISOString(), |
| 192 | + projectId: project.id, |
| 193 | + roles: memberRoles, |
| 194 | + project: { id: project.id, slug: project.slug }, |
| 195 | + } as unknown as ProjectMemberPayload |
| 196 | + |
| 197 | + return hooks.deleteProjectMember.execute(payload, store) |
| 198 | + }, |
| 199 | +} as const |
| 200 | + |
142 | 201 | const projectRole = { |
143 | 202 | upsert: async (roleId: ProjectRole['id']) => { |
144 | 203 | const role = await getRole(roleId) |
@@ -218,6 +277,8 @@ export const hook = { |
218 | 277 | // @ts-ignore TODO voir comment opti la signature de la fonction |
219 | 278 | projectRole: genericProxy(projectRole, { delete: ['upsert', 'delete'], upsert: ['delete'] }), |
220 | 279 | // @ts-ignore TODO voir comment opti la signature de la fonction |
| 280 | + projectMember: genericProxy(projectMember, { delete: ['upsert'], upsert: ['delete'] }), |
| 281 | + // @ts-ignore TODO voir comment opti la signature de la fonction |
221 | 282 | cluster: genericProxy(cluster, { delete: ['upsert', 'delete'], upsert: ['delete'] }), |
222 | 283 | // @ts-ignore TODO voir comment opti la signature de la fonction |
223 | 284 | zone: genericProxy(zone, { delete: ['upsert'], upsert: ['delete'] }), |
|
0 commit comments