Innovenergy_trunk/csharp/App/Backend/Database/Db.cs

221 lines
5.2 KiB
C#
Raw Normal View History

2023-02-16 12:57:06 +00:00
using System.Diagnostics.CodeAnalysis;
2023-03-08 12:20:33 +00:00
using InnovEnergy.App.Backend.Model;
using InnovEnergy.App.Backend.Model.Relations;
using InnovEnergy.App.Backend.Utils;
2023-02-16 12:57:06 +00:00
using InnovEnergy.Lib.Utils;
using SQLite;
2023-03-08 12:20:33 +00:00
namespace InnovEnergy.App.Backend.Database;
2023-02-16 12:57:06 +00:00
public partial class Db : IDisposable
{
internal const String DbPath = "./db.sqlite";
2023-03-09 15:32:11 +00:00
2023-02-16 12:57:06 +00:00
private readonly SQLiteConnection _Db; // internal handle to the connection, disposable
2023-03-09 15:32:11 +00:00
2023-02-16 12:57:06 +00:00
private TableQuery<Session> Sessions => _Db.Table<Session>();
2023-03-09 15:32:11 +00:00
2023-02-16 12:57:06 +00:00
[SuppressMessage("ReSharper", "AccessToDisposedClosure")]
static Db()
{
// on startup create/migrate tables
2023-03-09 15:32:11 +00:00
2023-02-16 12:57:06 +00:00
using var db = new SQLiteConnection(DbPath);
db.RunInTransaction(() =>
{
db.CreateTable<User>();
db.CreateTable<Installation>();
db.CreateTable<Folder>();
db.CreateTable<User2Folder>();
db.CreateTable<User2Installation>();
db.CreateTable<Session>();
});
}
// private, force access through Connect()
private Db() => _Db = new SQLiteConnection(DbPath);
2023-03-09 15:32:11 +00:00
2023-02-16 12:57:06 +00:00
public static Db Connect() => new Db();
public void Dispose() => _Db.Dispose();
2023-03-09 15:32:11 +00:00
2023-02-16 12:57:06 +00:00
// the C in CRUD
2023-03-09 15:32:11 +00:00
private Int64 Create(TreeNode treeNode)
2023-02-16 12:57:06 +00:00
{
try
{
_Db.Insert(treeNode);
2023-03-09 15:32:11 +00:00
return SQLite3.LastInsertRowid(_Db.Handle);
2023-02-16 12:57:06 +00:00
}
catch (Exception e)
{
2023-03-09 15:32:11 +00:00
return -1;
2023-02-16 12:57:06 +00:00
}
2023-03-09 15:32:11 +00:00
}
private Boolean Create(Session session)
{
try
{
_Db.Insert(session);
return true;
}
catch (Exception e)
{
return false;
}
}
2023-02-16 12:57:06 +00:00
// the U in CRUD
2023-03-09 15:32:11 +00:00
private Boolean Update(TreeNode treeNode)
2023-02-16 12:57:06 +00:00
{
try
{
_Db.InsertOrReplace(treeNode);
2023-03-09 15:32:11 +00:00
return true;
2023-02-16 12:57:06 +00:00
}
catch (Exception e)
{
2023-03-09 15:32:11 +00:00
return false;
2023-02-16 12:57:06 +00:00
}
}
2023-03-09 15:32:11 +00:00
2023-02-16 12:57:06 +00:00
// the D in CRUD
2023-03-09 15:32:11 +00:00
private Boolean Delete(TreeNode treeNode)
2023-02-16 12:57:06 +00:00
{
try
{
_Db.Delete(treeNode);
2023-03-09 15:32:11 +00:00
return true;
2023-02-16 12:57:06 +00:00
}
catch (Exception e)
{
2023-03-09 15:32:11 +00:00
return false;
2023-02-16 12:57:06 +00:00
}
}
2023-03-09 15:32:11 +00:00
2023-02-16 12:57:06 +00:00
public IEnumerable<Installation> GetAllAccessibleInstallations(User user)
{
2023-03-09 15:32:11 +00:00
var direct = GetDirectlyAccessibleInstallations(user);
2023-02-16 12:57:06 +00:00
var fromFolders = GetAllAccessibleFolders(user)
2023-03-09 15:32:11 +00:00
.SelectMany(GetChildInstallations);
2023-02-16 12:57:06 +00:00
2023-03-08 14:45:53 +00:00
return direct
2023-03-09 15:32:11 +00:00
.Concat(fromFolders)
.Distinct();
2023-02-16 12:57:06 +00:00
}
2023-03-09 15:32:11 +00:00
2023-02-16 12:57:06 +00:00
public IEnumerable<Folder> GetAllAccessibleFolders(User user)
{
return GetDirectlyAccessibleFolders(user)
2023-03-09 15:32:11 +00:00
.SelectMany(GetDescendantFolders)
.Distinct();
2023-03-08 14:45:53 +00:00
// Distinct because the user might have direct access
// to a child folder of a folder he has already access to
2023-02-16 12:57:06 +00:00
}
2023-03-09 15:32:11 +00:00
2023-02-16 12:57:06 +00:00
public IEnumerable<Installation> GetDirectlyAccessibleInstallations(User user)
{
return User2Installation
2023-03-09 15:32:11 +00:00
.Where(r => r.UserId == user.Id)
.Select(r => r.InstallationId)
.Select(GetInstallationById)
.NotNull()
.Do(i => i.ParentId = 0); // hide inaccessible parents from calling user
2023-02-16 12:57:06 +00:00
}
2023-03-09 15:32:11 +00:00
2023-02-16 12:57:06 +00:00
public IEnumerable<Folder> GetDirectlyAccessibleFolders(User user)
{
return User2Folder
2023-03-09 15:32:11 +00:00
.Where(r => r.UserId == user.Id)
.Select(r => r.FolderId)
.Select(GetFolderById)
.NotNull()
.Do(i => i.ParentId = 0); // hide inaccessible parents from calling user;
2023-02-16 12:57:06 +00:00
}
2023-03-09 15:32:11 +00:00
public Boolean AddToAccessibleInstallations(Int64 userId, Int64 updatedInstallationId)
2023-02-16 12:57:06 +00:00
{
var con = new User2Installation
{
UserId = userId,
InstallationId = updatedInstallationId
};
2023-02-16 12:57:06 +00:00
try
{
2023-03-09 15:32:11 +00:00
_Db.Insert(con);
return true;
2023-02-16 12:57:06 +00:00
}
catch (Exception e)
{
2023-03-09 15:32:11 +00:00
return false;
2023-02-16 12:57:06 +00:00
}
}
2023-03-09 15:32:11 +00:00
public Boolean AddToAccessibleFolders(Int64 userId, Int64 updatedFolderId)
2023-02-16 12:57:06 +00:00
{
var con = new User2Folder
{
UserId = userId,
FolderId = updatedFolderId
};
2023-02-16 12:57:06 +00:00
try
{
2023-03-09 15:32:11 +00:00
_Db.Insert(con);
return true;
2023-02-16 12:57:06 +00:00
}
catch (Exception e)
{
2023-03-09 15:32:11 +00:00
return false;
2023-02-16 12:57:06 +00:00
}
}
public User? GetUserByToken(String token)
{
return Sessions
.Where(s => s.Token == token).ToList()
.Where(s => s.Valid)
.Select(s => s.UserId)
.Select(GetUserById)
.FirstOrDefault();
}
2023-03-09 15:32:11 +00:00
public Boolean NewSession(Session ses) => Create(ses);
2023-03-09 15:32:11 +00:00
public Boolean DeleteSession(Int64 id)
{
try
{
Sessions.Delete(u => u.UserId == id);
2023-03-09 15:32:11 +00:00
return true;
}
catch (Exception e)
{
2023-03-09 15:32:11 +00:00
return false;
}
}
2023-03-09 11:50:21 +00:00
public Object? GetInstallationS3Key(Int64 installationId)
{
return Installations
2023-03-09 15:33:14 +00:00
.FirstOrDefault(installation => installation.Id == installationId).S3Key;
2023-03-09 11:50:21 +00:00
}
public void DeleteS3KeysDaily()
{
foreach (var installation in Installations.ToList())
{
installation.S3Key = null;
Update(installation);
}
}
2023-03-09 15:32:11 +00:00
}