/
switch.ts
60 lines (59 loc) · 2.27 KB
/
switch.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { jsonRes } from '@/services/backend/response';
import { NextApiRequest, NextApiResponse } from 'next';
import { prisma } from '@/services/backend/db/init';
import { getUserKubeconfig } from '@/services/backend/kubernetes/admin';
import { switchKubeconfigNamespace } from '@/services/backend/kubernetes/user';
import { validate } from 'uuid';
import { JoinStatus } from 'prisma/region/generated/client';
import { generateAccessToken, generateAppToken, verifyAccessToken } from '@/services/backend/auth';
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
try {
const payload = await verifyAccessToken(req.headers);
if (!payload) return jsonRes(res, { code: 401, message: 'token verify error' });
const { ns_uid } = req.body as {
ns_uid?: string;
};
if (!ns_uid || !validate(ns_uid))
return jsonRes(res, { code: 400, message: 'ns_uid is invalid' });
const queryResults = await prisma.userWorkspace.findMany({
where: {
userCrUid: payload.userCrUid,
status: JoinStatus.IN_WORKSPACE
},
include: {
workspace: true,
userCr: true
}
});
const newWorkspaceItem = queryResults.find((item) => item.workspace.uid === ns_uid);
if (!newWorkspaceItem)
return jsonRes(res, { code: 403, message: 'You are not in this workspace' });
const oldKcRaw = await getUserKubeconfig(payload.userCrUid, payload.userCrName);
if (!oldKcRaw) return jsonRes(res, { code: 404, message: 'The kubeconfig is not found' });
const kubeconfig = switchKubeconfigNamespace(oldKcRaw, newWorkspaceItem.workspace.id);
const jwtPayload = {
workspaceUid: newWorkspaceItem.workspaceUid,
workspaceId: newWorkspaceItem.workspace.id,
regionUid: payload.regionUid,
userCrUid: payload.userCrUid,
userCrName: payload.userCrName,
userId: payload.userId,
userUid: payload.userUid
};
const token = generateAccessToken(jwtPayload);
const appToken = generateAppToken(jwtPayload);
const data = {
token,
kubeconfig,
appToken
};
return jsonRes(res, {
data,
code: 200,
message: 'Successfully'
});
} catch (e) {
console.log(e);
jsonRes(res, { code: 500, message: 'fail to switch namespace' });
}
}