using FieldLogger.Models; using SQLite; namespace FieldLogger.Services.Data; /// Local SQLite store for jobs and logged points. public sealed class AppDatabase { private readonly Lazy> _connection; public AppDatabase() { _connection = new Lazy>(async () => { var path = Path.Combine(FileSystem.AppDataDirectory, "fieldlogger.db3"); var db = new SQLiteAsyncConnection(path, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.SharedCache); await db.CreateTableAsync(); await db.CreateTableAsync(); return db; }); } private Task Db => _connection.Value; // ---- Jobs ---- public async Task> GetJobsAsync() { var db = await Db; return await db.Table().OrderByDescending(j => j.CreatedUtc).ToListAsync(); } public async Task GetJobAsync(int id) { var db = await Db; return await db.Table().Where(j => j.Id == id).FirstOrDefaultAsync(); } public async Task CreateJobAsync(string name, string notes = "") { var db = await Db; var job = new Job { Name = name, Notes = notes }; await db.InsertAsync(job); return job; } public async Task UpdateJobAsync(Job job) { var db = await Db; await db.UpdateAsync(job); } public async Task DeleteJobAsync(int jobId) { var db = await Db; await db.Table().DeleteAsync(p => p.JobId == jobId); await db.DeleteAsync(jobId); } // ---- Points ---- public async Task AddPointAsync(LoggedPoint point) { var db = await Db; await db.InsertAsync(point); return point.Id; } public async Task> GetPointsAsync(int jobId) { var db = await Db; return await db.Table() .Where(p => p.JobId == jobId) .OrderBy(p => p.TimestampUtc) .ToListAsync(); } public async Task GetPointCountAsync(int jobId) { var db = await Db; return await db.Table().Where(p => p.JobId == jobId).CountAsync(); } public async Task DeletePointAsync(int pointId) { var db = await Db; await db.DeleteAsync(pointId); } }