Criteria Objekt überarbeitet

This commit is contained in:
2024-07-17 20:19:13 +02:00
parent bdafb03165
commit f88eebe8d3
22 changed files with 121 additions and 192 deletions

View File

@@ -38,7 +38,7 @@ export class JwtStrategy extends PassportStrategy(Strategy) {
this.logger.error('Missing required claims');
throw new UnauthorizedException();
}
const result = { userId: payload.sub, username: payload.preferred_username, roles: payload.realm_access?.roles };
const result = { userId: payload.sub, firstname: payload.given_name, lastname: payload.family_name, username: payload.preferred_username, roles: payload.realm_access?.roles };
this.logger.info(`JWT User: ${JSON.stringify(result)}`); // Debugging: JWT Payload anzeigen
return result;
}

View File

@@ -118,6 +118,8 @@ export interface KeycloakUser {
export interface JwtUser {
userId: string;
username: string;
firstname: string;
lastname: string;
roles: string[];
}
export interface Access {

View File

@@ -1,9 +1,10 @@
import { Body, Controller, Get, Inject, Param, Post, Query } from '@nestjs/common';
import { Body, Controller, Get, Inject, Param, Post, Query, Request, UseGuards } from '@nestjs/common';
import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
import { Logger } from 'winston';
import { FileService } from '../file/file.service.js';
import { OptionalJwtAuthGuard } from '../jwt-auth/optional-jwt-auth.guard.js';
import { User } from '../models/db.model';
import { Subscription } from '../models/main.model.js';
import { JwtUser, Subscription } from '../models/main.model.js';
import { UserService } from './user.service.js';
@Controller('user')
@@ -13,14 +14,15 @@ export class UserController {
private fileService: FileService,
@Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger,
) {}
@UseGuards(OptionalJwtAuthGuard)
@Get()
findByMail(@Query('mail') mail: string): any {
findByMail(@Request() req, @Query('mail') mail: string): any {
this.logger.info(`Searching for user with EMail: ${mail}`);
const user = this.userService.getUserByMail(mail);
const user = this.userService.getUserByMail(mail, req.user as JwtUser);
this.logger.info(`Found user: ${JSON.stringify(user)}`);
return user;
}
@Get(':id')
findById(@Param('id') id: string): any {
this.logger.info(`Searching for user with ID: ${id}`);

View File

@@ -7,7 +7,7 @@ import * as schema from '../drizzle/schema.js';
import { PG_CONNECTION } from '../drizzle/schema.js';
import { FileService } from '../file/file.service.js';
import { User } from '../models/db.model.js';
import { UserListingCriteria, emailToDirName } from '../models/main.model.js';
import { JwtUser, UserListingCriteria, emailToDirName } from '../models/main.model.js';
@Injectable()
export class UserService {
@@ -18,30 +18,38 @@ export class UserService {
) {}
private getConditions(criteria: UserListingCriteria): any[] {
const conditions = [];
if (criteria.state) {
//conditions.push(sql`EXISTS (SELECT 1 FROM unnest(users."areasServed") AS area WHERE area LIKE '%' || ${criteria.state} || '%')`);
conditions.push(sql`${schema.users.areasServed} @> ${JSON.stringify([{ state: criteria.state }])}`);
if (criteria.states?.length > 0) {
criteria.states.forEach(state => {
conditions.push(sql`${schema.users.areasServed} @> ${JSON.stringify([{ state: state }])}`);
});
}
if (criteria.firstname || criteria.lastname) {
conditions.push(or(ilike(schema.users.firstname, `%${criteria.lastname}%`), ilike(schema.users.lastname, `%${criteria.lastname}%`)));
}
return conditions;
}
async getUserByMail(email: string) {
async getUserByMail(email: string, jwtuser?: JwtUser) {
const users = (await this.conn
.select()
.from(schema.users)
.where(sql`email = ${email}`)) as User[];
const user = users[0];
user.hasCompanyLogo = this.fileService.hasCompanyLogo(emailToDirName(user.email));
user.hasProfile = this.fileService.hasProfile(emailToDirName(user.email));
return user;
if (users.length === 0) {
const user: User = { email, firstname: jwtuser.firstname, lastname: jwtuser.lastname, customerType: 'buyer' };
this.saveUser(user);
return user;
} else {
const user = users[0];
user.hasCompanyLogo = this.fileService.hasCompanyLogo(emailToDirName(user.email));
user.hasProfile = this.fileService.hasProfile(emailToDirName(user.email));
return user;
}
}
async getUserById(id: string) {
const users = (await this.conn
.select()
.from(schema.users)
.where(sql`id = ${id}`)) as User[];
const user = users[0];
user.hasCompanyLogo = this.fileService.hasCompanyLogo(emailToDirName(user.email));
user.hasProfile = this.fileService.hasProfile(emailToDirName(user.email));