using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using PC_BT_MODUL3.Models;
using PC_BT_MODUL3.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using System.Text.Json;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace PC_BT_MODUL3.Service
{
public class EsemkaService : BaseService
{
private IConfiguration con;
private ResponseService Result = new ResponseService();
public EsemkaService(EsemkaTodoContext db, string email, IConfiguration con) : base(db,email)
{
this.db = db;
this.con = con;
}
#region AUTH
public async Task<ResponseService> Auth(vUserLogin vUser)
{
var cekUser = await db.Users.Where(a => a.Email == vUser.Email && a.Password == vUser.Password).FirstOrDefaultAsync();
if (cekUser == null)
{
Result.codeStatus = StatusCodes.Status404NotFound;
return Result;
}
var claim = new[]
{
new Claim("Email", cekUser.Email)
};
var Key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(con["Jwt:Key"]));
var SignIn = new SigningCredentials(Key, SecurityAlgorithms.HmacSha256);
var Token = new JwtSecurityToken(
con["Jwt:Issuer"],
con["Jwt:Audience"],
claims: claim,
expires: DateTime.Now.AddMinutes(10),
signingCredentials: SignIn);
var Hasil = new JwtSecurityTokenHandler().WriteToken(Token);
Result.data = Hasil;
return Result;
}
public async Task<ResponseService> AuthMe()
{
if (baseUser != null)
{
vUser v = new vUser();
v.DateOfBirth = baseUser.DateOfBirth;
v.Email = baseUser.Email;
v.Gender = baseUser.Gender == 1 ? enumGender.Male.ToString() : enumGender.Female.ToString();
v.Name = baseUser.Name;
v.Role = baseUser.Role == 1 ? enumRole.Admin.ToString() : enumRole.User.ToString();
Result.data = v;
return Result;
}
return Result;
}
#endregion
#region USER
public async Task<ResponseService> DeleteUser(string email)
{
if (cekUserRole())
{
Result.codeStatus = StatusCodes.Status400BadRequest;
return Result;
}
var user = await db.Users.Where(a => a.Email == email).FirstOrDefaultAsync();
if (user == null)
{
Result.codeStatus = StatusCodes.Status404NotFound;
return Result;
}
db.Users.Remove(user);
await db.SaveChangesAsync();
return Result;
}
public async Task<ResponseService> PostUser(vUserReq user)
{
if (cekUserRole())
{
Result.codeStatus = StatusCodes.Status400BadRequest;
return Result;
}
var cekUser = await db.Users.Where(a => a.Email == user.Email).FirstOrDefaultAsync();
if (cekUser != null)
{
Result.codeStatus = StatusCodes.Status409Conflict;
return Result;
}
User us = new User();
us.Email = user.Email;
us.DateOfBirth = user.DateOfBirth;
us.Gender = user.Gender == "Male" ? (int)enumGender.Male : (int)enumGender.Female;
us.Name = user.Name;
us.Password = user.Password;
us.Role = user.Role == "Admin" ? (int)enumRole.Admin : (int)enumRole.User;
db.Add(us);
await db.SaveChangesAsync();
Result.data = user;
return Result;
}
public async Task<ResponseService> GetUserTodoItems(string email)
{
if (cekUserRole())
{
Result.codeStatus = StatusCodes.Status400BadRequest;
return Result;
}
List<TodoItem> cekUserTodo = await db.TodoItems.Where(a => a.CreatedByEmail == email).ToListAsync();
if (cekUserTodo.Count == 0)
{
Result.codeStatus = StatusCodes.Status404NotFound;
return Result;
}
List<vUserTodoItems> x = new List<vUserTodoItems>();
foreach (var item in cekUserTodo)
{
vUserTodoItems v = new vUserTodoItems();
v.Id = item.Id;
v.Name = item.Name;
v.Description = item.Description;
v.IsComplete = item.IsComplete;
v.DueAt = item.DueAt;
v.CreatedAt = item.CreatedAt;
v.CompletedAt = item.CompletedAt;
x.Add(v);
}
Result.data = x;
return Result;
}
public async Task<ResponseService> GetUser(string email)
{
if (cekUserRole())
{
Result.codeStatus = StatusCodes.Status400BadRequest;
return Result;
}
var cekUser = await db.Users.Where(a => a.Email == email).FirstOrDefaultAsync();
if (cekUser == null)
{
Result.codeStatus = StatusCodes.Status404NotFound;
return Result;
}
vUserReq us = new vUserReq();
us.Email = cekUser.Email;
us.DateOfBirth = cekUser.DateOfBirth;
us.Gender = cekUser.Gender == 1 ? enumGender.Male.ToString() : enumGender.Female.ToString();
us.Name = cekUser.Name;
us.Password = cekUser.Password;
us.Role = cekUser.Role == 1 ? enumRole.Admin.ToString() : enumRole.User.ToString();
Result.data = us;
return Result;
}
public async Task<ResponseService> PutUser(string email, vUserReq user)
{
if (cekUserRole())
{
Result.codeStatus = StatusCodes.Status400BadRequest;
return Result;
}
User cekUser = await db.Users.Where(a => a.Email == email).FirstOrDefaultAsync();
var cekEmail = await db.Users.Where(a => a.Email == email).FirstOrDefaultAsync();
if (email != user.Email)
{
Result.codeStatus = StatusCodes.Status400BadRequest;
return Result;
}
if (cekUser == null)
{
Result.codeStatus = StatusCodes.Status404NotFound;
return Result;
}
if (cekUser.Email != user.Email)
{
if (cekEmail != null)
{
Result.codeStatus = StatusCodes.Status409Conflict;
return Result;
}
cekUser.DateOfBirth = user.DateOfBirth;
cekUser.Gender = user.Gender == "Male" ? (int)enumGender.Male : (int)enumGender.Female;
cekUser.Name = user.Name;
cekUser.Password = user.Password;
cekUser.Role = user.Role == "Admin" ? (int)enumRole.Admin : (int)enumRole.User;
await db.SaveChangesAsync();
Result.data = cekUser;
return Result;
}
else
{
cekUser.DateOfBirth = user.DateOfBirth;
cekUser.Gender = user.Gender == "Male" ? (int)enumGender.Male : (int)enumGender.Female;
cekUser.Name = user.Name;
cekUser.Password = user.Password;
cekUser.Role = user.Role == "Admin" ? (int)enumRole.Admin : (int)enumRole.User;
await db.SaveChangesAsync();
Result.data = cekUser;
return Result;
}
}
public async Task<ResponseService> GetUsers(int id)
{
if (cekUserRole())
{
Result.codeStatus = StatusCodes.Status400BadRequest;
return Result;
}
int limit = 10;
var a = await db.Users.ToListAsync();
List<vUserReq> vUserReqs = new List<vUserReq>();
if (id > 0)
{
var skip = limit * (id - 1);
a.Skip(skip).Take(limit).ToList();
}
else
{
a.ToList();
}
Result.data = a;
return Result;
}
#endregion
#region TODOITEMS
public async Task<ResponseService> GetTodoItems( int page = 1)
{
int limit = 10;
var a = db.TodoItems.ToList();
List<vTodoItems> vUserReqs = new List<vTodoItems>();
if (page > 0)
{
var skip = limit * (page - 1);
a.Skip(skip).Take(limit).ToList();
}
else
{
a.ToList();
}
Result.data = a;
return Result;
}
public async Task<ResponseService> PostTodoItem(vTodoItems todoItem)
{
var cekTodo = await db.TodoItems.Where(a => a.Name == todoItem.Name).FirstOrDefaultAsync();
if (cekTodo != null)
{
Result.codeStatus = StatusCodes.Status409Conflict;
return Result;
}
TodoItem vTodo = new TodoItem();
vTodo.Id = Guid.NewGuid();
vTodo.Name = todoItem.Name;
vTodo.Description = todoItem.Description;
vTodo.IsComplete = todoItem.IsComplete;
vTodo.DueAt = DateTime.Now;
vTodo.CreatedAt = DateTime.Now;
vTodo.CompletedAt = todoItem.IsComplete == true ? DateTime.Now : (DateTime?)null;
vTodo.CreatedByEmail = baseUser.Email;
db.Add(vTodo);
await db.SaveChangesAsync();
Result.data = todoItem;
return Result;
}
public async Task<ResponseService> GetTodoItem(Guid id)
{
var cekTodo = await db.TodoItems.Where(a => a.Id == id).FirstOrDefaultAsync();
if (cekTodo == null)
{
Result.codeStatus = StatusCodes.Status404NotFound;
return Result;
}
vTodoItemsResult us = new vTodoItemsResult();
us.Id = cekTodo.Id;
us.Name = cekTodo.Name;
us.Description = cekTodo.Description;
us.IsComplete = cekTodo.IsComplete;
us.DueAt = cekTodo.DueAt;
us.CreatedAt = cekTodo.CreatedAt;
us.CompletedAt = cekTodo.CompletedAt;
Result.data = us;
return Result;
}
public async Task<ResponseService> PutTodoItem(Guid id, vTodoItems todoItem)
{
TodoItem cekTodo = await db.TodoItems.Where(a => a.Id == id).FirstOrDefaultAsync();
var cekTodoName = await db.TodoItems.Where(a => a.Name == todoItem.Name).FirstOrDefaultAsync();
if (cekTodo == null)
{
Result.codeStatus = StatusCodes.Status404NotFound;
return Result;
}
if (cekTodo.Name != todoItem.Name)
{
if (cekTodoName != null)
{
Result.codeStatus = StatusCodes.Status409Conflict;
return Result;
}
cekTodo.Name = todoItem.Name;
cekTodo.Description = todoItem.Description;
cekTodo.IsComplete = todoItem.IsComplete;
cekTodo.DueAt = todoItem.DueAt;
cekTodo.CompletedAt = todoItem.IsComplete == true ? DateTime.Now : (DateTime?)null;
await db.SaveChangesAsync();
Result.data = todoItem;
return Result;
}
else
{
cekTodo.Description = todoItem.Description;
cekTodo.IsComplete = todoItem.IsComplete;
cekTodo.DueAt = todoItem.DueAt;
cekTodo.CompletedAt = todoItem.IsComplete == true ? DateTime.Now : (DateTime?)null;
await db.SaveChangesAsync();
Result.data = todoItem;
return Result;
}
}
#endregion
#region Order Header
public async Task<ResponseService> Menu(vHeader x)
{
Guid idHeader = Guid.NewGuid();
Guid idItem = Guid.NewGuid();
Guid idDetail = Guid.NewGuid();
Header h = new Header();
h.Id = idHeader;
h.Name = x.Name;
Item i = new Item();
i.Id = idItem;
i.Type = x.DetailViews.ItemView.Type;
i.Name = x.DetailViews.ItemView.Name;
Detail d = new Detail();
d.Id = idDetail;
d.HeaderId = idHeader;
d.Price = x.DetailViews.Price;
d.Qty = x.DetailViews.Qty;
d.ItemId = idItem;
db.Add(h);
db.Add(i);
db.Add(d);
await db.SaveChangesAsync();
Result.data = x;
return Result;
}
public async Task<ResponseService> GetMenu() // Masih Burik
{
List<Header> headers = await db.Headers.Select(a => a).ToListAsync();
List<Item> items = await db.Items.Select(a => a).ToListAsync();
List<Detail> details = await db.Details.Select(a => a).ToListAsync();
List<vHeader> v = new List<vHeader>();
foreach (var item in headers)
{
vHeader x = new vHeader();
x.Id = item.Id;
x.Name = item.Name;
v.Add(x);
}
foreach (var item in details)
{
vHeader x = new vHeader();
x.DetailViews.Id = item.Id; //'Object reference not set to an instance of an object.'
x.DetailViews.HeaderId = item.HeaderId;
x.DetailViews.Price = item.Price;
x.DetailViews.Qty = item.Qty;
x.DetailViews.ItemId = item.ItemId;
v.Add(x);
}
foreach (var item in items)
{
vHeader x = new vHeader();
x.DetailViews.ItemView.Id = item.Id;
x.DetailViews.ItemView.Name = item.Name;
x.DetailViews.ItemView.Type = item.Type;
v.Add(x);
}
Result.data = v;
return Result;
}
public async Task<ResponseService> PutMenu(Guid id, vHeader x)
{
if (id != x.Id)
{
Result.codeStatus = StatusCodes.Status400BadRequest;
return Result;
}
Header header = await db.Headers.Where(a => a.Id == x.Id).FirstOrDefaultAsync();
Item item = await db.Items.Where(a => a.Id == x.DetailViews.ItemView.Id).FirstOrDefaultAsync();
Detail detail = await db.Details.Where(a => a.Id == x.DetailViews.Id).FirstOrDefaultAsync();
if (header == null || item == null || detail == null)
{
Result.codeStatus = StatusCodes.Status400BadRequest;
return Result;
}
header.Name = x.Name;
detail.Price = x.DetailViews.Price;
detail.Qty = x.DetailViews.Qty;
item.Name = x.DetailViews.ItemView.Name;
item.Type = x.DetailViews.ItemView.Type;
await db.SaveChangesAsync();
return Result;
}
public async Task<ResponseService> DeleteMenu(Guid id)
{
Header header = await db.Headers.Where(a => a.Id == id).FirstOrDefaultAsync();
Detail detail = await db.Details.Where(a => a.HeaderId == header.Id).FirstOrDefaultAsync();
Item item = await db.Items.Where(a => a.Id == detail.ItemId).FirstOrDefaultAsync();
db.Remove(header);
db.Remove(detail);
db.Remove(item);
await db.SaveChangesAsync();
return Result;
}
#endregion
}
}