chore: get announcements for customers
This commit is contained in:
@@ -171,6 +171,7 @@ export const enum AnnouncementMessage {
|
|||||||
PUBLISH_AT_IS_REQUIRED = "تاریخ انتشار اطلاعیه مورد نیاز است",
|
PUBLISH_AT_IS_REQUIRED = "تاریخ انتشار اطلاعیه مورد نیاز است",
|
||||||
SERVICE_MUST_BE_UUID = "شناسه سرویس باید یک UUID معتبر باشد",
|
SERVICE_MUST_BE_UUID = "شناسه سرویس باید یک UUID معتبر باشد",
|
||||||
GROUP_MUST_BE_UUID = "شناسه گروه کاربران باید یک UUID معتبر باشد",
|
GROUP_MUST_BE_UUID = "شناسه گروه کاربران باید یک UUID معتبر باشد",
|
||||||
|
USER_MUST_BE_UUID = "شناسه کاربر باید یک UUID معتبر باشد",
|
||||||
SERVICE_MUST_BE_ID = "ایدی سرویس اجباری است",
|
SERVICE_MUST_BE_ID = "ایدی سرویس اجباری است",
|
||||||
NOT_FOUND = "اطلاعیه ای با این ایدی یافت نشد",
|
NOT_FOUND = "اطلاعیه ای با این ایدی یافت نشد",
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,4 +61,17 @@ export class CreateAnnouncementDto {
|
|||||||
example: ["f7b1b3b1-1b1b-4b1b-8b1b-1b1b1b1b1b1b"],
|
example: ["f7b1b3b1-1b1b-4b1b-8b1b-1b1b1b1b1b1b"],
|
||||||
})
|
})
|
||||||
groupIds: string[];
|
groupIds: string[];
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@IsArray()
|
||||||
|
@IsUUID("4", {
|
||||||
|
each: true,
|
||||||
|
message: AnnouncementMessage.USER_MUST_BE_UUID,
|
||||||
|
})
|
||||||
|
@ApiProperty({
|
||||||
|
type: [String],
|
||||||
|
description: "Array of users ids",
|
||||||
|
example: ["f7b1b3b1-1b1b-4b1b-8b1b-1b1b1b1b1b1b"],
|
||||||
|
})
|
||||||
|
userIds: string[];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { Column, Entity, Index, ManyToMany, ManyToOne, OneToMany } from "typeorm";
|
import { Column, Entity, Index, JoinTable, ManyToMany, ManyToOne, OneToMany } from "typeorm";
|
||||||
|
|
||||||
import { UserAnnouncement } from "./user-announcement.entity";
|
import { UserAnnouncement } from "./user-announcement.entity";
|
||||||
import { BaseEntity } from "../../../common/entities/base.entity";
|
import { BaseEntity } from "../../../common/entities/base.entity";
|
||||||
import { DanakService } from "../../danak-services/entities/danak-service.entity";
|
import { DanakService } from "../../danak-services/entities/danak-service.entity";
|
||||||
import { UserGroup } from "../../users/entities/user-group.entity";
|
import { UserGroup } from "../../users/entities/user-group.entity";
|
||||||
|
import { User } from "../../users/entities/user.entity";
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
@Index(["isPublic", "createdAt"])
|
@Index(["isPublic", "createdAt"])
|
||||||
@@ -34,6 +35,10 @@ export class Announcement extends BaseEntity {
|
|||||||
return this.isPublic;
|
return this.isPublic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ManyToMany(() => User, (user) => user.announcements)
|
||||||
|
@JoinTable({ name: "announcement_users" })
|
||||||
|
users: User[];
|
||||||
|
|
||||||
@OneToMany(() => UserAnnouncement, (userAnnouncement) => userAnnouncement.announcement)
|
@OneToMany(() => UserAnnouncement, (userAnnouncement) => userAnnouncement.announcement)
|
||||||
userAnnouncements: UserAnnouncement[];
|
userAnnouncements: UserAnnouncement[];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,18 +22,24 @@ export class AnnouncementService {
|
|||||||
async createAnnouncement(createAnnouncementDto: CreateAnnouncementDto) {
|
async createAnnouncement(createAnnouncementDto: CreateAnnouncementDto) {
|
||||||
let service;
|
let service;
|
||||||
let groups;
|
let groups;
|
||||||
|
let users;
|
||||||
if (createAnnouncementDto.serviceId) {
|
if (createAnnouncementDto.serviceId) {
|
||||||
service = await this.danakServicesService.findServiceById(createAnnouncementDto.serviceId);
|
service = await this.danakServicesService.findServiceById(createAnnouncementDto.serviceId);
|
||||||
}
|
}
|
||||||
if (createAnnouncementDto.groupIds) {
|
if (createAnnouncementDto.groupIds) {
|
||||||
groups = await this.usersService.getUserGroupsByIds(createAnnouncementDto.groupIds);
|
groups = await this.usersService.getUserGroupsByIds(createAnnouncementDto.groupIds);
|
||||||
}
|
}
|
||||||
|
if (createAnnouncementDto.userIds) {
|
||||||
|
users = await this.usersService.getUsersByIds(createAnnouncementDto.userIds);
|
||||||
|
}
|
||||||
//TODO: Create Queue for publishAT
|
//TODO: Create Queue for publishAT
|
||||||
const announcement = this.announcementRepository.create({
|
const announcement = this.announcementRepository.create({
|
||||||
...createAnnouncementDto,
|
...createAnnouncementDto,
|
||||||
service,
|
service,
|
||||||
targetGroups: groups?.userGroups,
|
targetGroups: groups?.userGroups,
|
||||||
|
users,
|
||||||
});
|
});
|
||||||
|
|
||||||
await this.announcementRepository.save(announcement);
|
await this.announcementRepository.save(announcement);
|
||||||
return {
|
return {
|
||||||
message: CommonMessage.CREATED,
|
message: CommonMessage.CREATED,
|
||||||
@@ -134,6 +140,7 @@ export class AnnouncementService {
|
|||||||
.createQueryBuilder("announcement")
|
.createQueryBuilder("announcement")
|
||||||
.leftJoin("announcement.service", "service")
|
.leftJoin("announcement.service", "service")
|
||||||
.addSelect(["service.id", "service.name"])
|
.addSelect(["service.id", "service.name"])
|
||||||
|
.leftJoin("announcement.users", "announcementUser")
|
||||||
.leftJoin("announcement.targetGroups", "group")
|
.leftJoin("announcement.targetGroups", "group")
|
||||||
.addSelect(["group.id", "group.name"])
|
.addSelect(["group.id", "group.name"])
|
||||||
.leftJoin("group.users", "groupUser")
|
.leftJoin("group.users", "groupUser")
|
||||||
@@ -147,7 +154,8 @@ export class AnnouncementService {
|
|||||||
.leftJoinAndSelect("announcement.userAnnouncements", "userAnnouncements", "userAnnouncements.userId = :userId", { userId })
|
.leftJoinAndSelect("announcement.userAnnouncements", "userAnnouncements", "userAnnouncements.userId = :userId", { userId })
|
||||||
.where("announcement.isPublic = :isPublic", { isPublic: true })
|
.where("announcement.isPublic = :isPublic", { isPublic: true })
|
||||||
.orWhere("groupUser.id = :userId", { userId })
|
.orWhere("groupUser.id = :userId", { userId })
|
||||||
.orWhere("userSubscription.userId = :userId", { userId });
|
.orWhere("userSubscription.userId = :userId", { userId })
|
||||||
|
.orWhere("announcementUser.id = :userId", { userId });
|
||||||
|
|
||||||
if (queryDto.since) {
|
if (queryDto.since) {
|
||||||
queryBuilder.andWhere("announcement.createdAt >= :since", { since: queryDto.since });
|
queryBuilder.andWhere("announcement.createdAt >= :since", { since: queryDto.since });
|
||||||
@@ -164,7 +172,7 @@ export class AnnouncementService {
|
|||||||
queryBuilder.orderBy("announcement.createdAt", "DESC");
|
queryBuilder.orderBy("announcement.createdAt", "DESC");
|
||||||
const rawResults = await queryBuilder.getRawMany();
|
const rawResults = await queryBuilder.getRawMany();
|
||||||
const [, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount();
|
const [, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount();
|
||||||
|
//TODO: fix later
|
||||||
const announcements = rawResults.map((raw) => ({
|
const announcements = rawResults.map((raw) => ({
|
||||||
id: raw.announcement_id,
|
id: raw.announcement_id,
|
||||||
createdAt: raw.announcement_createdAt,
|
createdAt: raw.announcement_createdAt,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { UserGroup } from "./user-group.entity";
|
|||||||
import { BaseEntity } from "../../../common/entities/base.entity";
|
import { BaseEntity } from "../../../common/entities/base.entity";
|
||||||
import { Address } from "../../address/entities/address.entity";
|
import { Address } from "../../address/entities/address.entity";
|
||||||
import { City } from "../../address/entities/city.entity";
|
import { City } from "../../address/entities/city.entity";
|
||||||
|
import { Announcement } from "../../announcements/entities/announcement.entity";
|
||||||
import { UserAnnouncement } from "../../announcements/entities/user-announcement.entity";
|
import { UserAnnouncement } from "../../announcements/entities/user-announcement.entity";
|
||||||
import { Criticism } from "../../criticisms/entities/criticism.entity";
|
import { Criticism } from "../../criticisms/entities/criticism.entity";
|
||||||
import { DanakServiceReview } from "../../danak-services/entities/danak-service-review.entity";
|
import { DanakServiceReview } from "../../danak-services/entities/danak-service-review.entity";
|
||||||
@@ -127,6 +128,9 @@ export class User extends BaseEntity {
|
|||||||
|
|
||||||
@ManyToMany(() => UsageDiscount, (usageDiscount) => usageDiscount.users)
|
@ManyToMany(() => UsageDiscount, (usageDiscount) => usageDiscount.users)
|
||||||
usageDiscounts: UsageDiscount[];
|
usageDiscounts: UsageDiscount[];
|
||||||
|
|
||||||
|
@ManyToMany(() => Announcement, (announcement) => announcement.users)
|
||||||
|
announcements: Announcement[];
|
||||||
}
|
}
|
||||||
|
|
||||||
// @ManyToMany(() => DanakService, (danakService) => danakService.users)
|
// @ManyToMany(() => DanakService, (danakService) => danakService.users)
|
||||||
|
|||||||
@@ -363,6 +363,14 @@ export class UsersService {
|
|||||||
|
|
||||||
///****************************************************** */
|
///****************************************************** */
|
||||||
|
|
||||||
|
async getUsersByIds(ids: string[]) {
|
||||||
|
const users = await this.userRepository.find({ where: { id: In(ids) } });
|
||||||
|
if (!users) throw new BadRequestException(UserMessage.USER_NOT_FOUND);
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
|
||||||
|
///****************************************************** */
|
||||||
|
|
||||||
async updateUserPassword(userId: string, newPassword: string) {
|
async updateUserPassword(userId: string, newPassword: string) {
|
||||||
const updatedUser = await this.userRepository.update(
|
const updatedUser = await this.userRepository.update(
|
||||||
{ id: userId },
|
{ id: userId },
|
||||||
|
|||||||
Reference in New Issue
Block a user