· 5 months ago · May 11, 2025, 11:50 AM
1const knexConfig = require('../../../knexfile').development;
2const knex = require('knex')(knexConfig);
3const bcrypt = require('bcryptjs');
4
5/**
6 * Tworzy nowego użytkownika w bazie danych.
7 * @param {string} username - Nazwa użytkownika.
8 * @param {string} password - Hasło użytkownika (czysty tekst).
9 * @param {string} email - Adres email użytkownika.
10 * @param {string} publicKey - Klucz publiczny użytkownika.
11 * @param {string} privateKey - Klucz prywatny użytkownika (zaszyfrowany).
12 * @returns {Promise<object>} Obiekt nowo utworzonego użytkownika.
13 */
14async function createUser(username, password, email, publicKey, privateKey)
15{
16 try
17 {
18 const salt = await bcrypt.genSalt(10);
19 const passwordHash = await bcrypt.hash(password, salt); const [newUser] = await knex('User')
20 .insert({
21 Username: username,
22 PasswordHash: passwordHash,
23 Email: email,
24 PublicKey: publicKey,
25 PrivateKey: privateKey, // Przechowujemy zaszyfrowany klucz prywatny
26 // UpdatedAt jest generowany automatycznie przez bazę danych (defaultTo knex.fn.now())
27 })
28 .returning(['UserId', 'Username', 'Email', 'PublicKey', 'UpdatedAt']); // Zwróć te pola
29
30 return newUser;
31 }
32 catch (error)
33 {
34 console.error('Błąd podczas tworzenia użytkownika:', error); if (error.constraint === 'User_Username_key')
35 {
36 throw new Error('Nazwa użytkownika jest już zajęta.');
37 }
38 if (error.constraint === 'User_Email_key')
39 {
40 throw new Error('Adres email jest już używany.');
41 }
42 throw error;
43 }
44}
45
46/**
47 * Dodaje nową wiadomość do konwersacji.
48 * @param {string} conversationId - ID konwersacji.
49 * @param {string} userId - ID użytkownika wysyłającego wiadomość.
50 * @param {string} content - Treść wiadomości.
51 * @returns {Promise<object>} Obiekt nowo utworzonej wiadomości.
52 */
53async function addMessageToConversation(conversationId, userId, content)
54{
55 try
56 {
57 await knex.transaction(async trx =>
58 { // Sprawdź, czy użytkownik należy do konwersacji
59 const participation = await trx('ConversationUser')
60 .where({
61 UserId: userId,
62 ConversationId: conversationId
63 })
64 .first();
65
66 if (!participation)
67 {
68 throw new Error('Użytkownik nie należy do tej konwersacji.');
69 } const [newMessage] = await trx('Message')
70 .insert({
71 UserId: userId,
72 ConversationId: conversationId,
73 Content: content,
74 // SendAt jest generowany automatycznie
75 })
76 .returning('*');
77 return newMessage;
78 });
79 }
80 catch (error)
81 {
82 console.error('Błąd podczas dodawania wiadomości do konwersacji:', error);
83 throw error;
84 }
85}
86
87
88module.exports =
89{
90 createUser,
91 addMessageToConversation
92};
93