#23: users table + insert/update added

This commit is contained in:
2025-02-13 10:56:03 -06:00
parent 5eee7c9ac4
commit d180cd70e8
19 changed files with 110 additions and 33 deletions

View File

@@ -3,10 +3,11 @@ import { DecksController } from './decks.controller';
import { DrizzleService } from './drizzle.service';
import { ProxyController } from './proxy.controller';
import { SqlLoggerService } from './sql-logger.service';
import { UserController } from './user.controller';
@Module({
imports: [],
controllers: [DecksController, ProxyController],
controllers: [DecksController, ProxyController, UserController],
providers: [DrizzleService, SqlLoggerService],
})
export class AppModule {}

View File

@@ -3,7 +3,7 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { and, eq, sql } from 'drizzle-orm';
//import { drizzle } from 'drizzle-orm/libsql';
import { drizzle } from 'drizzle-orm/node-postgres';
import { deck, SelectDeck, User } from '../db/schema';
import { deck, InsertUser, SelectDeck, User, users } from '../db/schema';
import { SqlLoggerService } from './sql-logger.service';
@Injectable()
@@ -11,16 +11,7 @@ export class DrizzleService {
// private readonly logger = new Logger(DrizzleService.name);
private db: any;
constructor(private sqlLogger: SqlLoggerService) {
// this.db = drizzle('file:local.db', {
// logger: {
// logQuery: (query: string, params: any[]) => {
// this.sqlLogger.logQuery(query, params);
// },
// },
// });
this.db = drizzle(process.env['DATABASE_URL']!, {
//this.db = drizzle('postgresql://haiky:xieng7Seih@localhost:15432/haiky', {
logger: {
logQuery: (query: string, params: any[]) => {
this.sqlLogger.logQuery(query, params);
@@ -296,4 +287,42 @@ export class DrizzleService {
throw new HttpException(`Fehler beim Abrufen der Bild-IDs - ${error}`, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
/**
* Führt den Login-Vorgang durch:
* - Existiert der Benutzer bereits (überprüft via E-Mail), wird das Feld `lastLogin` (und ggf. weitere Felder) aktualisiert.
* - Existiert der Benutzer nicht, wird ein neuer Datensatz mit `role: 'guest'` und `lastLogin` auf den aktuellen Zeitpunkt angelegt.
*/
async logIn(createUserDto: InsertUser) {
// Prüfen, ob der Benutzer bereits existiert (hier anhand der E-Mail)
const existingUser = await this.db.select().from(users).where(eq(users.email, createUserDto.email)).limit(1);
if (existingUser.length > 0) {
// Benutzer existiert: Update des letzten Logins und ggf. weiterer Felder
const updatedUser = await this.db
.update(users)
.set({
lastLogin: new Date(), // Setzt lastLogin explizit auf den aktuellen Zeitpunkt
// Optional: Aktualisierung von Name und sign_in_provider, falls sich diese ändern sollten
name: createUserDto.name,
sign_in_provider: createUserDto.sign_in_provider,
})
.where(eq(users.email, createUserDto.email))
.returning();
return updatedUser;
} else {
// Neuer Benutzer: Insert mit role per Default 'guest' und lastLogin auf now
const insertedUser = await this.db
.insert(users)
.values({
name: createUserDto.name,
email: createUserDto.email,
sign_in_provider: createUserDto.sign_in_provider,
lastLogin: new Date(), // Setzt lastLogin auf now
role: 'guest', // Default-Wert 'guest'
})
.returning();
return insertedUser;
}
}
}

View File

@@ -0,0 +1,15 @@
// user.controller.ts
import { Body, Controller, Post } from '@nestjs/common';
import type { InsertUser } from '../db/schema';
import { DrizzleService } from './drizzle.service';
@Controller('users')
export class UserController {
constructor(private readonly drizzleService: DrizzleService) {}
@Post()
async createUser(@Body() createUserDto: InsertUser) {
// Hier kannst du zusätzliche Validierungen oder Logik einbauen.
return await this.drizzleService.logIn(createUserDto);
}
}