From 836d9df20a41946dd8eacda74bdca1df820f32dc Mon Sep 17 00:00:00 2001
From: esantangelo <enzo020895@gmail.com>
Date: Sun, 18 Oct 2020 17:38:16 -0300
Subject: [PATCH] add message controller

---
 .../Tsi1.Api/Controllers/MessageController.cs | 61 +++++++++++++++++
 Tsi1.Api/Tsi1.Api/Startup.cs                  |  6 +-
 .../Helpers/MappingProfile.cs                 |  4 ++
 .../Interfaces/IMessageService.cs             | 15 +----
 .../Services/MessageService.cs                | 66 +++++++++++++++++++
 Tsi1.Api/Tsi1.DataLayer/Entities/Message.cs   |  2 +-
 Tsi1.Api/Tsi1.DataLayer/Tsi1.DataLayer.csproj |  1 +
 7 files changed, 140 insertions(+), 15 deletions(-)
 create mode 100644 Tsi1.Api/Tsi1.Api/Controllers/MessageController.cs
 create mode 100644 Tsi1.Api/Tsi1.BusinessLayer/Services/MessageService.cs

diff --git a/Tsi1.Api/Tsi1.Api/Controllers/MessageController.cs b/Tsi1.Api/Tsi1.Api/Controllers/MessageController.cs
new file mode 100644
index 0000000..b6b03bf
--- /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 b6a5bff..c6a4f5f 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 95ed2d6..4563e7b 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 58134b9..785b461 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 0000000..eab3cb3
--- /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 cd2efac..4925699 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 c339529..247b1c4 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>
 
-- 
GitLab