aboutsummaryrefslogtreecommitdiffstats
path: root/src/server/Controllers
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/Controllers')
-rw-r--r--src/server/Controllers/AccountController.cs76
-rw-r--r--src/server/Controllers/BaseController.cs27
-rw-r--r--src/server/Controllers/TransactionsController.cs78
-rw-r--r--src/server/Controllers/UsersController.cs6
4 files changed, 187 insertions, 0 deletions
diff --git a/src/server/Controllers/AccountController.cs b/src/server/Controllers/AccountController.cs
new file mode 100644
index 0000000..58bb7b6
--- /dev/null
+++ b/src/server/Controllers/AccountController.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+using System.Security.Claims;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Authentication.Cookies;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Dough.Models;
+using Dough.Models.Database;
+using Dough.Models.Results;
+using Dough.Utilities;
+
+namespace Dough.Controllers
+{
+ public class AccountController : BaseController
+ {
+ private readonly MainDbContext _context;
+
+ public AccountController(MainDbContext context)
+ {
+ _context = context;
+ }
+
+ [HttpPost("login")]
+ public async Task<ActionResult> Login(string username, string password)
+ {
+ var user = _context.Users.SingleByNameOrDefault(username);
+ if (user == default)
+ return BadRequest(new ErrorResult("Ugyldig brukernavn eller passord",
+ "Verifiser at passord og brukernavn er riktig og prøv igjen"));
+
+ if (!user.VerifyPassword(password))
+ return BadRequest(new ErrorResult("Ugyldig brukernavn eller passord",
+ "Verifiser at passord og brukernavn er riktig"));
+
+ var claims = new List<Claim>
+ {
+ new Claim(ClaimTypes.Name, user.Username),
+ new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())
+ };
+
+ var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
+ var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
+
+ var authenticationProperties = new AuthenticationProperties
+ {
+ IsPersistent = false,
+ IssuedUtc = DateTime.UtcNow,
+ AllowRefresh = true,
+ ExpiresUtc = DateTime.UtcNow.AddDays(7),
+ };
+
+ await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
+ claimsPrincipal,
+ authenticationProperties);
+
+ return Ok();
+ }
+
+ [HttpGet("logout")]
+ public async Task<ActionResult> Logout(string continueTo = default)
+ {
+ await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
+ if (continueTo.IsPresent() && continueTo.IsValidUrl()) return Redirect(continueTo);
+ return Ok();
+ }
+
+ [Authorize]
+ [HttpGet("me")]
+ public ActionResult GetClaimsForUser()
+ {
+ return Ok(LoggedInUser);
+ }
+ }
+}
diff --git a/src/server/Controllers/BaseController.cs b/src/server/Controllers/BaseController.cs
new file mode 100644
index 0000000..33f1e4b
--- /dev/null
+++ b/src/server/Controllers/BaseController.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Security.Claims;
+using Microsoft.AspNetCore.Mvc;
+using Dough.Models.Database;
+using Dough.Utilities;
+
+namespace Dough.Controllers
+{
+ [ApiController]
+ [Route("api/[controller]")]
+ public class BaseController : ControllerBase
+ {
+ public LoggedInUserModel LoggedInUser => new LoggedInUserModel
+ {
+ Id = User.GetClaimValueOrDefault(ClaimTypes.NameIdentifier)?.ToGuidOrDefault() ?? default,
+ Username = User.GetClaimValueOrDefault(ClaimTypes.Name),
+ SessionStart = User.GetClaimValueOrDefault(ClaimTypes.AuthenticationInstant).ToDateTimeOrDefault()
+ };
+
+ public class LoggedInUserModel
+ {
+ public Guid Id { get; set; }
+ public string Username { get; set; }
+ public DateTime SessionStart { get; set; }
+ }
+ }
+}
diff --git a/src/server/Controllers/TransactionsController.cs b/src/server/Controllers/TransactionsController.cs
new file mode 100644
index 0000000..8441beb
--- /dev/null
+++ b/src/server/Controllers/TransactionsController.cs
@@ -0,0 +1,78 @@
+using System;
+using System.Linq;
+using Microsoft.AspNetCore.Mvc;
+using Dough.Models.Database;
+using Dough.Models;
+using Dough.Models.Exceptions;
+using Dough.Models.Results;
+
+namespace Dough.Controllers
+{
+ public class TransactionsController : BaseController
+ {
+ private readonly MainDbContext _context;
+
+ public TransactionsController(MainDbContext context)
+ {
+ _context = context;
+ }
+
+ [HttpGet]
+ public ActionResult GetTransactions()
+ {
+ var transactions = _context.Transactions.Where(c => !c.Hidden);
+ return Ok(transactions.ToList());
+ }
+
+ [HttpPost("add")]
+ public ActionResult AddTransaction(Transaction data)
+ {
+ data.SetBaseProperties();
+ try
+ {
+ data.Validate();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ if (e is ModelValidationException mve)
+ return BadRequest(mve.ErrorResult);
+ return BadRequest(new ErrorResult());
+ }
+
+ _context.Transactions.Add(data);
+ _context.SaveChanges();
+ return Ok();
+ }
+
+ [HttpPost("update")]
+ public ActionResult UpdateTransaction(Transaction data)
+ {
+ try
+ {
+ data.Validate();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ if (e is ModelValidationException mve)
+ return BadRequest(mve.ErrorResult);
+ return BadRequest(new ErrorResult());
+ }
+
+ var transaction = _context.Transactions.SingleOrDefault(data.Id);
+ transaction.Update(data);
+ _context.SaveChanges();
+ return Ok(data);
+ }
+
+ [HttpDelete("delete")]
+ public ActionResult DeleteTransaction(Transaction data)
+ {
+ if (data.Id == default) return BadRequest(new ErrorResult());
+ _context.Transactions.Remove(data);
+ _context.SaveChanges();
+ return Ok();
+ }
+ }
+}
diff --git a/src/server/Controllers/UsersController.cs b/src/server/Controllers/UsersController.cs
new file mode 100644
index 0000000..bef8cc2
--- /dev/null
+++ b/src/server/Controllers/UsersController.cs
@@ -0,0 +1,6 @@
+namespace Dough.Controllers
+{
+ public class UsersController : BaseController
+ {
+ }
+}