import { FilterTasks } from "@/server/task/domain/models";
import { UserId, User, UserById, SendInvitation } from "../domain/models";
import { UserFacade, UserService } from "./service-definition";
import { defaultUserService } from "./user-service-impl";
import { generateToken, setCookie, VARIABLES_CONFIG } from "@/lib/db/util";
class UserFacadeImpl implements UserFacade {
constructor(private userService: UserService) {}
getAllUsers(userId: UserId): Promise<User[]> {
return this.userService.getAllUsers(userId);
}
async getUserWithTaskById(
userId: UserId,
filter: FilterTasks
): Promise<UserById> {
try {
return await this.userService.getUserWithTaskById(userId, filter);
} catch (error) {
console.log("err user", error);
throw new Error("error geting user by id");
}
}
async findOrCreateUser(user:User): Promise<User> {
try {
const existingUser = await this.userService.findOrCreateUser(user);
if (existingUser && !user?.existInDb) {
await this.userService.updateUserMetadataClerk({seccionId:user?.id,existInDb:true,rol:existingUser.rol as any})
}
const exp = 3600000;
const payload = {
id: existingUser?.id,
role: user?.rol,
exp:exp
};
const token = generateToken(payload,exp)
setCookie(VARIABLES_CONFIG.VERIFICATION_TOKEN!, token,{maxAge:exp/1000})
return existingUser;
} catch (error) {
console.log('error finding or creating user db',error)
throw new Error("Error finding or creating user");
}
}
async getUserById(userId: UserId): Promise<User> {
try {
return await this.userService.getUserById(userId);
} catch (error) {
throw new Error("Error getting user");
}
}
async createUserDb(data: User): Promise<User> {
try {
return await this.userService.createUserDb(data);
} catch (error) {
throw error;
}
}
async sendInvitation(data: SendInvitation): Promise<void> {
try {
return await this.userService.sendInvitation(data);
} catch (error) {
throw error;
}
}
async updateUserDb(data: User): Promise<User> {
try {
return await this.userService.updateUserDb(data);
} catch (error) {
throw error
}
}
updateUserClerk(data: User): Promise<User> {
return this.userService.updateUserClerk(data);
}
async banUser(userId: UserId): Promise<void> {
try {
await this.userService.banUser(userId);
} catch (error) {
throw new Error("Error banning user");
}
}
async unbanUser(userId: UserId): Promise<void> {
try {
await this.userService.unbanUser(userId);
} catch (error) {
throw new Error("Error unbanning user");
}
}
async deleteUserDb(userId: UserId): Promise<User> {
try {
return await this.userService.deleteUserDb(userId);
} catch (error) {
console.log('error deleting user',error)
throw new Error("Error deleting user");
}
}
async deleteUserClerk(userId: UserId): Promise<void> {
try {
return await this.userService.deleteUserClerk(userId);
} catch (error) {
throw new Error("Error deleting user");
}
}
}
export const userFacadeService = new UserFacadeImpl(defaultUserService);