aboutsummaryrefslogtreecommitdiffstats
path: root/src/server/Models
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2020-08-01 20:14:34 +0200
committerivarlovlie <git@ivarlovlie.no>2020-08-01 20:14:34 +0200
commita800b3b9f18ae3e8ab030c30c5d7b6504f2a5ebb (patch)
tree68ffcdb7a2b42418ff1c4818d0b2cd5af41d5fa2 /src/server/Models
downloaddough-a800b3b9f18ae3e8ab030c30c5d7b6504f2a5ebb.tar.xz
dough-a800b3b9f18ae3e8ab030c30c5d7b6504f2a5ebb.zip
Initial commit
Diffstat (limited to 'src/server/Models')
-rw-r--r--src/server/Models/Database/BaseModel.cs25
-rw-r--r--src/server/Models/Database/Category.cs7
-rw-r--r--src/server/Models/Database/MainDbContext.cs34
-rw-r--r--src/server/Models/Database/Payee.cs7
-rw-r--r--src/server/Models/Database/Transaction.cs43
-rw-r--r--src/server/Models/Database/User.cs31
-rw-r--r--src/server/Models/DbSetOverrides.cs25
-rw-r--r--src/server/Models/Exceptions/ModelValidationException.cs31
-rw-r--r--src/server/Models/Results/ErrorResult.cs14
9 files changed, 217 insertions, 0 deletions
diff --git a/src/server/Models/Database/BaseModel.cs b/src/server/Models/Database/BaseModel.cs
new file mode 100644
index 0000000..32c2f8f
--- /dev/null
+++ b/src/server/Models/Database/BaseModel.cs
@@ -0,0 +1,25 @@
+using System;
+
+namespace Dough.Models.Database
+{
+ public class BaseModel
+ {
+ public Guid Id { get; set; }
+ public DateTime Created { get; set; }
+ public Guid? CreatedBy { get; set; }
+ public bool Hidden { get; set; }
+
+ public void SetBaseProperties(User actor = default)
+ {
+ Id = Guid.NewGuid();
+ Created = DateTime.UtcNow;
+ CreatedBy = actor?.Id;
+ }
+
+ protected void Update(BaseModel data)
+ {
+ Hidden = data.Hidden;
+ CreatedBy = data.CreatedBy;
+ }
+ }
+}
diff --git a/src/server/Models/Database/Category.cs b/src/server/Models/Database/Category.cs
new file mode 100644
index 0000000..10ef226
--- /dev/null
+++ b/src/server/Models/Database/Category.cs
@@ -0,0 +1,7 @@
+namespace Dough.Models.Database
+{
+ public class Category : BaseModel
+ {
+ public string Name { get; set; }
+ }
+}
diff --git a/src/server/Models/Database/MainDbContext.cs b/src/server/Models/Database/MainDbContext.cs
new file mode 100644
index 0000000..88b1585
--- /dev/null
+++ b/src/server/Models/Database/MainDbContext.cs
@@ -0,0 +1,34 @@
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+
+namespace Dough.Models.Database
+{
+ public class MainDbContext : DbContext
+ {
+
+ public MainDbContext(DbContextOptions<MainDbContext> options) : base(options) {
+
+ }
+
+ public DbSet<Transaction> Transactions { get; set; }
+ public DbSet<User> Users { get; set; }
+ public DbSet<Category> Categories { get; set; }
+ public DbSet<Payee> Payees { get; set; }
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ modelBuilder.Entity<Transaction>().ToTable("Transactions");
+ var initUser = new User("ivar");
+ initUser.SetBaseProperties();
+ initUser.HashAndSetPassword("ivar123");
+ modelBuilder.Entity<User>().HasData(new List<User>
+ {
+ initUser
+ });
+ modelBuilder.Entity<User>().ToTable("Users");
+ modelBuilder.Entity<Category>().ToTable("Categories");
+ modelBuilder.Entity<Payee>().ToTable("Payees");
+ base.OnModelCreating(modelBuilder);
+ }
+ }
+}
diff --git a/src/server/Models/Database/Payee.cs b/src/server/Models/Database/Payee.cs
new file mode 100644
index 0000000..b801d5f
--- /dev/null
+++ b/src/server/Models/Database/Payee.cs
@@ -0,0 +1,7 @@
+namespace Dough.Models.Database
+{
+ public class Payee : BaseModel
+ {
+ public string Name { get; set; }
+ }
+}
diff --git a/src/server/Models/Database/Transaction.cs b/src/server/Models/Database/Transaction.cs
new file mode 100644
index 0000000..a81626b
--- /dev/null
+++ b/src/server/Models/Database/Transaction.cs
@@ -0,0 +1,43 @@
+using System;
+using Dough.Models.Exceptions;
+
+namespace Dough.Models.Database
+{
+ public class Transaction : BaseModel
+ {
+ public string Tags { get; set; }
+ public string Note { get; set; }
+ public DateTime Date { get; set; }
+ public double Amount { get; set; }
+ public Guid PayeeId { get; set; }
+ public Guid CategoryId { get; set; }
+
+ public void Validate()
+ {
+ if (PayeeId == default)
+ {
+ var validationException = new ModelValidationException("PayeeId is invalid");
+ validationException.ErrorResult.Title = "Mottaker er ugyldig";
+ throw validationException;
+ }
+
+ if (CategoryId == default)
+ {
+ var validationException = new ModelValidationException("CategoryId is invalid");
+ validationException.ErrorResult.Title = "Kategori er ugyldig";
+ throw validationException;
+ }
+ }
+
+ public void Update(Transaction data)
+ {
+ Amount = data.Amount;
+ Date = data.Date;
+ Note = data.Note;
+ Tags = data.Tags;
+ CategoryId = data.CategoryId;
+ PayeeId = data.PayeeId;
+ base.Update(data);
+ }
+ }
+}
diff --git a/src/server/Models/Database/User.cs b/src/server/Models/Database/User.cs
new file mode 100644
index 0000000..479c15c
--- /dev/null
+++ b/src/server/Models/Database/User.cs
@@ -0,0 +1,31 @@
+using System;
+
+namespace Dough.Models.Database
+{
+ public class User : BaseModel
+ {
+
+ public User(string username = default)
+ {
+ Username = username;
+ }
+ public string Password { get; set; }
+ public string Username { get; set; }
+
+ public void Update(User data)
+ {
+ Username = data.Username;
+ base.Update(data);
+ }
+
+ public void HashAndSetPassword(string password)
+ {
+ Password = BCrypt.Net.BCrypt.HashPassword(password);
+ }
+
+ public bool VerifyPassword(string password)
+ {
+ return BCrypt.Net.BCrypt.Verify(password, Password);
+ }
+ }
+}
diff --git a/src/server/Models/DbSetOverrides.cs b/src/server/Models/DbSetOverrides.cs
new file mode 100644
index 0000000..24622bc
--- /dev/null
+++ b/src/server/Models/DbSetOverrides.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Linq;
+using Microsoft.EntityFrameworkCore;
+using Dough.Models.Database;
+
+namespace Dough.Models
+{
+ public static class DbSetOverrides
+ {
+ public static T SingleOrDefault<T>(this DbSet<T> entity, Guid id,
+ bool includeHidden = false) where T : BaseModel
+ {
+ if (includeHidden)
+ return entity.SingleOrDefault(c => c.Id == id);
+ return entity.SingleOrDefault(c => c.Id == id && !c.Hidden);
+ }
+
+ public static User SingleByNameOrDefault(this DbSet<User> users, string username, bool includeHidden = false)
+ {
+ if (includeHidden)
+ return users.SingleOrDefault(c => c.Username == username);
+ return users.SingleOrDefault(c => c.Username == username && !c.Hidden);
+ }
+ }
+}
diff --git a/src/server/Models/Exceptions/ModelValidationException.cs b/src/server/Models/Exceptions/ModelValidationException.cs
new file mode 100644
index 0000000..3156229
--- /dev/null
+++ b/src/server/Models/Exceptions/ModelValidationException.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Runtime.Serialization;
+using Dough.Models.Results;
+
+namespace Dough.Models.Exceptions
+{
+ [Serializable]
+ public class ModelValidationException : Exception
+ {
+ public ErrorResult ErrorResult { get; set; }
+
+ public ModelValidationException()
+ {
+ ErrorResult = new ErrorResult();
+ }
+
+ public ModelValidationException(string message) : base(message)
+ {
+ }
+
+ public ModelValidationException(string message, Exception inner) : base(message, inner)
+ {
+ }
+
+ protected ModelValidationException(
+ SerializationInfo info,
+ StreamingContext context) : base(info, context)
+ {
+ }
+ }
+}
diff --git a/src/server/Models/Results/ErrorResult.cs b/src/server/Models/Results/ErrorResult.cs
new file mode 100644
index 0000000..8d4504f
--- /dev/null
+++ b/src/server/Models/Results/ErrorResult.cs
@@ -0,0 +1,14 @@
+namespace Dough.Models.Results
+{
+ public class ErrorResult
+ {
+ public ErrorResult(string title = default, string message = default)
+ {
+ Title = title;
+ Message = message;
+ }
+
+ public string Title { get; set; } = "En feil oppstod";
+ public string Message { get; set; } = "Vennligst prøv igjen snart";
+ }
+}