verif si login pas deja present avant ajout user
continuous-integration/drone/push Build is passing Details

Hugo PRADIER 11 months ago
parent ef726bc789
commit 1fd6463caf

@ -4,6 +4,11 @@ import sqlite3 from "sqlite3";
const dbDirectory = "./src/db"; const dbDirectory = "./src/db";
const dbFilePath = `${dbDirectory}/database.db`; const dbFilePath = `${dbDirectory}/database.db`;
export type error = {
errno: number;
code: string;
};
/* Fonction pour exécuter une requête sur la base de données */ /* Fonction pour exécuter une requête sur la base de données */
/* Fonction pour exécuter une requête de modification de la base de données (INSERT, UPDATE, DELETE) */ /* Fonction pour exécuter une requête de modification de la base de données (INSERT, UPDATE, DELETE) */
@ -111,15 +116,25 @@ export function createRegisteredUserTable(db: sqlite3.Database): Promise<void> {
} }
/* Insérer un utilisateur dans la table registered_user */ /* Insérer un utilisateur dans la table registered_user */
export function insertUser( export async function insertUser(
db: sqlite3.Database, db: sqlite3.Database,
login: string, login: string,
password: string, password: string,
permissions: number permissions: number
) { ): Promise<boolean> {
const insertUserQuery = `INSERT INTO registered_user (login, password, permissions) VALUES (?, ?, ?)`; const insertUserQuery = `INSERT INTO registered_user (login, password, permissions) VALUES (?, ?, ?)`;
return runDB(db, insertUserQuery, [login, password, permissions]); try {
await runDB(db, insertUserQuery, [login, password, permissions]);
return true;
} catch (e) {
const error = e as error;
if (error.code === "SQLITE_CONSTRAINT") {
return false;
} else {
throw e;
}
}
} }
/* Modifier le login d'un utilisateur dans la table registered_user */ /* Modifier le login d'un utilisateur dans la table registered_user */

@ -1,5 +1,5 @@
import cors from "@fastify/cors"; import cors from "@fastify/cors";
import websocket, { WebSocket } from '@fastify/websocket'; import websocket, { WebSocket } from "@fastify/websocket";
import { Type, TypeBoxTypeProvider } from "@fastify/type-provider-typebox"; import { Type, TypeBoxTypeProvider } from "@fastify/type-provider-typebox";
import Fastify, { FastifyReply } from "fastify"; import Fastify, { FastifyReply } from "fastify";
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
@ -18,13 +18,13 @@ const clients: Record<string, FastifyReply> = {};
const generateId = () => nanoid(32); const generateId = () => nanoid(32);
let updates: Update[] = []; let updates: Update[] = [];
let doc = Text.of(['']); let doc = Text.of([""]);
const liveClients: WebSocket[] = []; const liveClients: WebSocket[] = [];
function send(socket: WebSocket, requestId: number, payload: unknown) { function send(socket: WebSocket, requestId: number, payload: unknown) {
const response = { const response = {
_request: requestId, _request: requestId,
payload payload,
}; };
socket.send(JSON.stringify(response)); socket.send(JSON.stringify(response));
} }
@ -33,70 +33,78 @@ const fastify = Fastify({
logger: true, logger: true,
}).withTypeProvider<TypeBoxTypeProvider>(); }).withTypeProvider<TypeBoxTypeProvider>();
await fastify.register(cors, { await fastify.register(cors, {
origin: process.env.ALLOW_ORIGIN || '*', origin: process.env.ALLOW_ORIGIN || "*",
}); });
fastify.register(websocket); fastify.register(websocket);
fastify.get("/live", { websocket: true }, (socket, req) => { fastify.get("/live", { websocket: true }, (socket, req) => {
liveClients.push(socket); liveClients.push(socket);
socket.on("message", message => { socket.on("message", (message) => {
const data = JSON.parse(message.toString()); const data = JSON.parse(message.toString());
const requestId = data._request; const requestId = data._request;
if (data.type === "pullUpdates") { if (data.type === "pullUpdates") {
send(socket, requestId, updates.slice(data.version)) send(socket, requestId, updates.slice(data.version));
} else if (data.type === "pushUpdates") { } else if (data.type === "pushUpdates") {
let received = data.updates.map((json: any) => ({ let received = data.updates.map((json: any) => ({
clientID: json.clientID, clientID: json.clientID,
changes: ChangeSet.fromJSON(json.changes) changes: ChangeSet.fromJSON(json.changes),
})) }));
if (data.version != updates.length) { if (data.version != updates.length) {
received = rebaseUpdates(received, updates.slice(data.version)) received = rebaseUpdates(received, updates.slice(data.version));
} }
for (let update of received) { for (let update of received) {
updates.push(update) updates.push(update);
doc = update.changes.apply(doc) doc = update.changes.apply(doc);
} }
send(socket, requestId, received.map((update: any) => ({ send(
clientID: update.clientID, socket,
changes: update.changes.toJSON() requestId,
}))); received.map((update: any) => ({
clientID: update.clientID,
changes: update.changes.toJSON(),
}))
);
} else if (data.type == "getDocument") { } else if (data.type == "getDocument") {
send(socket, requestId, {version: updates.length, doc: doc.toString()}) send(socket, requestId, { version: updates.length, doc: doc.toString() });
} }
})
})
fastify.post("/run", {
schema: {
body: Type.Object({
code: Type.String(),
language: Type.String(),
}),
},
}, (req, reply) => {
const { code, language } = req.body;
const runner = getRunner(language);
if (runner === null) {
return reply.status(422).send({ error: "Invalid language" });
}
const jobId = generateId();
const buffer = allocateBuffer(jobId, code, runner);
reply.raw.writeHead(200, {
"Content-Type": "text/event-stream",
Connection: "keep-alive",
"Cache-Control": "no-cache",
"Access-Control-Allow-Origin": process.env.ALLOW_ORIGIN || "*",
});
reply.raw.on("close", () => {
delete clients[jobId];
}); });
sender.send(buffer).then(() => {
reply.raw.write("event: connected\n");
reply.raw.write(`data: ${jobId}\n`);
reply.raw.write("id: 0\n\n");
});
clients[jobId] = reply;
}); });
fastify.post(
"/run",
{
schema: {
body: Type.Object({
code: Type.String(),
language: Type.String(),
}),
},
},
(req, reply) => {
const { code, language } = req.body;
const runner = getRunner(language);
if (runner === null) {
return reply.status(422).send({ error: "Invalid language" });
}
const jobId = generateId();
const buffer = allocateBuffer(jobId, code, runner);
reply.raw.writeHead(200, {
"Content-Type": "text/event-stream",
Connection: "keep-alive",
"Cache-Control": "no-cache",
"Access-Control-Allow-Origin": process.env.ALLOW_ORIGIN || "*",
});
reply.raw.on("close", () => {
delete clients[jobId];
});
sender.send(buffer).then(() => {
reply.raw.write("event: connected\n");
reply.raw.write(`data: ${jobId}\n`);
reply.raw.write("id: 0\n\n");
});
clients[jobId] = reply;
}
);
/* Création du répertoire de la base de données s'il n'existe pas */ /* Création du répertoire de la base de données s'il n'existe pas */
db.createDbDirectory(); db.createDbDirectory();
@ -120,8 +128,11 @@ fastify.post(
}, },
async (request, reply) => { async (request, reply) => {
const { login, password, permissions } = request.body; const { login, password, permissions } = request.body;
db.insertUser(database, login, password, permissions); if (!(await db.insertUser(database, login, password, permissions))) {
reply.send({ success: true }); reply.send({ success: false });
} else {
reply.send({ success: true });
}
} }
); );

Loading…
Cancel
Save