feat: Servers feature in backend

This commit is contained in:
2025-01-02 14:48:19 +07:00
parent eb92d3e689
commit edcb36e279
5 changed files with 669 additions and 8 deletions
+127
View File
@@ -0,0 +1,127 @@
import { prisma } from "@minikura/db";
import type { ServerType } from "@minikura/db";
import crypto from "node:crypto";
export namespace ServerService {
export async function getAllServers(omitSensitive = false) {
return await prisma.server.findMany({
omit: {
api_key: omitSensitive,
},
});
}
export async function getAllReverseProxyServers(omitSensitive = false) {
return await prisma.reverseProxyServer.findMany({
omit: {
api_key: omitSensitive,
},
});
}
export async function getServerById(id: string, omitSensitive = false) {
return await prisma.server.findUnique({
where: { id },
omit: {
api_key: omitSensitive,
},
});
}
export async function getReverseProxyServerById(
id: string,
omitSensitive = false
) {
return await prisma.reverseProxyServer.findUnique({
where: { id },
omit: {
api_key: omitSensitive,
},
});
}
export async function getServerByName(name: string, omitSensitive = false) {
return await prisma.server.findUnique({
where: { name },
omit: {
api_key: omitSensitive,
},
});
}
export async function getReverseProxyServerByName(
name: string,
omitSensitive = false
) {
return await prisma.reverseProxyServer.findUnique({
where: { name },
omit: {
api_key: omitSensitive,
},
});
}
export async function createReverseProxyServer({
name,
description,
address,
port,
}: {
name: string;
description: string | null;
address: string;
port: number;
}) {
let token = crypto.randomBytes(64).toString("hex");
token = token
.split("")
.map((char) => (Math.random() > 0.5 ? char.toUpperCase() : char))
.join("");
token = `minikura_reverse_proxy_server_api_key_${token}`;
return await prisma.reverseProxyServer.create({
data: {
name,
description,
address,
port,
api_key: token,
},
});
}
export async function createServer({
name,
description,
address,
port,
type,
join_priority,
}: {
name: string;
description: string | null;
address: string;
port: number;
type: ServerType;
join_priority: number | null;
}) {
let token = crypto.randomBytes(64).toString("hex");
token = token
.split("")
.map((char) => (Math.random() > 0.5 ? char.toUpperCase() : char))
.join("");
token = `minikura_server_api_key_${token}`;
return await prisma.server.create({
data: {
name,
description,
address,
port,
type,
api_key: token,
join_priority,
},
});
}
}
+126
View File
@@ -0,0 +1,126 @@
import { prisma } from "@minikura/db";
import crypto from "node:crypto";
export namespace SessionService {
export enum SESSION_STATUS {
VALID = "VALID",
INVALID = "INVALID",
REVOKED = "REVOKED",
EXPIRED = "EXPIRED",
}
export async function validate(token: string) {
const session = await prisma.session.findUnique({
where: {
token,
},
});
if (!session) {
return {
status: SESSION_STATUS.INVALID,
session: null,
};
}
if (session.revoked) {
return {
status: SESSION_STATUS.REVOKED,
session,
};
}
if (session.expires_at < new Date()) {
return {
status: SESSION_STATUS.EXPIRED,
session,
};
}
return {
status: SESSION_STATUS.VALID,
session,
};
}
export async function validateApiKey(apiKey: string) {
// If starts with "minikura_reverse_proxy_server_api_key_"
if (apiKey.startsWith("minikura_reverse_proxy_server_api_key_")) {
const reverseProxyServer = await prisma.reverseProxyServer.findUnique({
where: {
api_key: apiKey,
},
});
if (!reverseProxyServer) {
return {
status: SESSION_STATUS.INVALID,
session: null,
};
}
return {
status: SESSION_STATUS.VALID,
server: reverseProxyServer,
};
}
if (apiKey.startsWith("minikura_server_api_key_")) {
const server = await prisma.server.findUnique({
where: {
api_key: apiKey,
},
});
if (!server) {
return {
status: SESSION_STATUS.INVALID,
session: null,
};
}
return {
status: SESSION_STATUS.VALID,
server: server,
};
}
return {
status: SESSION_STATUS.INVALID,
session: null,
};
}
export async function create(userId: string) {
let token = crypto.randomBytes(64).toString("hex");
token = token
.split("")
.map((char) => (Math.random() > 0.5 ? char.toUpperCase() : char))
.join("");
token = `minikura_user_session_${token}`;
return await prisma.session.create({
data: {
token,
user: {
connect: {
id: userId,
},
},
// Expires in 48 hours
expires_at: new Date(Date.now() + 48 * 60 * 60 * 1000),
},
});
}
export async function revoke(token: string) {
return await prisma.session.update({
where: {
token,
},
data: {
revoked: true,
},
});
}
}
+9
View File
@@ -0,0 +1,9 @@
import { prisma } from "@minikura/db";
export namespace UserService {
export async function getUserByUsername(username: string) {
return await prisma.user.findUnique({
where: { username },
});
}
}