using AutoMapper;
using Kean.Application.Query.Interfaces;
using Kean.Application.Query.ViewModels;
using Kean.Infrastructure.Database;
using Kean.Infrastructure.Database.Repository.Default;
using Kean.Infrastructure.Database.Repository.Default.Entities;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Kean.Application.Query.Implements
{
///
/// 消息查询服务实现
///
public class MessageService : IMessageService
{
private readonly IMapper _mapper; // 模型映射
private readonly IDefaultDb _database; // 默认数据库
///
/// 依赖注入
///
public MessageService(
IMapper mapper,
IDefaultDb database)
{
_mapper = mapper;
_database = database;
}
/*
* 实现 Kean.Application.Query.Interfaces.IMessageService.GetCount(int userId, string subject, string source, DateTime? start, DateTime? end, bool? flag) 方法
*/
public async Task GetCount(int userId, string subject, string source, DateTime? start, DateTime? end, bool? flag)
{
int? sourceId = null;
if (!string.IsNullOrWhiteSpace(source))
{
sourceId = (await _database.From().Where(u => u.USER_NAME == source).Single(u => new { u.USER_ID }))?.USER_ID;
if (!sourceId.HasValue)
{
return 0;
}
}
var schema = _database.From()
.Where(m => m.MESSAGE_TARGET == userId);
if (subject != null)
{
schema = schema.Where(m => m.MESSAGE_SUBJECT.Contains(subject));
}
if (sourceId.HasValue)
{
schema = schema.Where(m => m.MESSAGE_SOURCE == sourceId.Value);
}
if (start.HasValue)
{
schema = schema.Where(m => m.MESSAGE_TIME >= start.Value);
}
if (end.HasValue)
{
schema = schema.Where(m => m.MESSAGE_TIME <= end.Value.AddDays(1));
}
if (flag.HasValue)
{
schema = schema.Where(m => m.MESSAGE_FLAG == flag.Value);
}
return (int)(await schema.Single(m => new { Count = Function.Count(m.MESSAGE_ID) })).Count;
}
/*
* 实现 Kean.Application.Query.Interfaces.IMessageService.GetList(int userId, string subject, string source, DateTime? start, DateTime? end, bool? flag, int? offset, int? limit) 方法
*/
public async Task> GetList(int userId, string subject, string source, DateTime? start, DateTime? end, bool? flag, int? offset, int? limit)
{
var schema = _database.From()
.Join(Join.Left, (m, u) => m.MESSAGE_SOURCE == u.USER_ID)
.Where((m, u) => m.MESSAGE_TARGET == userId)
.OrderBy((m, u) => m.MESSAGE_TIME, Infrastructure.Database.Order.Descending);
if (subject != null)
{
schema = schema.Where((m, _) => m.MESSAGE_SUBJECT.Contains(subject));
}
if (source != null)
{
schema = schema.Where((_, u) => u.USER_NAME == source);
}
if (start.HasValue)
{
schema = schema.Where((m, _) => m.MESSAGE_TIME >= start.Value);
}
if (end.HasValue)
{
schema = schema.Where((m, _) => m.MESSAGE_TIME <= end.Value.AddDays(1));
}
if (flag.HasValue)
{
schema = schema.Where((m, _) => m.MESSAGE_FLAG == flag.Value);
}
if (offset.HasValue)
{
schema = schema.Skip(offset.Value);
}
if (limit.HasValue)
{
schema = schema.Take(limit.Value);
}
return _mapper.Map>(await schema.Select((m, u) => new
{
m.MESSAGE_ID,
m.MESSAGE_TIME,
m.MESSAGE_SUBJECT,
m.MESSAGE_CONTENT,
m.MESSAGE_FLAG,
u.USER_ID,
u.USER_NAME,
u.USER_AVATAR
}));
}
/*
* 实现 Kean.Application.Query.Interfaces.IMessageService.GetItem(int userId, int messageId) 方法
*/
public async Task GetItem(int userId, int messageId)
{
return _mapper.Map(await _database.From()
.Join(Join.Left, (m, u) => m.MESSAGE_SOURCE == u.USER_ID)
.Where((m, u) => m.MESSAGE_ID == messageId && m.MESSAGE_TARGET == userId)
.Single((m, u) => new
{
m.MESSAGE_ID,
m.MESSAGE_TIME,
m.MESSAGE_SUBJECT,
m.MESSAGE_CONTENT,
m.MESSAGE_FLAG,
u.USER_ID,
u.USER_NAME,
u.USER_AVATAR
}));
}
}
}