Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
5e4a57cb12 | |||
422668dc65 | |||
a6e58135d2 | |||
326a1f1210 | |||
6e6cfef8df | |||
d28a692fdd | |||
19e1a43996 | |||
0c8df1b6dc | |||
34de785a6f |
@ -50,6 +50,18 @@ namespace FirmTracker_Server.Controllers
|
|||||||
}
|
}
|
||||||
return Ok(roleClaim);
|
return Ok(roleClaim);
|
||||||
}
|
}
|
||||||
|
[HttpGet("emails")]
|
||||||
|
[Authorize(Roles = Roles.Admin)]
|
||||||
|
public ActionResult<IEnumerable<string>> GetAllUserEmails()
|
||||||
|
{
|
||||||
|
var emails = UserService.GetAllUserEmails();
|
||||||
|
if (emails == null || !emails.Any())
|
||||||
|
{
|
||||||
|
return NotFound("No users found or unable to retrieve emails.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok(emails);
|
||||||
|
}
|
||||||
// New method to get all users
|
// New method to get all users
|
||||||
/* [HttpGet("all")]
|
/* [HttpGet("all")]
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
* along with FirmTracker - Server. If not, see <https://www.gnu.org/licenses/>.
|
* along with FirmTracker - Server. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using FirmTracker_Server.Entities;
|
||||||
|
using FirmTracker_Server.Models;
|
||||||
using FirmTracker_Server.nHibernate;
|
using FirmTracker_Server.nHibernate;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
@ -74,6 +76,8 @@ namespace FirmTracker_Server.Controllers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Endpoint to get all workdays for a user
|
// Endpoint to get all workdays for a user
|
||||||
[HttpGet("user/{userMail}/workdays")]
|
[HttpGet("user/{userMail}/workdays")]
|
||||||
[Authorize(Roles = Roles.Admin + "," + Roles.User)]
|
[Authorize(Roles = Roles.Admin + "," + Roles.User)]
|
||||||
@ -89,6 +93,39 @@ namespace FirmTracker_Server.Controllers
|
|||||||
return BadRequest(new { message = "An error occurred while fetching workdays.", error = ex.Message });
|
return BadRequest(new { message = "An error occurred while fetching workdays.", error = ex.Message });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
[HttpPost("absence/add")]
|
||||||
|
[Authorize(Roles = Roles.Admin + "," + Roles.User)]
|
||||||
|
public IActionResult AddAbsence([FromBody] AddAbsenceDto dto)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(dto.userEmail))
|
||||||
|
{
|
||||||
|
return BadRequest(new { message = "User email must be provided." });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch the userId based on the provided email
|
||||||
|
int userId;
|
||||||
|
using (var session = SessionFactory.OpenSession())
|
||||||
|
{
|
||||||
|
var user = session.Query<User>().FirstOrDefault(u => u.Email == dto.userEmail);
|
||||||
|
if (user == null)
|
||||||
|
{
|
||||||
|
return NotFound(new { message = "User with the given email not found." });
|
||||||
|
}
|
||||||
|
userId = user.UserId;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the absence for the retrieved userId
|
||||||
|
_workdayCRUD.AddAbsence(userId, dto.AbsenceType, dto.StartTime, dto.EndTime);
|
||||||
|
|
||||||
|
return Ok(new { status = "added", userId, dto.userEmail, absenceType = dto.AbsenceType });
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return BadRequest(new { message = "An error occurred while adding the absence.", error = ex.Message });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
37
Dockerfile
Normal file
37
Dockerfile
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# Step 1: Use the official .NET SDK image to build the app
|
||||||
|
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
||||||
|
WORKDIR /src
|
||||||
|
|
||||||
|
# Copy the project file and restore dependencies
|
||||||
|
COPY ["FirmTracker-Server.csproj", "FirmTracker-Server/"]
|
||||||
|
RUN dotnet restore "FirmTracker-Server/FirmTracker-Server.csproj"
|
||||||
|
|
||||||
|
# Copy the rest of the application code
|
||||||
|
WORKDIR "/src/FirmTracker-Server"
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
|
||||||
|
# Copy the szyfrowanie.dll into the build directory (to ensure it's available during the build)
|
||||||
|
COPY ["szyfrowanie.dll", "./"]
|
||||||
|
|
||||||
|
# Build the app
|
||||||
|
RUN dotnet build "FirmTracker-Server.csproj" -c Release -o /app/build
|
||||||
|
|
||||||
|
# Step 2: Publish the app
|
||||||
|
FROM build AS publish
|
||||||
|
RUN dotnet publish "FirmTracker-Server.csproj" -c Release -o /app/publish
|
||||||
|
|
||||||
|
# Step 3: Create the final image using a runtime-only image
|
||||||
|
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
|
||||||
|
WORKDIR /app
|
||||||
|
EXPOSE 80
|
||||||
|
EXPOSE 443
|
||||||
|
|
||||||
|
# Copy the published app from the previous stage
|
||||||
|
COPY --from=publish /app/publish .
|
||||||
|
|
||||||
|
# Copy the szyfrowanie.dll to the final image (if needed at runtime)
|
||||||
|
COPY ["szyfrowanie.dll", "./"]
|
||||||
|
|
||||||
|
# Set the entry point for the container
|
||||||
|
ENTRYPOINT ["dotnet", "FirmTracker-Server.dll"]
|
@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0-windows</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<RootNamespace>FirmTracker_Server</RootNamespace>
|
<RootNamespace>FirmTracker_Server</RootNamespace>
|
||||||
@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="szyfrowanie">
|
<Reference Include="szyfrowanie">
|
||||||
<HintPath>..\..\..\Desktop\szyfrowanie.dll</HintPath>
|
<HintPath>./szyfrowanie.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
27
JenkinsFile
Normal file
27
JenkinsFile
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
environment {
|
||||||
|
IMG_NAME = 'firmtracker-server'
|
||||||
|
DOCKER_REPO = 'maciejm0101/firmtracker'
|
||||||
|
}
|
||||||
|
stages {
|
||||||
|
stage('build') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
sh 'docker build -t ${IMG_NAME} .'
|
||||||
|
sh 'docker tag ${IMG_NAME} ${DOCKER_REPO}:${IMG_NAME}'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('push') {
|
||||||
|
steps {
|
||||||
|
withCredentials([usernamePassword(credentialsId: 'DockerHub-LG', passwordVariable: 'PSWD', usernameVariable: 'LOGIN')]) {
|
||||||
|
script {
|
||||||
|
sh 'echo ${PSWD} | docker login -u ${LOGIN} --password-stdin'
|
||||||
|
sh 'docker push ${DOCKER_REPO}:${IMG_NAME}'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
12
Models/AddAbsenceDtocs.cs
Normal file
12
Models/AddAbsenceDtocs.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
namespace FirmTracker_Server.Models
|
||||||
|
{
|
||||||
|
public class AddAbsenceDto
|
||||||
|
{
|
||||||
|
public string userEmail { get; set; }
|
||||||
|
public string AbsenceType { get; set; } // e.g., "Sick", "Vacation", etc.
|
||||||
|
public DateTime StartTime { get; set; }
|
||||||
|
public DateTime EndTime { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
10
Models/UpdateAbsenceDto.cs
Normal file
10
Models/UpdateAbsenceDto.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
namespace FirmTracker_Server.Models
|
||||||
|
{
|
||||||
|
public class UpdateAbsenceDto
|
||||||
|
{
|
||||||
|
public string NewAbsenceType { get; set; } // e.g., "Sick", "Vacation", etc.
|
||||||
|
public DateTime NewStartTime { get; set; }
|
||||||
|
public DateTime NewEndTime { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
23
Program.cs
23
Program.cs
@ -46,10 +46,10 @@ namespace FirmTracker_Server
|
|||||||
internal static class Program
|
internal static class Program
|
||||||
{
|
{
|
||||||
|
|
||||||
public static async Task Main(string[] args)
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
string appDirectory = Directory.GetCurrentDirectory();
|
string appDirectory = Directory.GetCurrentDirectory();
|
||||||
string configFilePath = Path.Combine(appDirectory, "appsettings.json");
|
string configFilePath = Path.Combine(appDirectory, "appsettings.json");
|
||||||
string connectionString = "";
|
string connectionString = "";
|
||||||
if (File.Exists(configFilePath))
|
if (File.Exists(configFilePath))
|
||||||
@ -61,7 +61,7 @@ namespace FirmTracker_Server
|
|||||||
var connectionstringsection = config.GetSection("AppSettings:ConnectionString");
|
var connectionstringsection = config.GetSection("AppSettings:ConnectionString");
|
||||||
|
|
||||||
connectionString = connectionstringsection.Value;
|
connectionString = connectionstringsection.Value;
|
||||||
|
//Console.WriteLine(connectionString);
|
||||||
SessionFactory.Init(connectionString);
|
SessionFactory.Init(connectionString);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -87,7 +87,7 @@ namespace FirmTracker_Server
|
|||||||
{
|
{
|
||||||
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
|
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
|
||||||
});
|
});
|
||||||
;
|
;
|
||||||
builder.ConfigureAuthentication();
|
builder.ConfigureAuthentication();
|
||||||
builder.Services.AddAuthorization();
|
builder.Services.AddAuthorization();
|
||||||
builder.Services.AddEndpointsApiExplorer();
|
builder.Services.AddEndpointsApiExplorer();
|
||||||
@ -104,18 +104,18 @@ namespace FirmTracker_Server
|
|||||||
.AddJsonFile("appsettings.json")
|
.AddJsonFile("appsettings.json")
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
|
|
||||||
var port = configSwagger.GetValue<int>("Port", 5075);
|
var port = configSwagger.GetValue<int>("Port", 5075);
|
||||||
var port2 = configSwagger.GetValue<int>("Port", 7039);
|
var port2 = configSwagger.GetValue<int>("Port", 7039);
|
||||||
app.Urls.Add($"http://*:{port}");
|
app.Urls.Add($"http://*:{port}");
|
||||||
app.Urls.Add($"https://*:{port2}");
|
app.Urls.Add($"https://*:{port2}");
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
app.UseSwagger();
|
app.UseSwagger();
|
||||||
app.UseSwaggerUI(c =>
|
app.UseSwaggerUI(c =>
|
||||||
{
|
{
|
||||||
c.SwaggerEndpoint($"/swagger/v1/swagger.json", "FirmTracker - TEST");
|
c.SwaggerEndpoint($"/swagger/v1/swagger.json", "FirmTracker - TEST");
|
||||||
c.RoutePrefix = "swagger";
|
c.RoutePrefix = "swagger";
|
||||||
});
|
});
|
||||||
Console.WriteLine("uruchomiono swaggera");
|
Console.WriteLine("uruchomiono swaggera");
|
||||||
@ -125,6 +125,7 @@ namespace FirmTracker_Server
|
|||||||
{
|
{
|
||||||
Console.WriteLine("Nie uda³o siê uruchomiæ swaggera");
|
Console.WriteLine("Nie uda³o siê uruchomiæ swaggera");
|
||||||
}
|
}
|
||||||
|
|
||||||
app.UseHttpsRedirection();
|
app.UseHttpsRedirection();
|
||||||
|
|
||||||
app.UseCors("AllowSpecificOrigin");
|
app.UseCors("AllowSpecificOrigin");
|
||||||
@ -133,7 +134,7 @@ namespace FirmTracker_Server
|
|||||||
app.UseAuthentication();
|
app.UseAuthentication();
|
||||||
app.UseAuthorization();
|
app.UseAuthorization();
|
||||||
|
|
||||||
|
|
||||||
app.MapControllers();
|
app.MapControllers();
|
||||||
|
|
||||||
var configuration = new Configuration();
|
var configuration = new Configuration();
|
||||||
|
@ -23,7 +23,7 @@ namespace FirmTracker_Server.Services
|
|||||||
UserDto GetById(int id);
|
UserDto GetById(int id);
|
||||||
int AddUser(CreateUserDto dto);
|
int AddUser(CreateUserDto dto);
|
||||||
string CreateTokenJwt(LoginDto dto);
|
string CreateTokenJwt(LoginDto dto);
|
||||||
|
IEnumerable<string> GetAllUserEmails();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class UserService : IUserService
|
public class UserService : IUserService
|
||||||
@ -44,7 +44,15 @@ namespace FirmTracker_Server.Services
|
|||||||
SimplerAES = new SimplerAES();
|
SimplerAES = new SimplerAES();
|
||||||
//SessionFactory = sessionFactory;
|
//SessionFactory = sessionFactory;
|
||||||
}
|
}
|
||||||
|
public IEnumerable<string> GetAllUserEmails()
|
||||||
|
{
|
||||||
|
using (var session = SessionFactory.OpenSession())
|
||||||
|
{
|
||||||
|
// Query the users and return a list of emails
|
||||||
|
var users = session.Query<User>().Select(u => u.Email).ToList();
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
}
|
||||||
public UserDto GetById(int id)
|
public UserDto GetById(int id)
|
||||||
{
|
{
|
||||||
using (var session = SessionFactory.OpenSession())
|
using (var session = SessionFactory.OpenSession())
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"AppSettings": {
|
"AppSettings": {
|
||||||
"ConnectionString": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=master;Integrated Security=True;"
|
"ConnectionString": "Server=localhost,1433;Initial Catalog=master;User Id=sa;Password=Rap45tro2;"
|
||||||
|
|
||||||
},
|
},
|
||||||
"TokenConfig": {
|
"TokenConfig": {
|
||||||
@ -17,14 +17,7 @@
|
|||||||
"applicationUrl": "http://localhost:5045"
|
"applicationUrl": "http://localhost:5045"
|
||||||
|
|
||||||
},
|
},
|
||||||
"https": {
|
|
||||||
"commandName": "Project",
|
|
||||||
"dotnetRunMessages": true,
|
|
||||||
"launchBrowser": true,
|
|
||||||
"launchUrl": "swagger",
|
|
||||||
"applicationUrl": "https://localhost:7039"
|
|
||||||
|
|
||||||
},
|
|
||||||
"IIS Express": {
|
"IIS Express": {
|
||||||
"commandName": "IISExpress",
|
"commandName": "IISExpress",
|
||||||
"launchBrowser": true,
|
"launchBrowser": true,
|
||||||
|
@ -20,5 +20,6 @@ namespace FirmTracker_Server.nHibernate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
public virtual User User { get; set; }
|
public virtual User User { get; set; }
|
||||||
|
public virtual string Absence { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ namespace FirmTracker_Server.nHibernate
|
|||||||
Map(x => x.StartTime);
|
Map(x => x.StartTime);
|
||||||
Map(x => x.EndTime);
|
Map(x => x.EndTime);
|
||||||
References(x => x.User).Column("UserId"); // Assuming Workday is related to a User
|
References(x => x.User).Column("UserId"); // Assuming Workday is related to a User
|
||||||
|
Map(x => x.Absence);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,8 @@ public class WorkdayRepository
|
|||||||
var workday = new Workday
|
var workday = new Workday
|
||||||
{
|
{
|
||||||
StartTime = DateTime.Now,
|
StartTime = DateTime.Now,
|
||||||
User = user
|
User = user,
|
||||||
|
Absence = ""
|
||||||
};
|
};
|
||||||
|
|
||||||
session.Save(workday);
|
session.Save(workday);
|
||||||
@ -43,6 +44,36 @@ public class WorkdayRepository
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AddAbsence(int userId, string absenceType, DateTime startTime, DateTime endTime)
|
||||||
|
{
|
||||||
|
using (var session = SessionFactory.OpenSession())
|
||||||
|
using (var transaction = session.BeginTransaction())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var user = session.Get<User>(userId);
|
||||||
|
if (user == null) throw new Exception("User not found");
|
||||||
|
|
||||||
|
// Create a new workday entry for the absence
|
||||||
|
var workday = new Workday
|
||||||
|
{
|
||||||
|
User = user,
|
||||||
|
StartTime = startTime,
|
||||||
|
EndTime = endTime,
|
||||||
|
Absence = absenceType // Store the absence type as a string
|
||||||
|
};
|
||||||
|
|
||||||
|
session.Save(workday);
|
||||||
|
transaction.Commit();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
transaction.Rollback();
|
||||||
|
throw new Exception("An error occurred while adding the absence", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool StopWorkday(int userId)
|
public bool StopWorkday(int userId)
|
||||||
{
|
{
|
||||||
@ -90,6 +121,7 @@ public class WorkdayRepository
|
|||||||
StartTime = w.StartTime,
|
StartTime = w.StartTime,
|
||||||
EndTime = w.EndTime ?? DateTime.Today.AddHours(17),
|
EndTime = w.EndTime ?? DateTime.Today.AddHours(17),
|
||||||
WorkedHours = (w.EndTime ?? DateTime.Today.AddHours(17)) - w.StartTime,
|
WorkedHours = (w.EndTime ?? DateTime.Today.AddHours(17)) - w.StartTime,
|
||||||
|
Absence = w.Absence,
|
||||||
})
|
})
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
|
@ -293,7 +293,7 @@ namespace FirmTracker_Server.nHibernate.Transactions
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove the product from the transaction
|
// Remove the product from the transaction
|
||||||
transaction.TotalPrice -= (transactionProduct.Quantity * product.Price * (1 - (transaction.Discount / 100)));
|
transaction.TotalPrice = (transaction.TotalPrice * (1 + (transaction.Discount / 100))) - (transactionProduct.Quantity * product.Price );
|
||||||
transaction.TotalPrice = Math.Round(transaction.TotalPrice, 2, MidpointRounding.AwayFromZero);
|
transaction.TotalPrice = Math.Round(transaction.TotalPrice, 2, MidpointRounding.AwayFromZero);
|
||||||
|
|
||||||
// Remove the product from the Transaction's Product list
|
// Remove the product from the Transaction's Product list
|
||||||
|
BIN
szyfrowanie.dll
Normal file
BIN
szyfrowanie.dll
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user