Skip to content
Snippets Groups Projects
MessageService.cs 2.13 KiB
Newer Older
esantangelo's avatar
esantangelo committed
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;
        }

esantangelo's avatar
esantangelo committed
        public async Task<ServiceResult<List<MessagePreviewDto>>> GetMessages(int userId, int otherUserId, int tenantId)
esantangelo's avatar
esantangelo committed
        {
            var result = new ServiceResult<List<MessagePreviewDto>>();

            var sort = Builders<Message>.Sort.Ascending("Date");

esantangelo's avatar
esantangelo committed
            var messages = await _messages.Find(m => (m.SenderId == userId && m.ReceiverId == otherUserId && m.TenantId == tenantId)
                                        || (m.SenderId == otherUserId && m.ReceiverId == userId && m.TenantId == tenantId))
esantangelo's avatar
esantangelo committed
                                        .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;
        }
    }
}