PI2024-30 #6

Merged
s464958 merged 4 commits from PI2024-30 into master 2024-11-28 20:20:27 +01:00
11 changed files with 144 additions and 44 deletions
Showing only changes of commit 717eb6ed1f - Show all commits

View File

@ -1,55 +1,58 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Concurrent;
using System.Linq;
/*
* This file is part of FirmTracker - Server.
*
* FirmTracker - Server is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FirmTracker - Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FirmTracker - Server. If not, see <https://www.gnu.org/licenses/>.
*/
namespace YourNamespace.Controllers
using FirmTracker_Server.nHibernate;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Security.Claims;
namespace FirmTracker_Server.Controllers
{
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class WorkdayController : ControllerBase
{
// In-memory storage for simplicity, where the key is the userId.
private static readonly ConcurrentDictionary<string, DateTime?> WorkStartTimes = new ConcurrentDictionary<string, DateTime?>();
private readonly WorkdayRepository _workdayCRUD;
// Get the current status of the user's workday (started or not)
[HttpGet("status/{userId}")]
public IActionResult GetWorkdayStatus(string userId)
public WorkdayController()
{
if (WorkStartTimes.TryGetValue(userId, out DateTime? startTime))
_workdayCRUD = new WorkdayRepository(); // Instantiate directly (no DI in this example)
}
// Endpoint to start a workday
[HttpPost("start")]
[Authorize(Roles = Roles.Admin + "," + Roles.User)]
public IActionResult StartWorkday()
{
try
{
if (startTime.HasValue)
{
return Ok(new { status = "started", startTime = startTime });
}
else
{
return Ok(new { status = "stopped" });
}
var userIdString = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value;
int userId = int.Parse(userIdString);
_workdayCRUD.StartWorkday(userId);
return Ok(new { status = "started", userId });
}
else
catch (Exception ex)
{
return NotFound(new { message = "User not found" });
return BadRequest(new { message = "An error occurred while starting the workday.", error = ex.Message });
}
}
// Start or stop the user's workday by toggling the start/stop state
[HttpPost("toggle/{userId}")]
public IActionResult ToggleWorkday(string userId)
{
// If the workday has already started, stop it, otherwise start it
if (WorkStartTimes.ContainsKey(userId) && WorkStartTimes[userId].HasValue)
{
// Stop the workday
WorkStartTimes[userId] = null;
return Ok(new { status = "stopped" });
}
else
{
// Start the workday
WorkStartTimes[userId] = DateTime.Now;
return Ok(new { status = "started", startTime = WorkStartTimes[userId] });
}
}
}
}

View File

@ -2,7 +2,7 @@
{
public class User
{
public virtual int Id { get; set; }
public virtual int UserId { get; set; }
public virtual string Login { get; set; }
public virtual string Email { get; set; }
public virtual string Role { get; set; } = "User";

11
Models/EmployeeDto.cs Normal file
View File

@ -0,0 +1,11 @@
using FirmTracker_Server.Controllers;
namespace FirmTracker_Server.Models
{
public class EmployeeDto
{
public virtual int Id { get; set; }
public virtual string email { get; set; }
}
}

15
Models/Workday.cs Normal file
View File

@ -0,0 +1,15 @@
using FirmTracker_Server.Entities;
using System;
namespace YourNamespace.Models
{
public class Workday
{
public virtual int Id { get; set; }
public virtual DateTime? StartTime { get; set; }
public virtual DateTime? EndTime { get; set; }
// Many-to-One relationship to the User entity
public virtual User User { get; set; }
}
}

View File

@ -40,6 +40,7 @@ using FirmTracker_Server.Mappings;
using NuGet.Packaging;
namespace FirmTracker_Server
{
internal static class Program
@ -176,6 +177,7 @@ namespace FirmTracker_Server
services.AddScoped<ErrorHandling>();
services.AddScoped<IPasswordHasher<User>, PasswordHasher<User>>();
services.AddScoped<IExpenseRepository, ExpenseRepository>();
// services.AddScoped<IWorkdayRepository, WorkdayRepository>();
services.AddMvc();
}

View File

@ -69,7 +69,7 @@ namespace FirmTracker_Server.Services
{
session.Save(user);
transaction.Commit();
return user.Id;
return user.UserId;
}
catch
{
@ -128,7 +128,7 @@ namespace FirmTracker_Server.Services
// Generate JWT token
var claims = new List<Claim>() {
new(ClaimTypes.NameIdentifier, user.Id.ToString()),
new(ClaimTypes.NameIdentifier, user.UserId.ToString()),
new(ClaimTypes.Role, user.Role)
};

View File

@ -55,7 +55,8 @@ namespace FirmTracker_Server.nHibernate
.AddFromAssemblyOf<Reports.ReportTransactionMapping>()
.AddFromAssemblyOf<Reports.ReportExpenseMapping>()
.AddFromAssemblyOf<LogsMapping>()
.AddFromAssemblyOf<UserMapping>();
.AddFromAssemblyOf<UserMapping>()
.AddFromAssemblyOf<WorkdayMapping>();
})
.ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true)) //SchemaUpdate . Execute dla only update

View File

@ -7,7 +7,7 @@ public class UserMapping : ClassMap<User>
{
Table("Users"); // The name of your table in the database
Id(x => x.Id); // Mapping the Id property
Id(x => x.UserId); // Mapping the Id property
Map(x => x.Email); // Mapping other properties
Map(x => x.PassHash);
Map(x => x.Role);

12
nHIbernate/Workday.cs Normal file
View File

@ -0,0 +1,12 @@
using FirmTracker_Server.Entities;
namespace FirmTracker_Server.nHibernate
{
public class Workday
{
public virtual int Id { get; set; }
public virtual DateTime StartTime { get; set; }
public virtual DateTime? EndTime { get; set; } // Nullable EndTime, if not finished
public virtual User User { get; set; } // Assuming a relationship to a User entity
}
}

View File

@ -0,0 +1,15 @@
using FluentNHibernate.Mapping;
namespace FirmTracker_Server.nHibernate
{
public class WorkdayMapping : ClassMap<Workday>
{
public WorkdayMapping()
{
Table("Workdays"); // Make sure the table name matches the one in the database
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.StartTime);
Map(x => x.EndTime);
References(x => x.User).Column("UserId"); // Assuming Workday is related to a User
}
}
}

View File

@ -0,0 +1,41 @@
using FirmTracker_Server.Entities;
using NHibernate;
using System;
namespace FirmTracker_Server.nHibernate
{
public class WorkdayRepository
{
public void StartWorkday(int userId)
{
using (var session = SessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
try
{
// Fetch the user entity by its ID
var user = session.Get<User>(userId); // Assuming User is a mapped entity
if (user == null)
{
throw new Exception("User not found");
}
// Create a new Workday and assign the User reference
var workday = new Workday
{
StartTime = DateTime.Now,
User = user // Set the User reference here
};
session.Save(workday);
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw new Exception("An error occurred while starting the workday", ex);
}
}
}
}
}