mirror of
https://github.com/YuzuZensai/Minikura.git
synced 2026-09-13 18:59:25 +00:00
✨ feat: Servers feature in backend
This commit is contained in:
@@ -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,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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 },
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user