feat: gift journeys

This commit is contained in:
Abdalhamid Alhamad
2024-12-22 16:34:02 +03:00
parent 4cef58580e
commit 5e9e83cb74
28 changed files with 656 additions and 1 deletions

View File

@ -0,0 +1,76 @@
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Roles } from '~/auth/enums';
import { IJwtPayload } from '~/auth/interfaces';
import { CreateGiftRequestDto, GiftFiltersRequestDto, GiftReplyRequestDto } from '../dtos/request';
import { Gift, GiftRedemption, GiftReply } from '../entities';
import { GiftStatus } from '../enums';
const ONE = 1;
@Injectable()
export class GiftsRepository {
constructor(@InjectRepository(Gift) private readonly giftsRepository: Repository<Gift>) {}
create(guardianId: string, gift: CreateGiftRequestDto): Promise<Gift> {
return this.giftsRepository.save(
this.giftsRepository.create({
name: gift.name,
description: gift.description,
amount: gift.amount,
recipientId: gift.recipientId,
imageId: gift.imageId,
color: gift.color,
giverId: guardianId,
}),
);
}
findJuniorGiftById(juniorId: string, giftId: string): Promise<Gift | null> {
return this.giftsRepository.findOne({
where: { recipientId: juniorId, id: giftId },
relations: ['recipient', 'recipient.customer', 'image', 'giver', 'giver.customer', 'reply'],
});
}
findGuardianGiftById(guardianId: string, giftId: string): Promise<Gift | null> {
return this.giftsRepository.findOne({
where: { giverId: guardianId, id: giftId },
relations: ['recipient', 'recipient.customer', 'image', 'giver', 'giver.customer', 'reply'],
});
}
findGifts(user: IJwtPayload, filters: GiftFiltersRequestDto) {
const query = this.giftsRepository.createQueryBuilder('gift');
if (user.roles.includes(Roles.GUARDIAN)) {
query.where('gift.giverId = :giverId', { giverId: user.sub });
} else {
query.where('gift.recipientId = :recipientId', { recipientId: user.sub });
}
query.andWhere('gift.status = :status', { status: filters.status });
query.skip((filters.page - ONE) * filters.size);
query.take(filters.size);
query.orderBy('gift.createdAt', 'DESC');
return query.getManyAndCount();
}
redeemGift(gift: Gift) {
const redemptions = gift.redemptions || [];
gift.status = GiftStatus.REDEEMED;
gift.redeemedAt = new Date();
gift.redemptions = [...redemptions, new GiftRedemption()];
return this.giftsRepository.save(gift);
}
UndoGiftRedemption(gift: Gift) {
gift.status = GiftStatus.AVAILABLE;
gift.redeemedAt = null;
return this.giftsRepository.save(gift);
}
replyToGift(gift: Gift, reply: GiftReplyRequestDto) {
gift.reply = GiftReply.create({ ...reply });
return this.giftsRepository.save(gift);
}
}