From c38f2de9c4bca06723a8781b581cff1e3d13e629 Mon Sep 17 00:00:00 2001 From: alireza Date: Tue, 9 Jun 2026 01:30:12 +0330 Subject: [PATCH] feat: add Announcement service with GetAnnouncements and SendAnnouncement --- .../Services/AnnouncementService.cs | 99 +++++++++++++++++++ .../Controllers/AnnouncementController.cs | 34 +++++++ 2 files changed, 133 insertions(+) create mode 100644 Complex.Application/Services/AnnouncementService.cs create mode 100644 Complex.EndPoint/Controllers/AnnouncementController.cs diff --git a/Complex.Application/Services/AnnouncementService.cs b/Complex.Application/Services/AnnouncementService.cs new file mode 100644 index 0000000..15dee36 --- /dev/null +++ b/Complex.Application/Services/AnnouncementService.cs @@ -0,0 +1,99 @@ +using Complex.Application; +using Complex.Common.Dto; +using Complex.Domain.Entities; +using Microsoft.EntityFrameworkCore; + +namespace Complex.Application.Services.Announcement +{ + public interface IAnnouncementService + { + ResultDto> GetAnnouncements(Guid complexId, int page = 1, int pageSize = 20); + ResultDto SendAnnouncement(Guid complexId, string body, byte? chatTypeId, string userPhone); + } + + public class AnnouncementService : IAnnouncementService + { + private readonly IComplexDBContext _complexDBContext; + + public AnnouncementService(IComplexDBContext complexDBContext) + { + _complexDBContext = complexDBContext; + } + + public ResultDto> GetAnnouncements(Guid complexId, int page = 1, int pageSize = 20) + { + var query = _complexDBContext.Chats + .Where(c => c.ComplexId == complexId) + .OrderByDescending(c => c.Id); + + var totalCount = query.Count(); + + var chats = query + .Skip((page - 1) * pageSize) + .Take(pageSize) + .ToList(); + + var result = chats.Select(c => new AnnouncementDto + { + Id = c.Id, + ComplexId = c.ComplexId, + PersonMobileNumber = c.PersonMobileNumber, + Body = c.Body, + ChatTypeId = c.ChatTypeId, + InsertTime = null // InsertTime is set by Auditable attribute in SaveChanges, not a property on Chat entity + }).ToList(); + + return new ResultDto> + { + Data = result, + IsSuccess = true, + RowCount = totalCount + }; + } + + public ResultDto SendAnnouncement(Guid complexId, string body, byte? chatTypeId, string userPhone) + { + var chat = new Chat + { + ComplexId = complexId, + Body = body, + ChatTypeId = chatTypeId ?? 0, + PersonMobileNumber = userPhone + }; + + _complexDBContext.Chats.Add(chat); + _complexDBContext.SaveChanges(); + + return new ResultDto + { + Data = chat.Id, + IsSuccess = true, + Message = "ثبت با موفقیت انجام شد" + }; + } + } + + public class AnnouncementDto + { + public long Id { get; set; } + public Guid ComplexId { get; set; } + public string? PersonMobileNumber { get; set; } + public string? Body { get; set; } + public byte? ChatTypeId { get; set; } + public string? InsertTime { get; set; } + } + + public class AnnouncementListRequest + { + public Guid ComplexId { get; set; } + public int Page { get; set; } = 1; + public int PageSize { get; set; } = 20; + } + + public class SendAnnouncementRequest + { + public Guid ComplexId { get; set; } + public string Body { get; set; } + public byte? ChatTypeId { get; set; } + } +} diff --git a/Complex.EndPoint/Controllers/AnnouncementController.cs b/Complex.EndPoint/Controllers/AnnouncementController.cs new file mode 100644 index 0000000..43f76e4 --- /dev/null +++ b/Complex.EndPoint/Controllers/AnnouncementController.cs @@ -0,0 +1,34 @@ +using Complex.Application.Services.Announcement; +using Complex.Common.Dto; +using Complex.EndPoint.Utility; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Complex.EndPoint.Controllers +{ + [ApiController] + [ApiVersion("1")] + [Route("api/v{version:apiVersion}/[controller]/[action]")] + [Authorize] + public class AnnouncementController : Controller + { + private readonly IAnnouncementService _announcementService; + + public AnnouncementController(IAnnouncementService announcementService) + { + _announcementService = announcementService; + } + + [HttpPost] + public ResultDto> GetAnnouncements(AnnouncementListRequest request) + { + return _announcementService.GetAnnouncements(request.ComplexId, request.Page, request.PageSize); + } + + [HttpPost] + public ResultDto SendAnnouncement(SendAnnouncementRequest request) + { + return _announcementService.SendAnnouncement(request.ComplexId, request.Body, request.ChatTypeId, User.GetUserId()); + } + } +}