Skip to content

Commit

Permalink
Merge pull request #53 from VentionCapstone/feature/114_wishlist
Browse files Browse the repository at this point in the history
Feature/114 wishlist
  • Loading branch information
MdRasulov committed Jan 19, 2024
2 parents 5862c20 + 19568da commit 623bcea
Show file tree
Hide file tree
Showing 24 changed files with 370 additions and 33 deletions.
14 changes: 14 additions & 0 deletions prisma/migrations/20240118052325_wishlist/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
-- CreateTable
CREATE TABLE "Wishlist" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"accommodationId" TEXT NOT NULL,

CONSTRAINT "Wishlist_pkey" PRIMARY KEY ("id")
);

-- AddForeignKey
ALTER TABLE "Wishlist" ADD CONSTRAINT "Wishlist_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Wishlist" ADD CONSTRAINT "Wishlist_accommodationId_fkey" FOREIGN KEY ("accommodationId") REFERENCES "Accommodation"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Wishlist" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP;
23 changes: 17 additions & 6 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ model User {
booking Booking[]
review Review[]
notifications Notification[]
Wishlist Wishlist[]
}

model UserProfile {
Expand Down Expand Up @@ -46,7 +47,7 @@ model Booking {
}

model Accommodation {
id String @id @default(uuid())
id String @id @default(uuid())
title String
addressId String
thumbnailUrl String?
Expand All @@ -55,18 +56,19 @@ model Accommodation {
numberOfRooms Int
price Int
allowedNumberOfPeople Int
available Boolean @default(true)
availableFrom DateTime @default(dbgenerated("CURRENT_DATE")) @db.Date
availableTo DateTime @db.Date
available Boolean @default(true)
availableFrom DateTime @default(dbgenerated("CURRENT_DATE")) @db.Date
availableTo DateTime @db.Date
timezoneOffset Int
description String?
previewImgUrl String?
isDeleted Boolean @default(false)
address Address @relation(fields: [addressId], references: [id], onDelete: Cascade)
isDeleted Boolean @default(false)
address Address @relation(fields: [addressId], references: [id], onDelete: Cascade)
amenities Amenity[]
media Media[]
reviews Review[]
booking Booking[]
Wishlist Wishlist[]
}

model Amenity {
Expand Down Expand Up @@ -140,6 +142,15 @@ model Review {
booking Booking @relation(fields: [bookingId], references: [id])
}

model Wishlist {
id String @id @default(uuid())
userId String
accommodationId String
createdAt DateTime @default(now())
user User @relation(fields: [userId], references: [id])
accommodation Accommodation @relation(fields: [accommodationId], references: [id])
}

enum Role {
USER
ADMIN
Expand Down
10 changes: 6 additions & 4 deletions src/app.module.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
import { Logger, Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AcceptLanguageResolver, I18nModule, QueryResolver } from 'nestjs-i18n';
import * as path from 'path';
import { AccommodationModule } from './accommodation/accommodation.module';
import { AmenitiesModule } from './amenities/amenities.module';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AuthModule } from './auth/auth.module';
import { BookingModule } from './booking/booking.module';
import { UserModule } from './user/user.module';
import { HealthModule } from './health-check/health.module';
import { PaymentModule } from './payment/payment.module';
import { StripeModule } from './stripe/stripe.module';
import { ReviewsModule } from './reviews/reviews.module';
import * as path from 'path';
import { AcceptLanguageResolver, I18nModule, QueryResolver } from 'nestjs-i18n';
import { StripeModule } from './stripe/stripe.module';
import { UserModule } from './user/user.module';
import { WishlistModule } from './wishlist/wishlist.module';

@Module({
imports: [
Expand Down Expand Up @@ -43,6 +44,7 @@ import { AcceptLanguageResolver, I18nModule, QueryResolver } from 'nestjs-i18n';
PaymentModule,
StripeModule,
ReviewsModule,
WishlistModule,
],
controllers: [AppController],
providers: [AppService, Logger],
Expand Down
7 changes: 7 additions & 0 deletions src/errors/errors.enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,13 @@ enum ErrorsTypes {
// Validation
BAD_REQUEST_INVALID_PHONE_NUMBER = 'BAD_REQUEST_INVALID_PHONE_NUMBER',
BAD_REQUEST_INVALID_DATE_RANGE = 'BAD_REQUEST_INVALID_DATE_RANGE',

//Wishlist module
CONFLICT_ALREADY_ADDED_TO_WISHLIST = 'CONFLICT_ALREADY_ADDED_TO_WISHLIST',
WISHLIST_FAILED_TO_GET_LIST = 'WISHLIST_FAILED_TO_GET_LIST',
WISHLIST_FAILED_TO_ADD = 'WISHLIST_FAILED_TO_ADD',
WISHLIST_FAILED_TO_FIND = 'WISHLIST_FAILED_TO_FIND',
WISHLIST_FAILED_TO_DELETE = 'WISHLIST_FAILED_TO_DELETE',
}

export default ErrorsTypes;
7 changes: 6 additions & 1 deletion src/i18n/de/errors.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,5 +81,10 @@
"HOST_PROFILE_FAILED_TO_GET": "Hostprofil konnte nicht abgerufen werden",
"REVIEWS_FAILED_TO_GET_LIST": "Bewertungsliste konnte nicht abgerufen werden",
"BAD_REQUEST_INVALID_DATE_RANGE": "Der Datumsbereich ist ungültig",
"BAD_REQUEST_BOOKING_NOT_AVAILABLE": "Die Unterkunft ist vorübergehend nicht buchbar"
"BAD_REQUEST_BOOKING_NOT_AVAILABLE": "Die Unterkunft ist vorübergehend nicht buchbar",
"CONFLICT_ALREADY_ADDED_TO_WISHLIST": "Die Unterkunft wurde bereits zur Wunschliste hinzugefügt",
"WISHLIST_FAILED_TO_GET_LIST": "Fehler beim Abrufen der Unterkünfte von der Wunschliste",
"WISHLIST_FAILED_TO_ADD": "Fehler beim Hinzufügen zur Wunschliste",
"WISHLIST_FAILED_TO_FIND": "Fehler beim Suchen in der Wunschliste",
"WISHLIST_FAILED_TO_DELETE": "Fehler beim Löschen von der Wunschliste"
}
9 changes: 6 additions & 3 deletions src/i18n/de/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
"USER_PROFILE_DELETE_SUCCESS": "Profil erfolgreich gelöscht",

"BOOKING_PAYMENT_SUCCESS": "Zahlung erfolgreich verarbeitet",
"BOOKING_PAYMENT_PROCESSING": "Ihre Zahlung wird verarbeitet.",
"BOOKING_PAYMENT_REQUEIRED_METHOD": "Ihre Zahlung war nicht erfolgreich, bitte versuchen Sie es erneut.",
"BOOKING_PAYMENT_FAILED": "Etwas ist schiefgelaufen."
"BOOKING_PAYMENT_PROCESSING": "Ihre Zahlung wird verarbeitet",
"BOOKING_PAYMENT_REQUEIRED_METHOD": "Ihre Zahlung war nicht erfolgreich, bitte versuchen Sie es erneut",
"BOOKING_PAYMENT_FAILED": "Etwas ist schiefgelaufen",

"WISHLIST_ADD_SUCCESS": "Unterkunft erfolgreich zur Wunschliste hinzugefügt",
"WISHLIST_DELETE_SUCCESS": "Unterkunft erfolgreich von der Wunschliste gelöscht"
}
7 changes: 6 additions & 1 deletion src/i18n/en/errors.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,5 +81,10 @@
"HOST_PROFILE_FAILED_TO_GET": "Failed to get host profile",
"REVIEWS_FAILED_TO_GET_LIST": "Failed to get reviews list",
"BAD_REQUEST_INVALID_DATE_RANGE": "Date range is invalid",
"BAD_REQUEST_BOOKING_NOT_AVAILABLE": "Accommodation is temporarily unavailable for booking"
"BAD_REQUEST_BOOKING_NOT_AVAILABLE": "Accommodation is temporarily unavailable for booking",
"CONFLICT_ALREADY_ADDED_TO_WISHLIST": "Accommodation is already added to wishlist",
"WISHLIST_FAILED_TO_GET_LIST": "Failed to get accommodations from wishlist",
"WISHLIST_FAILED_TO_ADD": "Failed to add to wishlist",
"WISHLIST_FAILED_TO_FIND": "Failed to find from wishlist",
"WISHLIST_FAILED_TO_DELETE": "Failed to deleted from wishlist"
}
9 changes: 6 additions & 3 deletions src/i18n/en/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
"USER_PROFILE_DELETE_SUCCESS": "Profile successfully deleted",

"BOOKING_PAYMENT_SUCCESS": "Payment processed successfully",
"BOOKING_PAYMENT_PROCESSING": "Your payment is processing.",
"BOOKING_PAYMENT_REQUEIRED_METHOD": "Your payment was not successful, please try again.",
"BOOKING_PAYMENT_FAILED": "Something went wrong."
"BOOKING_PAYMENT_PROCESSING": "Your payment is processing",
"BOOKING_PAYMENT_REQUEIRED_METHOD": "Your payment was not successful, please try again",
"BOOKING_PAYMENT_FAILED": "Something went wrong",

"WISHLIST_ADD_SUCCESS": "Accommodation is added to wishlist successfully",
"WISHLIST_DELETE_SUCCESS": "Accommodation is deleted from wishlist successfully"
}
7 changes: 6 additions & 1 deletion src/i18n/kz/errors.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,5 +81,10 @@
"HOST_PROFILE_FAILED_TO_GET": "Хост профилін алу мүмкін болмады",
"REVIEWS_FAILED_TO_GET_LIST": "Пікірлер тізімін алу мүмкін болмады",
"BAD_REQUEST_INVALID_DATE_RANGE": "Күндер ауқымы жарамсыз",
"BAD_REQUEST_BOOKING_NOT_AVAILABLE": "Брондау үшін тұру уақытша қолжетімсіз"
"BAD_REQUEST_BOOKING_NOT_AVAILABLE": "Брондау үшін тұру уақытша қолжетімсіз",
"CONFLICT_ALREADY_ADDED_TO_WISHLIST": "Нысан тілектер тізіміне қосылды",
"WISHLIST_FAILED_TO_GET_LIST": "Тілектер тізімінен объектілерді алу мүмкін болмады",
"WISHLIST_FAILED_TO_ADD": "Тілектер тізіміне қосу мүмкін болмады",
"WISHLIST_FAILED_TO_FIND": "Тілектер тізімінен табу мүмкін болмады",
"WISHLIST_FAILED_TO_DELETE": "Тілектер тізімінен жою мүмкін болмады"
}
9 changes: 6 additions & 3 deletions src/i18n/kz/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
"USER_PROFILE_DELETE_SUCCESS": "Профиль сәтті жойылды",

"BOOKING_PAYMENT_SUCCESS": "Төлем сәтті өңделді",
"BOOKING_PAYMENT_PROCESSING": "Сіздің төлемі өңделуде.",
"BOOKING_PAYMENT_REQUEIRED_METHOD": "Сіздің төлеміңіз сәтті атталмады, қайталап көріңіз.",
"BOOKING_PAYMENT_FAILED": "Көмек көрсету қажет."
"BOOKING_PAYMENT_PROCESSING": "Сіздің төлемі өңделуде",
"BOOKING_PAYMENT_REQUEIRED_METHOD": "Сіздің төлеміңіз сәтті атталмады, қайталап көріңіз",
"BOOKING_PAYMENT_FAILED": "Көмек көрсету қажет",

"WISHLIST_ADD_SUCCESS": "Нысан сәтті тілектер тізіміне қосылды",
"WISHLIST_DELETE_SUCCESS": "Нысан тілектер тізімінен сәтті жойылды"
}
7 changes: 6 additions & 1 deletion src/i18n/ru/errors.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,5 +81,10 @@
"HOST_PROFILE_FAILED_TO_GET": "Не удалось получить профиль хоста",
"REVIEWS_FAILED_TO_GET_LIST": "Не удалось получить список отзывов.",
"BAD_REQUEST_INVALID_DATE_RANGE": "Недопустимый диапазон дат",
"BAD_REQUEST_BOOKING_NOT_AVAILABLE": "Апартамент временно недоступен для бронирования"
"BAD_REQUEST_BOOKING_NOT_AVAILABLE": "Апартамент временно недоступен для бронирования",
"CONFLICT_ALREADY_ADDED_TO_WISHLIST": "Размещение уже добавлено в список желаний",
"WISHLIST_FAILED_TO_GET_LIST": "Не удалось получить список желаний",
"WISHLIST_FAILED_TO_ADD": "Не удалось добавить в список желаний",
"WISHLIST_FAILED_TO_FIND": "Не удалось найти в списке желаний",
"WISHLIST_FAILED_TO_DELETE": "Не удалось удалить из списка желаний"
}
9 changes: 6 additions & 3 deletions src/i18n/ru/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
"USER_PROFILE_DELETE_SUCCESS": "Профиль успешно удален",

"BOOKING_PAYMENT_SUCCESS": "Оплата успешно обработана",
"BOOKING_PAYMENT_PROCESSING": "Ваш платеж обрабатывается.",
"BOOKING_PAYMENT_REQUEIRED_METHOD": "Ваш платеж не был успешным, пожалуйста, попробуйте еще раз.",
"BOOKING_PAYMENT_FAILED": "Что-то пошло не так."
"BOOKING_PAYMENT_PROCESSING": "Ваш платеж обрабатывается",
"BOOKING_PAYMENT_REQUEIRED_METHOD": "Ваш платеж не был успешным, пожалуйста, попробуйте еще раз",
"BOOKING_PAYMENT_FAILED": "Что-то пошло не так",

"WISHLIST_ADD_SUCCESS": "Размещение успешно добавлено в список желаний",
"WISHLIST_DELETE_SUCCESS": "Размещение успешно удалено из списка желаний"
}
7 changes: 6 additions & 1 deletion src/i18n/uz/errors.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,5 +81,10 @@
"HOST_PROFILE_FAILED_TO_GET": "Xost profilini olib bo'lmadi",
"REVIEWS_FAILED_TO_GET_LIST": "Sharhlar ro'yxatini olib bo'lmadi",
"BAD_REQUEST_INVALID_DATE_RANGE": "Sana oralig‘i noto‘g‘ri",
"BAD_REQUEST_BOOKING_NOT_AVAILABLE": "Turar joyni vaqtinchalik bron qilib bo'lmaydi"
"BAD_REQUEST_BOOKING_NOT_AVAILABLE": "Turar joyni vaqtinchalik bron qilib bo'lmaydi",
"CONFLICT_ALREADY_ADDED_TO_WISHLIST": "Turar joy allaqachon xohish ro'yxatiga qo'shilgan",
"WISHLIST_FAILED_TO_GET_LIST": "Xohish ro'yxatidan turar joylarni olishda xatolik",
"WISHLIST_FAILED_TO_ADD": "Xohish ro'yxatiga qo'shishda xatolik",
"WISHLIST_FAILED_TO_FIND": "Xohish ro'yxatidan topilmadi",
"WISHLIST_FAILED_TO_DELETE": "Xohish ro'yxatidan o'chirishda xatolik"
}
9 changes: 6 additions & 3 deletions src/i18n/uz/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
"USER_PROFILE_DELETE_SUCCESS": "Foydalanuvchi muvaffaqiyatli o'chirildi",

"BOOKING_PAYMENT_SUCCESS": "To'lov muvaffaqiyatli amalga oshirildi",
"BOOKING_PAYMENT_PROCESSING": "Sizning to'lovingiz amalga oshirilmoqda.",
"BOOKING_PAYMENT_REQUEIRED_METHOD": "Sizning to'lovingiz muvaffaqiyatsiz bo'ldi, iltimos, qayta urinib ko'ring.",
"BOOKING_PAYMENT_FAILED": "Nimadir noto'g'ri ketdi."
"BOOKING_PAYMENT_PROCESSING": "Sizning to'lovingiz amalga oshirilmoqda",
"BOOKING_PAYMENT_REQUEIRED_METHOD": "Sizning to'lovingiz muvaffaqiyatsiz bo'ldi, iltimos, qayta urinib ko'ring",
"BOOKING_PAYMENT_FAILED": "Nimadir noto'g'ri ketdi",

"WISHLIST_ADD_SUCCESS": "Turar joy muvaffaqiyatli istak ro'yxatiga qo'shildi",
"WISHLIST_DELETE_SUCCESS": "Turar joy istak ro'yxatidan muvaffaqiyatli o'chirildi"
}
3 changes: 3 additions & 0 deletions src/messages/messages.enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ enum MessagesTypes {
BOOKING_PAYMENT_PROCESSING = 'BOOKING_PAYMENT_PROCESSING',
BOOKING_PAYMENT_REQUEIRED_METHOD = 'BOOKING_PAYMENT_REQUEIRED_METHOD',
BOOKING_PAYMENT_FAILED = 'BOOKING_PAYMENT_FAILED',

WISHLIST_ADD_SUCCESS = 'WISHLIST_ADD_SUCCESS',
WISHLIST_DELETE_SUCCESS = 'WISHLIST_DELETE_SUCCESS',
}

export default MessagesTypes;
6 changes: 3 additions & 3 deletions src/reviews/reviews.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export class ReviewsService {

async createReview(createReviewBody: any, bookingId: string) {
try {
const bookking = await this.prisma.booking.findUnique({
const booking = await this.prisma.booking.findUnique({
where: {
id: bookingId,
userId: createReviewBody.userId,
Expand All @@ -48,10 +48,10 @@ export class ReviewsService {
},
});

if (!bookking) throw new NotFoundException(ErrorsTypes.NOT_FOUND_BOOKING);
if (!booking) throw new NotFoundException(ErrorsTypes.NOT_FOUND_BOOKING);

const currentDate = dayjs();
const bookingEndDate = dayjs(bookking?.endDate);
const bookingEndDate = dayjs(booking?.endDate);

if (!currentDate.isAfter(bookingEndDate, 'day'))
throw new BadRequestException(ErrorsTypes.BAD_REQUEST_REVIEW_ONLY_AFTER_THE_BOOKING_END);
Expand Down
29 changes: 29 additions & 0 deletions src/wishlist/dto/wishlist-response.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
class Accommodation {
id: string;
thumbnailUrl: string;
squareMeters: number;
numberOfRooms: number;
allowedNumberOfPeople: number;
price: number;
address: {
street: string;
city: string;
country: string;
};
}

class Wishlist {
id: string;
createdAt: string;
accommodation: Accommodation;
}

export class WishlisResponse {
success: boolean;
message: string;
}

export class WishlistResponseDto {
success: boolean;
data: Wishlist[];
}
1 change: 1 addition & 0 deletions src/wishlist/entities/wishlist.entity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export class Wishlist {}
20 changes: 20 additions & 0 deletions src/wishlist/wishlist.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Test, TestingModule } from '@nestjs/testing';
import { WishlistController } from './wishlist.controller';
import { WishlistService } from './wishlist.service';

describe('WishlistController', () => {
let controller: WishlistController;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [WishlistController],
providers: [WishlistService],
}).compile();

controller = module.get<WishlistController>(WishlistController);
});

it('should be defined', () => {
expect(controller).toBeDefined();
});
});
Loading

0 comments on commit 623bcea

Please sign in to comment.