diff --git a/Tsi1.Api/Tsi1.Api/Controllers/MessageController.cs b/Tsi1.Api/Tsi1.Api/Controllers/MessageController.cs new file mode 100644 index 0000000000000000000000000000000000000000..b6b03bff80a30dcc58a3874575190b331a4233df --- /dev/null +++ b/Tsi1.Api/Tsi1.Api/Controllers/MessageController.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Tsi1.BusinessLayer.Dtos; +using Tsi1.BusinessLayer.Helpers; +using Tsi1.BusinessLayer.Interfaces; + +namespace Tsi1.Api.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class MessageController : ControllerBase + { + private readonly IMessageService _messageService; + + public MessageController(IMessageService messageService) + { + _messageService = messageService; + } + + + [Authorize(Roles = UserTypes.Student + ", " + UserTypes.Professor)] + [HttpGet("GetMessages/{receiverId}")] + public async Task<ActionResult> GetMessages(int receiverId) + { + var userId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "Id").Value); + + var result = await _messageService.GetMessages(userId, receiverId); + + if (result.HasError) + { + return BadRequest(result.Message); + } + + return Ok(result.Data); + } + + [Authorize(Roles = UserTypes.Student + ", " + UserTypes.Professor)] + [HttpPost("Send")] + public async Task<ActionResult> Send(MessageCreateDto newMessage) + { + var userId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "Id").Value); + + newMessage.SenderId = userId; + + var result = await _messageService.Send(newMessage); + + if (result.HasError) + { + return BadRequest(result.Message); + } + + return Ok(result.Data); + } + + } +} diff --git a/Tsi1.Api/Tsi1.Api/Startup.cs b/Tsi1.Api/Tsi1.Api/Startup.cs index b6a5bffb90f09f6dcd33f75a44df4e413fad6540..c6a4f5f77e219c2b0ef5d769949efae4528551d4 100644 --- a/Tsi1.Api/Tsi1.Api/Startup.cs +++ b/Tsi1.Api/Tsi1.Api/Startup.cs @@ -42,12 +42,14 @@ namespace Tsi1.Api services.AddDbContext<Tsi1Context>(x => x.UseNpgsql(Configuration.GetConnectionString("PostgreSql"))); - services.Configure<ITsi1DatabaseSettings>( + services.Configure<Tsi1DatabaseSettings>( Configuration.GetSection(nameof(Tsi1DatabaseSettings))); - services.AddSingleton<Tsi1DatabaseSettings>(sp => + services.AddSingleton<ITsi1DatabaseSettings>(sp => sp.GetRequiredService<IOptions<Tsi1DatabaseSettings>>().Value); + services.AddSingleton<IMessageService, MessageService>(); + services.AddScoped<IUserService, UserService>(); services.AddScoped<IUserTypeService, UserTypeService>(); services.AddScoped<ICourseService, CourseService>(); diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs index 95ed2d6e8f2f1d2e382d4b27728a71c05f72d58a..4563e7b0d11066b335c2adbb35f37de4732d47e8 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs @@ -18,6 +18,8 @@ namespace Tsi1.BusinessLayer.Helpers CreateMap<Post, PostPreviewDto>(); CreateMap<PostMessage, PostMessageCreateDto>(); CreateMap<PostMessage, PostMessagePreviewDto>(); + CreateMap<Message, MessagePreviewDto>(); + CreateMap<Message, MessageCreateDto>(); CreateMap<ForumCreateDto, Forum>(); CreateMap<ForumPreviewDto, Forum>(); @@ -25,6 +27,8 @@ namespace Tsi1.BusinessLayer.Helpers CreateMap<PostPreviewDto, Post>(); CreateMap<PostMessageCreateDto, PostMessage>(); CreateMap<PostMessagePreviewDto, PostMessage>(); + CreateMap<MessagePreviewDto, Message>(); + CreateMap<MessageCreateDto, Message>(); } } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/IMessageService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/IMessageService.cs index 58134b93c60ba3762b801f11ba2ffb1590c89e3c..785b46134f790b90ade833746481cb16b914c3f5 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/IMessageService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/IMessageService.cs @@ -2,25 +2,16 @@ using System.Collections.Generic; using System.Text; using System.Threading.Tasks; +using Tsi1.BusinessLayer.Dtos; using Tsi1.BusinessLayer.Helpers; namespace Tsi1.BusinessLayer.Interfaces { public interface IMessageService { - Task<ServiceResult<List<ForumPreviewDto>>> GetForums(int courseId); + Task<ServiceResult<List<MessagePreviewDto>>> GetMessages(int userId, int otherUserId); - Task<ServiceResult<Forum>> Create(ForumCreateDto newForum); + Task<ServiceResult<MessagePreviewDto>> Send(MessageCreateDto newMessage); - Task<ServiceResult<Forum>> Delete(int forumId); - - Task<ServiceResult<>> - - List<Message> Get(); - Message Get(string id); - Message Create(Message message); - void Update(string id, Message messageIn); - void Remove(Message messageIn); - void Remove(string id); } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/MessageService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/MessageService.cs new file mode 100644 index 0000000000000000000000000000000000000000..eab3cb3f4a2440d25007d09237e542219de54096 --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/MessageService.cs @@ -0,0 +1,66 @@ +using AutoMapper; +using MongoDB.Bson; +using MongoDB.Driver; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Tsi1.BusinessLayer.Dtos; +using Tsi1.BusinessLayer.Helpers; +using Tsi1.BusinessLayer.Interfaces; +using Tsi1.DataLayer.Entities; +using Tsi1.DataLayer.MongoDbConfiguration; + +namespace Tsi1.BusinessLayer.Services +{ + public class MessageService : IMessageService + { + private readonly IMapper _mapper; + + private readonly IMongoCollection<Message> _messages; + + public MessageService(ITsi1DatabaseSettings settings, IMapper mapper) + { + var client = new MongoClient(settings.ConnectionString); + var database = client.GetDatabase(settings.DatabaseName); + + _messages = database.GetCollection<Message>(settings.Tsi1CollectionName); + _mapper = mapper; + } + + public async Task<ServiceResult<List<MessagePreviewDto>>> GetMessages(int userId, int otherUserId) + { + var result = new ServiceResult<List<MessagePreviewDto>>(); + + var sort = Builders<Message>.Sort.Ascending("Date"); + + var messages = await _messages.Find(m => (m.SenderId == userId && m.ReceiverId == otherUserId) + || (m.SenderId == otherUserId && m.ReceiverId == userId)) + .Sort(sort) + .ToListAsync(); + + var messagesDto = _mapper.Map<List<MessagePreviewDto>>(messages); + + result.Data = messagesDto; + + return result; + } + + public async Task<ServiceResult<MessagePreviewDto>> Send(MessageCreateDto newMessage) + { + var result = new ServiceResult<MessagePreviewDto>(); + + var message = _mapper.Map<Message>(newMessage); + message.Date = DateTime.Now; + + + await _messages.InsertOneAsync(message); + + var messageDto = _mapper.Map<MessagePreviewDto>(message); + + result.Data = messageDto; + + return result; + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/Message.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/Message.cs index cd2efac098dd805a5ee099b58d806b38d6ff3826..4925699629ad1863a4860433900dd189ea8d5fc7 100644 --- a/Tsi1.Api/Tsi1.DataLayer/Entities/Message.cs +++ b/Tsi1.Api/Tsi1.DataLayer/Entities/Message.cs @@ -18,7 +18,7 @@ namespace Tsi1.DataLayer.Entities public string Content { get; set; } - public string Date { get; set; } + public DateTime Date { get; set; } } } diff --git a/Tsi1.Api/Tsi1.DataLayer/Tsi1.DataLayer.csproj b/Tsi1.Api/Tsi1.DataLayer/Tsi1.DataLayer.csproj index c339529345145ef37fcd12c8db20f2b5385c6bfd..247b1c4e8ed3fe19cdd2ba7c310525d252ceab3c 100644 --- a/Tsi1.Api/Tsi1.DataLayer/Tsi1.DataLayer.csproj +++ b/Tsi1.Api/Tsi1.DataLayer/Tsi1.DataLayer.csproj @@ -22,6 +22,7 @@ </PackageReference> <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.9" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.9" /> + <PackageReference Include="MongoDB.Driver" Version="2.11.3" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" /> </ItemGroup>