Umstellung auf PostgresDB & user Table & update drizzle
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
// drizzle.service.ts
|
||||
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
|
||||
import { and, eq, sql } from 'drizzle-orm';
|
||||
import { drizzle } from 'drizzle-orm/libsql';
|
||||
import { Deck, SelectDeck, User } from '../db/schema';
|
||||
//import { drizzle } from 'drizzle-orm/libsql';
|
||||
import { drizzle } from 'drizzle-orm/node-postgres';
|
||||
import { deck, SelectDeck, User } from '../db/schema';
|
||||
import { SqlLoggerService } from './sql-logger.service';
|
||||
|
||||
@Injectable()
|
||||
@@ -10,20 +11,27 @@ export class DrizzleService {
|
||||
// private readonly logger = new Logger(DrizzleService.name);
|
||||
private db: any;
|
||||
constructor(private sqlLogger: SqlLoggerService) {
|
||||
this.db = drizzle('file:local.db', {
|
||||
// this.db = drizzle('file:local.db', {
|
||||
// logger: {
|
||||
// logQuery: (query: string, params: any[]) => {
|
||||
// this.sqlLogger.logQuery(query, params);
|
||||
// },
|
||||
// },
|
||||
// });
|
||||
this.db = drizzle('postgresql://haiky:xieng7Seih@localhost:15432/haiky', {
|
||||
logger: {
|
||||
logQuery: (query: string, params: any[]) => {
|
||||
this.sqlLogger.logQuery(query, params);
|
||||
},
|
||||
},
|
||||
});
|
||||
}); //drizzle(process.env.DATABASE_URL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Methode zum Abrufen aller Decks eines Benutzers
|
||||
*/
|
||||
async getDecks(user: User) {
|
||||
return this.db.select().from(Deck).where(eq(Deck.user, user.email));
|
||||
return this.db.select().from(deck).where(eq(deck.user, user.email));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -32,7 +40,7 @@ export class DrizzleService {
|
||||
async createDeck(deckname: string, user: User) {
|
||||
// 'inserted' und 'updated' werden automatisch von der Datenbank gesetzt
|
||||
const result = await this.db
|
||||
.insert(Deck)
|
||||
.insert(deck)
|
||||
.values({
|
||||
deckname,
|
||||
user: user.email,
|
||||
@@ -48,8 +56,8 @@ export class DrizzleService {
|
||||
async getDeckByName(deckname: string, user: User) {
|
||||
return this.db
|
||||
.select()
|
||||
.from(Deck)
|
||||
.where(and(eq(Deck.deckname, deckname), eq(Deck.user, user.email)));
|
||||
.from(deck)
|
||||
.where(and(eq(deck.deckname, deckname), eq(deck.user, user.email)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -61,7 +69,7 @@ export class DrizzleService {
|
||||
throw new HttpException('Deck not found', HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
await this.db.delete(Deck).where(and(eq(Deck.deckname, deckname), eq(Deck.user, user.email)));
|
||||
await this.db.delete(deck).where(and(eq(deck.deckname, deckname), eq(deck.user, user.email)));
|
||||
return { status: 'success' };
|
||||
}
|
||||
|
||||
@@ -80,12 +88,12 @@ export class DrizzleService {
|
||||
}
|
||||
|
||||
await this.db
|
||||
.update(Deck)
|
||||
.update(deck)
|
||||
.set({
|
||||
deckname: newDeckname,
|
||||
updated: sql`CURRENT_TIMESTAMP`, // Setze 'updated' auf CURRENT_TIMESTAMP
|
||||
})
|
||||
.where(and(eq(Deck.deckname, oldDeckname), eq(Deck.user, user.email)));
|
||||
.where(and(eq(deck.deckname, oldDeckname), eq(deck.user, user.email)));
|
||||
return { status: 'success', message: 'Deck renamed successfully' };
|
||||
}
|
||||
|
||||
@@ -116,7 +124,7 @@ export class DrizzleService {
|
||||
for (let index = 0; index < newEntries.length; index++) {
|
||||
const box = newEntries[index];
|
||||
const result = await this.db
|
||||
.insert(Deck)
|
||||
.insert(deck)
|
||||
.values({
|
||||
deckname: data.deckname,
|
||||
bildname: data.bildname,
|
||||
@@ -138,7 +146,7 @@ export class DrizzleService {
|
||||
const existingDeck = existingDecks.find(d => d.id === box.id);
|
||||
if (existingDeck && (existingDeck.x1 !== box.x1 || existingDeck.x2 !== box.x2 || existingDeck.y1 !== box.y1 || existingDeck.y2 !== box.y2)) {
|
||||
const result = await this.db
|
||||
.update(Deck)
|
||||
.update(deck)
|
||||
.set({
|
||||
x1: box.x1,
|
||||
x2: box.x2,
|
||||
@@ -146,7 +154,7 @@ export class DrizzleService {
|
||||
y2: box.y2,
|
||||
updated: sql`CURRENT_TIMESTAMP`, // Setze 'updated' auf CURRENT_TIMESTAMP
|
||||
})
|
||||
.where(and(eq(Deck.user, user.email), eq(Deck.bildid, data.bildid), eq(Deck.deckname, data.deckname), eq(Deck.id, box.id!!)));
|
||||
.where(and(eq(deck.user, user.email), eq(deck.bildid, data.bildid), eq(deck.deckname, data.deckname), eq(deck.id, box.id!!)));
|
||||
if (result.rowsAffected === 0) {
|
||||
throw new HttpException(`Box with id ${box.id} not found`, HttpStatus.NOT_FOUND);
|
||||
}
|
||||
@@ -164,7 +172,7 @@ export class DrizzleService {
|
||||
const idsToDelete = existingIdsInDb.filter(id => !incomingIds.includes(id));
|
||||
|
||||
if (idsToDelete.length > 0) {
|
||||
await this.db.delete(Deck).where(and(eq(Deck.deckname, data.deckname), eq(Deck.bildid, data.bildid), eq(Deck.user, user.email), sql`id in ${idsToDelete}`));
|
||||
await this.db.delete(deck).where(and(eq(deck.deckname, data.deckname), eq(deck.bildid, data.bildid), eq(deck.user, user.email), sql`id in ${idsToDelete}`));
|
||||
}
|
||||
|
||||
return { status: 'success', inserted_images: insertedImages };
|
||||
@@ -175,16 +183,16 @@ export class DrizzleService {
|
||||
*/
|
||||
async deleteImagesByBildId(bildid: string, user: User) {
|
||||
const affectedDecks = await this.db
|
||||
.select({ deckname: Deck.deckname })
|
||||
.from(Deck)
|
||||
.where(and(eq(Deck.bildid, bildid), eq(Deck.user, user.email)))
|
||||
.select({ deckname: deck.deckname })
|
||||
.from(deck)
|
||||
.where(and(eq(deck.bildid, bildid), eq(deck.user, user.email)))
|
||||
.all();
|
||||
|
||||
if (affectedDecks.length === 0) {
|
||||
throw new HttpException('No entries found for the given image ID', HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
await this.db.delete(Deck).where(and(eq(Deck.bildid, bildid), eq(Deck.user, user.email)));
|
||||
await this.db.delete(deck).where(and(eq(deck.bildid, bildid), eq(deck.user, user.email)));
|
||||
|
||||
return {
|
||||
status: 'success',
|
||||
@@ -198,8 +206,8 @@ export class DrizzleService {
|
||||
async moveImage(bildid: string, targetDeckId: string, user: User) {
|
||||
const existingImages = await this.db
|
||||
.select()
|
||||
.from(Deck)
|
||||
.where(and(eq(Deck.bildid, bildid), eq(Deck.user, user.email)))
|
||||
.from(deck)
|
||||
.where(and(eq(deck.bildid, bildid), eq(deck.user, user.email)))
|
||||
.all();
|
||||
|
||||
if (existingImages.length === 0) {
|
||||
@@ -207,12 +215,12 @@ export class DrizzleService {
|
||||
}
|
||||
|
||||
await this.db
|
||||
.update(Deck)
|
||||
.update(deck)
|
||||
.set({
|
||||
deckname: targetDeckId,
|
||||
updated: sql`CURRENT_TIMESTAMP`, // Setze 'updated' auf CURRENT_TIMESTAMP
|
||||
})
|
||||
.where(and(eq(Deck.bildid, bildid), eq(Deck.user, user.email)));
|
||||
.where(and(eq(deck.bildid, bildid), eq(deck.user, user.email)));
|
||||
|
||||
return { status: 'success', moved_entries: existingImages.length };
|
||||
}
|
||||
@@ -222,8 +230,8 @@ export class DrizzleService {
|
||||
async renameImage(bildId: string, newImagename: string, user: User) {
|
||||
const existingImages = this.db
|
||||
.select()
|
||||
.from(Deck)
|
||||
.where(and(eq(Deck.bildid, bildId), eq(Deck.user, user.email)));
|
||||
.from(deck)
|
||||
.where(and(eq(deck.bildid, bildId), eq(deck.user, user.email)));
|
||||
if (existingImages.length === 0) {
|
||||
throw new HttpException('Deck not found', HttpStatus.NOT_FOUND);
|
||||
}
|
||||
@@ -234,12 +242,12 @@ export class DrizzleService {
|
||||
// }
|
||||
|
||||
await this.db
|
||||
.update(Deck)
|
||||
.update(deck)
|
||||
.set({
|
||||
bildname: newImagename,
|
||||
updated: sql`CURRENT_TIMESTAMP`, // Setze 'updated' auf CURRENT_TIMESTAMP
|
||||
})
|
||||
.where(and(eq(Deck.bildid, bildId), eq(Deck.user, user.email)));
|
||||
.where(and(eq(deck.bildid, bildId), eq(deck.user, user.email)));
|
||||
return { status: 'success', message: 'Image Entries renamed successfully' };
|
||||
}
|
||||
/**
|
||||
@@ -264,9 +272,9 @@ export class DrizzleService {
|
||||
updateData.updated = sql`CURRENT_TIMESTAMP`; // Setze 'updated' auf CURRENT_TIMESTAMP
|
||||
|
||||
const result = await this.db
|
||||
.update(Deck)
|
||||
.update(deck)
|
||||
.set(updateData)
|
||||
.where(and(eq(Deck.id, id), eq(Deck.user, user.email)));
|
||||
.where(and(eq(deck.id, id), eq(deck.user, user.email)));
|
||||
|
||||
if (result.rowsAffected === 0) {
|
||||
throw new HttpException('Box not found', HttpStatus.NOT_FOUND);
|
||||
@@ -280,7 +288,7 @@ export class DrizzleService {
|
||||
*/
|
||||
async getDistinctBildIds(user: User): Promise<string[]> {
|
||||
try {
|
||||
const result = await this.db.selectDistinct([Deck.bildid]).from(Deck).all();
|
||||
const result = await this.db.selectDistinct([deck.bildid]).from(deck).all();
|
||||
|
||||
// Extrahiere die bildid Werte aus dem Ergebnis
|
||||
const usedIds = result.map((row: any) => row['0']).filter((id: string | null) => id !== null) as string[];
|
||||
|
||||
@@ -1,37 +1,45 @@
|
||||
import { sql } from 'drizzle-orm';
|
||||
import * as t from 'drizzle-orm/sqlite-core';
|
||||
import { integer, real, sqliteTable as table, text } from 'drizzle-orm/sqlite-core';
|
||||
import * as t from 'drizzle-orm/pg-core';
|
||||
import { pgEnum, pgTable as table } from 'drizzle-orm/pg-core';
|
||||
|
||||
export const Deck = table(
|
||||
'Deck',
|
||||
export const rolesEnum = pgEnum('roles', ['admin', 'guest', 'pro']);
|
||||
|
||||
export const deck = table(
|
||||
'deck',
|
||||
{
|
||||
id: integer('id').primaryKey({ autoIncrement: true }),
|
||||
deckname: text('deckname').notNull(),
|
||||
bildname: text('bildname'),
|
||||
bildid: text('bildid'),
|
||||
x1: real('x1'),
|
||||
x2: real('x2'),
|
||||
y1: real('y1'),
|
||||
y2: real('y2'),
|
||||
due: integer('due'),
|
||||
ivl: real('ivl'),
|
||||
factor: real('factor'),
|
||||
reps: integer('reps'),
|
||||
lapses: integer('lapses'),
|
||||
isGraduated: integer('isGraduated'),
|
||||
user: text('user').notNull(),
|
||||
inserted: text().default(sql`(CURRENT_TIMESTAMP)`), // Neue Spalte
|
||||
updated: text().default(sql`(CURRENT_TIMESTAMP)`), // Neue Spalte
|
||||
},
|
||||
table => {
|
||||
return {
|
||||
index: t.uniqueIndex('email_idx').on(table.id),
|
||||
};
|
||||
id: t.integer('id').primaryKey().generatedAlwaysAsIdentity(),
|
||||
deckname: t.varchar('deckname').notNull(),
|
||||
bildname: t.varchar('bildname'),
|
||||
bildid: t.varchar('bildid'),
|
||||
x1: t.real('x1'),
|
||||
x2: t.real('x2'),
|
||||
y1: t.real('y1'),
|
||||
y2: t.real('y2'),
|
||||
due: t.integer('due'),
|
||||
ivl: t.real('ivl'),
|
||||
factor: t.real('factor'),
|
||||
reps: t.integer('reps'),
|
||||
lapses: t.integer('lapses'),
|
||||
isGraduated: t.integer('isgraduated'),
|
||||
user: t.varchar('user').notNull(),
|
||||
inserted: t.varchar().default(sql`(CURRENT_TIMESTAMP)`), // Neue Spalte
|
||||
updated: t.varchar().default(sql`(CURRENT_TIMESTAMP)`), // Neue Spalte
|
||||
},
|
||||
table => [t.uniqueIndex('deck_idx').on(table.id)],
|
||||
);
|
||||
|
||||
export type InsertDeck = typeof Deck.$inferInsert;
|
||||
export type SelectDeck = typeof Deck.$inferSelect;
|
||||
export const users = table(
|
||||
'users',
|
||||
{
|
||||
id: t.integer().primaryKey().generatedAlwaysAsIdentity(),
|
||||
name: t.varchar('name', { length: 256 }),
|
||||
email: t.varchar().notNull(),
|
||||
role: rolesEnum().default('guest'),
|
||||
sign_in_provider: t.varchar('sign_in_provider', { length: 50 }),
|
||||
},
|
||||
table => [t.uniqueIndex('users_idx').on(table.id)],
|
||||
);
|
||||
export type InsertDeck = typeof deck.$inferInsert;
|
||||
export type SelectDeck = typeof deck.$inferSelect;
|
||||
export interface User {
|
||||
name: string;
|
||||
picture: string;
|
||||
|
||||
Reference in New Issue
Block a user