From 4f406d41248efc96f3e0f8bfeed2db807e297f78 Mon Sep 17 00:00:00 2001 From: javedkhan2k2 Date: Sat, 22 Jun 2024 10:57:44 +0200 Subject: [PATCH 1/6] Added the basic structure of the Project files --- .../.vscode/launch.json | 26 ++++++++++++ .../.vscode/settings.json | 1 + .../.vscode/tasks.json | 41 +++++++++++++++++++ .../Constants/Messages.cs | 7 ++++ .../Controllers/JoggingController.cs | 13 ++++++ .../DTOs/JoggingDTOs.cs | 17 ++++++++ .../Data/JoggingDbContext.cs | 24 +++++++++++ .../Data/JoggingDbContextFactory.cs | 19 +++++++++ .../Entities/Jogging.cs | 17 ++++++++ .../Exercisetracker.javedkhan2k2.csproj | 27 ++++++++++++ .../Helpers/Helpers.cs | 37 +++++++++++++++++ .../Exercisetracker.javedkhan2k2/Program.cs | 33 +++++++++++++++ .../Interfaces/JoggingRepositoryInterface.cs | 13 ++++++ .../Repositores/JoggingRepository.cs | 41 +++++++++++++++++++ .../Interfaces/JoggingServiceInterface.cs | 6 +++ .../Services/JoggingService.cs | 14 +++++++ .../Exercisetracker.javedkhan2k2/UI/Menu.cs | 21 ++++++++++ .../UI/VisualizationEngine.cs | 41 +++++++++++++++++++ .../Exercisetracker.javedkhan2k2/UserInput.cs | 6 +++ .../Validators/ValidatorHelper.cs | 40 ++++++++++++++++++ .../Exercisetracker.sln | 22 ++++++++++ Exercisetracker.javedkhan2k2/REAMDE.md | 39 ++++++++++++++++++ 22 files changed, 505 insertions(+) create mode 100644 Exercisetracker.javedkhan2k2/.vscode/launch.json create mode 100644 Exercisetracker.javedkhan2k2/.vscode/settings.json create mode 100644 Exercisetracker.javedkhan2k2/.vscode/tasks.json create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Constants/Messages.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/DTOs/JoggingDTOs.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDbContext.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDbContextFactory.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Entities/Jogging.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2.csproj create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Helpers/Helpers.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Program.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/Interfaces/JoggingRepositoryInterface.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/JoggingRepository.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/Interfaces/JoggingServiceInterface.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/JoggingService.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/Menu.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UserInput.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Validators/ValidatorHelper.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.sln create mode 100644 Exercisetracker.javedkhan2k2/REAMDE.md diff --git a/Exercisetracker.javedkhan2k2/.vscode/launch.json b/Exercisetracker.javedkhan2k2/.vscode/launch.json new file mode 100644 index 00000000..7a248ae5 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + "version": "0.2.0", + "configurations": [ + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md + "name": ".NET Core Launch (console)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/Exercisetracker.javedkhan2k2/bin/Debug/net8.0/Exercisetracker.javedkhan2k2.dll", + "args": [], + "cwd": "${workspaceFolder}/Exercisetracker.javedkhan2k2", + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "externalTerminal", + "stopAtEntry": false + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/.vscode/settings.json b/Exercisetracker.javedkhan2k2/.vscode/settings.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/Exercisetracker.javedkhan2k2/.vscode/settings.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/.vscode/tasks.json b/Exercisetracker.javedkhan2k2/.vscode/tasks.json new file mode 100644 index 00000000..f7ce0620 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/Exercisetracker.sln", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/Exercisetracker.sln", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/Exercisetracker.sln" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Constants/Messages.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Constants/Messages.cs new file mode 100644 index 00000000..142d11f0 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Constants/Messages.cs @@ -0,0 +1,7 @@ + +namespace Shiftlogger.UI.Constants; + +public static class ExcerciseMessages +{ + +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs new file mode 100644 index 00000000..e416038a --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs @@ -0,0 +1,13 @@ +using Exercisetacker.Services; + +namespace Exercisetacker.Controllers; + +public class JoggingController +{ + private readonly JoggingService _joggingService; + + public JoggingController(JoggingService joggingService) + { + _joggingService = joggingService; + } +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/DTOs/JoggingDTOs.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/DTOs/JoggingDTOs.cs new file mode 100644 index 00000000..903bbdd5 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/DTOs/JoggingDTOs.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; + +namespace Exercisetacker.DTOs; + +public class JoggingAddDto +{ + [Required] + public DateTime DateStart { get; set; } + [Required] + public DateTime EndTime {get;set;} + [Required] + public TimeSpan Duration {get;set;} + [Required] + [MaxLength(255)] + public string Comments {get;set;} + +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDbContext.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDbContext.cs new file mode 100644 index 00000000..77174c61 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDbContext.cs @@ -0,0 +1,24 @@ +using Exercisetacker.Entities; +using Microsoft.EntityFrameworkCore; + +namespace Exercisetacker.Data; + +public class JoggingDbContext : DbContext +{ + public DbSet Joggings {get;set;} + + public JoggingDbContext(DbContextOptions options) + : base(options) + { + } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + if (!optionsBuilder.IsConfigured) + { + Console.Clear(); + Console.WriteLine("Please configure the DefaultConnection\n"); + System.Environment.Exit(0); + } + } +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDbContextFactory.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDbContextFactory.cs new file mode 100644 index 00000000..5df95ab9 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDbContextFactory.cs @@ -0,0 +1,19 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; + +namespace Exercisetacker.Data; + +public class JoggingDbContextFactory : IDesignTimeDbContextFactory +{ + public JoggingDbContext CreateDbContext(string[] args) + { + var configuration = new ConfigurationBuilder().AddUserSecrets() + .Build(); + var optionsBuilder = new DbContextOptionsBuilder(); + var connectionString = configuration.GetConnectionString("DefaultConnection"); + optionsBuilder.UseSqlServer(connectionString); + + return new JoggingDbContext(optionsBuilder.Options); + } +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Entities/Jogging.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Entities/Jogging.cs new file mode 100644 index 00000000..e5b89ae7 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Entities/Jogging.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; + +namespace Exercisetacker.Entities; + +public class Jogging +{ + public int Id { get; set; } + [Required] + public DateTime DateStart { get; set; } + [Required] + public DateTime EndTime {get;set;} + [Required] + public TimeSpan Duration {get;set;} + [Required] + [MaxLength(255)] + public string Comments {get;set;} +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2.csproj b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2.csproj new file mode 100644 index 00000000..da65a846 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2.csproj @@ -0,0 +1,27 @@ + + + + Exe + net8.0 + enable + enable + 61396ec9-45e4-445f-8a63-60038d657f78 + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Helpers/Helpers.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Helpers/Helpers.cs new file mode 100644 index 00000000..64d6f1e2 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Helpers/Helpers.cs @@ -0,0 +1,37 @@ +using Newtonsoft.Json; + +namespace Exercisetacker; + +internal static class Helpers +{ + internal static string[] ConvertToArray(IEnumerable items, Func selector) + { + if (items == null) + { + return Array.Empty(); + } + return items.Select(selector).ToArray(); + } + +} + +public static class ObjectDumper +{ + public static void Dump(object obj) + { + foreach (var prop in obj.GetType().GetProperties()) + { + var value = prop.GetValue(obj); + Console.WriteLine($"{prop.Name}: {value}"); + } + } +} + +public static class Pretty +{ + public static void Print(T obj) + { + var json = JsonConvert.SerializeObject(obj, Formatting.Indented); + Console.WriteLine(json); + } +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Program.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Program.cs new file mode 100644 index 00000000..d5594935 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Program.cs @@ -0,0 +1,33 @@ +using Exercisetacker.Data; +using Exercisetacker.UI; +using Microsoft.Extensions.Configuration; + +var builder = new ConfigurationBuilder() + .AddUserSecrets(); + +var configuration = builder.Build(); + + +var menu = new Menu(); +var runApplication = true; +while(runApplication) +{ + Console.Clear(); + var choice = menu.GetMainMenu(); + switch(choice) + { + case "View All Sessions": + break; + case "Add Jogging Session": + break; + case "Update Jogging Session": + break; + case "Delete Jogging Session": + break; + case "Exit": + runApplication = false; + break; + default: + break; + } +} diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/Interfaces/JoggingRepositoryInterface.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/Interfaces/JoggingRepositoryInterface.cs new file mode 100644 index 00000000..602cd801 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/Interfaces/JoggingRepositoryInterface.cs @@ -0,0 +1,13 @@ +using Exercisetacker.DTOs; +using Exercisetacker.Entities; + +namespace Exercisetacker.Repositories.Interfaces; + +public interface JoggingRepositoryInterface +{ + Task?> GetAllJogging(); + Task GetJoggingById(int id); + Task AddJogging(JoggingAddDto jogging); + Task UpdateJogging(Jogging jogging); + Task DeleteJoggingById(int id); +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/JoggingRepository.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/JoggingRepository.cs new file mode 100644 index 00000000..55702fa3 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/JoggingRepository.cs @@ -0,0 +1,41 @@ +using Exercisetacker.Data; +using Exercisetacker.DTOs; +using Exercisetacker.Entities; +using Exercisetacker.Repositories.Interfaces; + +namespace Exercisetacker.Repositories; + +public class JoggingRepository : JoggingRepositoryInterface +{ + private readonly JoggingDbContext _context; + + public JoggingRepository(JoggingDbContext context) + { + _context = context; + } + + public Task AddJogging(JoggingAddDto jogging) + { + throw new NotImplementedException(); + } + + public Task DeleteJoggingById(int id) + { + throw new NotImplementedException(); + } + + public Task?> GetAllJogging() + { + throw new NotImplementedException(); + } + + public Task GetJoggingById(int id) + { + throw new NotImplementedException(); + } + + public Task UpdateJogging(Jogging jogging) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/Interfaces/JoggingServiceInterface.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/Interfaces/JoggingServiceInterface.cs new file mode 100644 index 00000000..bc5a2587 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/Interfaces/JoggingServiceInterface.cs @@ -0,0 +1,6 @@ +namespace Exercisetacker.Services.Interfaces; + +public interface JoggingServiceInterface +{ + +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/JoggingService.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/JoggingService.cs new file mode 100644 index 00000000..e37a8108 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/JoggingService.cs @@ -0,0 +1,14 @@ +using Exercisetacker.Repositories; +using Exercisetacker.Services.Interfaces; + +namespace Exercisetacker.Services; + +public class JoggingService : JoggingServiceInterface +{ + private readonly JoggingRepository _joggingRepository; + + public JoggingService(JoggingRepository joggingRepository) + { + _joggingRepository = joggingRepository; + } +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/Menu.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/Menu.cs new file mode 100644 index 00000000..e5ada795 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/Menu.cs @@ -0,0 +1,21 @@ +using Spectre.Console; + +namespace Exercisetacker.UI; + +public class Menu +{ + public static string CancelOperation = $"[maroon]Go Back[/]"; + + public string[] MainMenu = ["View All Sessions", "Add Jogging Session", "Update Jogging Session", "Delete Jogging Session", "Exit"]; + public string Title = "[yellow]Please Select An [blue]Action[/] From The Options Below[/]"; + internal string GetMainMenu() + { + return AnsiConsole.Prompt( + new SelectionPrompt() + .Title(Title) + .PageSize(10) + .AddChoices(MainMenu) + ); + } + +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs new file mode 100644 index 00000000..2da3db54 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs @@ -0,0 +1,41 @@ +using Spectre.Console; +namespace Exercisetacker.UI; + +internal class VisualizationEngine +{ + + internal static void DisplayContinueMessage() + { + AnsiConsole.Markup($"\n[yellow]Press [blue]Enter[/] To Continue[/]\n"); + Console.ReadLine(); + } + + public static Table CreateTable(string title, string footer) + { + var table = new Table(); + table.Title($"[yellow]{title}[/]"); + table.Caption(footer); + table.Border = TableBorder.Square; + table.ShowRowSeparators = true; + return table; + } + + internal static void DisplayCancelOperation() + { + AnsiConsole.Markup("[maroon]The Operation is Canceled by the User.[/]\n"); + DisplayContinueMessage(); + } + + internal static void DisplayFailureMessage(string message) + { + AnsiConsole.Markup($"[maroon]{message}[/]"); + DisplayContinueMessage(); + } + + internal static void DisplaySuccessMessage(string message) + { + AnsiConsole.Markup($"[green]{message}[/]"); + DisplayContinueMessage(); + } + +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UserInput.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UserInput.cs new file mode 100644 index 00000000..5e38dc83 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UserInput.cs @@ -0,0 +1,6 @@ +namespace Exercisetacker; + +internal class UserInput +{ + +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Validators/ValidatorHelper.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Validators/ValidatorHelper.cs new file mode 100644 index 00000000..f3bb7c6d --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Validators/ValidatorHelper.cs @@ -0,0 +1,40 @@ +using System.Globalization; +using System.Text.RegularExpressions; + +namespace Exercisetacker.Validators; + +public static class ValidatorHelper +{ + public static bool IsValidName(string value) => Regex.IsMatch(value, @"^[a-zA-Z][a-zA-Z\s]{2,}$"); + + public static bool IsValidEmail(string value) => Regex.IsMatch(value, @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"); + + public static bool IsValidPhoneNumber(string value) => Regex.IsMatch(value, @"^\+49\d{10,14}$"); + + internal static bool IsValidDateTimeInput(string? date) + { + if (date != null && date == "0") + { + return true; + } + if (date == null || !DateTime.TryParseExact(date, "yyyy-MM-dd HH:mm:ss", new CultureInfo("en-US"), DateTimeStyles.None, out _)) + { + return false; + } + return true; + } + + internal static bool IsValidDateInput(string? date, string? format) + { + if (date != null && date == "0") + { + return true; + } + if (date == null || !DateTime.TryParseExact(date, format, new CultureInfo("en-US"), DateTimeStyles.None, out _)) + { + return false; + } + return true; + } + +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.sln b/Exercisetracker.javedkhan2k2/Exercisetracker.sln new file mode 100644 index 00000000..e629889d --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Exercisetracker.javedkhan2k2", "Exercisetracker.javedkhan2k2\Exercisetracker.javedkhan2k2.csproj", "{91A5F064-608D-4C3F-B13B-8CDAD0A8522A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {91A5F064-608D-4C3F-B13B-8CDAD0A8522A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91A5F064-608D-4C3F-B13B-8CDAD0A8522A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91A5F064-608D-4C3F-B13B-8CDAD0A8522A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91A5F064-608D-4C3F-B13B-8CDAD0A8522A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Exercisetracker.javedkhan2k2/REAMDE.md b/Exercisetracker.javedkhan2k2/REAMDE.md new file mode 100644 index 00000000..3fe9d1fa --- /dev/null +++ b/Exercisetracker.javedkhan2k2/REAMDE.md @@ -0,0 +1,39 @@ +# Excersie Tracking Console Application + +## Project Description + +This Application is Part of Console Application Project +at [CSharpAcademy](https://thecsharpacademy.com/project/15/drinks). + +## The Application Requirements + +* This is an application where you should record exercise data. +* You should choose one type of exercise only. We want to keep +the app simple so you focus on the subject you're learning and +not on the business complexities. +* You can choose raw SQL or Entity Framework for your data-persistence. +The model for your exercise class should have at least the following +properties: {Id INT, DateStart DateTime, DateEnd DateTime, Duration +TimeSpan, Comments string} +* Your application should have the following classes: UserInput, +ExerciseController, ExerciseService (where business logic will +be handled) and ExerciseRepository. These classes might feel empty +at first but they'll be needed in most applications as they grow. +* You can choose between SQLite or SQLServer. +* You need to use dependency injection to access the repository +from the controller. + +## How to run the Application + +Microsoft [Secret Manager](https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-8.0&tabs=windows) +is used to store and retrieve Database Connection. To run the +application set the ConnectionStrings:DefaultConnection in your Project. +e.g. dotnet user-secrets ConnectionStrings:DefaultConnection += Server=localhost;Database=Exercisetracker; +User Id=YourUserID;Password=YourPassword;TrustServerCertificate=True; +First run the Shiftlogger.javedkhan2k2 Project. This act as the API. +Now run the Shiftlogger.UI to interact with the APIs. + +## Application Usage + +Users can add/delete/edit/update Jogging Session from the Main menu. From 794457fdbfee8c2cecbbcea3292c8e6af2ccfadc Mon Sep 17 00:00:00 2001 From: javedkhan2k2 Date: Sun, 23 Jun 2024 10:31:25 +0200 Subject: [PATCH 2/6] Completed the CRUD --- .../ConsoleAppService.cs | 63 ++++++++++++ .../Constants/Messages.cs | 17 +++- .../Controllers/JoggingController.cs | 98 ++++++++++++++++++- .../DTOs/JoggingDTOs.cs | 19 ++-- .../Entities/Jogging.cs | 2 +- .../Exercisetracker.javedkhan2k2.csproj | 1 + ...0622162848_FixedTheCoulmnNames.Designer.cs | 57 +++++++++++ .../20240622162848_FixedTheCoulmnNames.cs | 38 +++++++ .../JoggingDbContextModelSnapshot.cs | 54 ++++++++++ .../Exercisetracker.javedkhan2k2/Program.cs | 66 +++++++------ ...toryInterface.cs => IJoggingRepository.cs} | 8 +- .../Repositores/JoggingRepository.cs | 31 +++--- .../Services/Interfaces/IJoggingService.cs | 13 +++ .../Interfaces/JoggingServiceInterface.cs | 6 -- .../Services/JoggingService.cs | 23 ++++- .../UI/VisualizationEngine.cs | 24 +++++ .../Exercisetracker.javedkhan2k2/UserInput.cs | 87 +++++++++++++++- .../Validators/ValidatorHelper.cs | 17 ++++ .../appsettings.json | 9 ++ 19 files changed, 563 insertions(+), 70 deletions(-) create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/ConsoleAppService.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Migrations/20240622162848_FixedTheCoulmnNames.Designer.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Migrations/20240622162848_FixedTheCoulmnNames.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Migrations/JoggingDbContextModelSnapshot.cs rename Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/Interfaces/{JoggingRepositoryInterface.cs => IJoggingRepository.cs} (52%) create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/Interfaces/IJoggingService.cs delete mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/Interfaces/JoggingServiceInterface.cs create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/appsettings.json diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/ConsoleAppService.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/ConsoleAppService.cs new file mode 100644 index 00000000..38028418 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/ConsoleAppService.cs @@ -0,0 +1,63 @@ +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Exercisetacker.Controllers; +using System; +using System.Threading; +using System.Threading.Tasks; +using Exercisetacker.UI; + +public class ConsoleAppService : IHostedService +{ + private readonly IServiceProvider _serviceProvider; + private readonly IHostApplicationLifetime _appLifetime; + + public ConsoleAppService(IServiceProvider serviceProvider, IHostApplicationLifetime appLifetime) + { + _serviceProvider = serviceProvider; + _appLifetime = appLifetime; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + using (var scope = _serviceProvider.CreateScope()) + { + var joggingController = scope.ServiceProvider.GetRequiredService(); + + var menu = new Menu(); + var runApplication = true; + while (runApplication) + { + Console.Clear(); + var choice = menu.GetMainMenu(); + switch (choice) + { + case "View All Sessions": + await joggingController.DisplayAllJoggingSessions(); + break; + case "Add Jogging Session": + await joggingController.AddJogging(); + break; + case "Update Jogging Session": + await joggingController.UpdateJogging(); + break; + case "Delete Jogging Session": + await joggingController.DeleteJogging(); + break; + case "Exit": + runApplication = false; + _appLifetime.StopApplication(); + break; + default: + break; + } + } + } + await Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + +} diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Constants/Messages.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Constants/Messages.cs index 142d11f0..cba88788 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Constants/Messages.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Constants/Messages.cs @@ -1,7 +1,20 @@ + namespace Shiftlogger.UI.Constants; -public static class ExcerciseMessages +public static class Messages { - + public static readonly string StartDateUpdate = "Do you want to Update Start Date and Time"; + public static readonly string StartTime = "Enter Start date and time in [bold green](yyyy-MM-dd HH:mm:ss)[/] format."; + public static readonly string EndDateUpdate = "Do you want to Update End Date and Time"; + public static readonly string EndTime = "Enter End date and time in [bold green](yyyy-MM-dd HH:mm:ss)[/] format."; + public static readonly string CommentsUpdate = "Do you want to Update Comments"; + public static readonly string Comments = "Enter Comments for the Jogging Session"; + public static readonly string TimeFormat = "yyyy-MM-dd HH:mm:ss"; + + internal static string GetCommentsUpdate(string comments) => $"{CommentsUpdate} [maroon]{comments}[/]?"; + + internal static object GetEndDateUpdate(DateTime dateEnd) => $"{EndDateUpdate} [maroon]{dateEnd}[/]?"; + + internal static object GetStartDateUpdate(DateTime dateStart) => $"{StartDateUpdate} [maroon]{dateStart}[/]?"; } \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs index e416038a..a571e2f1 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs @@ -1,13 +1,105 @@ -using Exercisetacker.Services; +using Exercisetacker.Services.Interfaces; +using Exercisetacker.UI; namespace Exercisetacker.Controllers; public class JoggingController { - private readonly JoggingService _joggingService; + private readonly IJoggingService _joggingService; - public JoggingController(JoggingService joggingService) + public JoggingController(IJoggingService joggingService) { _joggingService = joggingService; } + + public async Task DisplayAllJoggingSessions() + { + var joggings = await _joggingService.GetAllJoggings(); + VisualizationEngine.DisplayAllJoggings(joggings, "Showing All Jogging Sessions"); + VisualizationEngine.DisplayContinueMessage(); + } + + internal async Task AddJogging() + { + var jogging = UserInput.GetNewJogging(); + + if (jogging == null) + { + VisualizationEngine.DisplayCancelOperation(); + return; + } + + var addedjogging = await _joggingService.AddJogging(jogging); + if (addedjogging == null) + { + VisualizationEngine.DisplayFailureMessage("Jogging Session is not added to database."); + } + else + { + VisualizationEngine.DisplaySuccessMessage("Jogging Session is added to database successfully."); + } + } + + internal async Task UpdateJogging() + { + var joggings = await _joggingService.GetAllJoggings(); + VisualizationEngine.DisplayAllJoggings(joggings, "All Joggings Table"); + int joggingId = UserInput.GetIntInput(); + if(joggingId == 0) + { + VisualizationEngine.DisplayCancelOperation(); + return; + } + + var jogging = await _joggingService.GetJoggingById(joggingId); + + if(jogging == null) + { + VisualizationEngine.DisplayFailureMessage($"Jogging with id: [green]{joggingId}[/] not found."); + return; + } + + if(!UserInput.UpdateJogging(jogging)) + { + VisualizationEngine.DisplayCancelOperation(); + return; + } + if(await _joggingService.UpdateJogging(jogging) == 0) + { + VisualizationEngine.DisplayFailureMessage("Jogging is not updated."); + } + else + { + VisualizationEngine.DisplaySuccessMessage("Jogging is updated."); + } + } + + internal async Task DeleteJogging() + { + var joggings = await _joggingService.GetAllJoggings(); + VisualizationEngine.DisplayAllJoggings(joggings, "All Joggings Table"); + int joggingId = UserInput.GetIntInput(); + if(joggingId == 0) + { + VisualizationEngine.DisplayCancelOperation(); + return; + } + + var jogging = await _joggingService.GetJoggingById(joggingId); + + if(jogging == null) + { + VisualizationEngine.DisplayFailureMessage($"Jogging with id: [green]{joggingId}[/] not found."); + return; + } + + if(await _joggingService.DeleteJogging(jogging) == 0) + { + VisualizationEngine.DisplayFailureMessage("Jogging is not updated."); + } + else + { + VisualizationEngine.DisplaySuccessMessage("Jogging is updated."); + } + } } \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/DTOs/JoggingDTOs.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/DTOs/JoggingDTOs.cs index 903bbdd5..7c8c9ae7 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/DTOs/JoggingDTOs.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/DTOs/JoggingDTOs.cs @@ -1,17 +1,24 @@ using System.ComponentModel.DataAnnotations; +using Exercisetacker.Entities; namespace Exercisetacker.DTOs; public class JoggingAddDto { - [Required] public DateTime DateStart { get; set; } - [Required] - public DateTime EndTime {get;set;} - [Required] + public DateTime DateEnd {get;set;} public TimeSpan Duration {get;set;} - [Required] - [MaxLength(255)] public string Comments {get;set;} + public Jogging ToJogging() + { + return new Jogging + { + DateStart = this.DateStart, + DateEnd = this.DateEnd, + Duration = this.Duration, + Comments = this.Comments + }; + } + } \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Entities/Jogging.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Entities/Jogging.cs index e5b89ae7..03ed6c0f 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Entities/Jogging.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Entities/Jogging.cs @@ -8,7 +8,7 @@ public class Jogging [Required] public DateTime DateStart { get; set; } [Required] - public DateTime EndTime {get;set;} + public DateTime DateEnd {get;set;} [Required] public TimeSpan Duration {get;set;} [Required] diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2.csproj b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2.csproj index da65a846..4c9c08b9 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2.csproj +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2.csproj @@ -21,6 +21,7 @@ all + diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Migrations/20240622162848_FixedTheCoulmnNames.Designer.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Migrations/20240622162848_FixedTheCoulmnNames.Designer.cs new file mode 100644 index 00000000..96fbc1b8 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Migrations/20240622162848_FixedTheCoulmnNames.Designer.cs @@ -0,0 +1,57 @@ +// +using System; +using Exercisetacker.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Exercisetracker.javedkhan2k2.Migrations +{ + [DbContext(typeof(JoggingDbContext))] + [Migration("20240622162848_FixedTheCoulmnNames")] + partial class FixedTheCoulmnNames + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Exercisetacker.Entities.Jogging", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Comments") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("DateEnd") + .HasColumnType("datetime2"); + + b.Property("DateStart") + .HasColumnType("datetime2"); + + b.Property("Duration") + .HasColumnType("time"); + + b.HasKey("Id"); + + b.ToTable("Joggings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Migrations/20240622162848_FixedTheCoulmnNames.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Migrations/20240622162848_FixedTheCoulmnNames.cs new file mode 100644 index 00000000..7a8e440b --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Migrations/20240622162848_FixedTheCoulmnNames.cs @@ -0,0 +1,38 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Exercisetracker.javedkhan2k2.Migrations +{ + /// + public partial class FixedTheCoulmnNames : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Joggings", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + DateStart = table.Column(type: "datetime2", nullable: false), + DateEnd = table.Column(type: "datetime2", nullable: false), + Duration = table.Column(type: "time", nullable: false), + Comments = table.Column(type: "nvarchar(255)", maxLength: 255, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Joggings", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Joggings"); + } + } +} diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Migrations/JoggingDbContextModelSnapshot.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Migrations/JoggingDbContextModelSnapshot.cs new file mode 100644 index 00000000..0d826478 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Migrations/JoggingDbContextModelSnapshot.cs @@ -0,0 +1,54 @@ +// +using System; +using Exercisetacker.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Exercisetracker.javedkhan2k2.Migrations +{ + [DbContext(typeof(JoggingDbContext))] + partial class JoggingDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Exercisetacker.Entities.Jogging", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Comments") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("DateEnd") + .HasColumnType("datetime2"); + + b.Property("DateStart") + .HasColumnType("datetime2"); + + b.Property("Duration") + .HasColumnType("time"); + + b.HasKey("Id"); + + b.ToTable("Joggings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Program.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Program.cs index d5594935..095dd67d 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Program.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Program.cs @@ -1,33 +1,43 @@ -using Exercisetacker.Data; -using Exercisetacker.UI; +using Exercisetacker.Controllers; +using Exercisetacker.Data; +using Exercisetacker.Repositories; +using Exercisetacker.Repositories.Interfaces; +using Exercisetacker.Services; +using Exercisetacker.Services.Interfaces; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; -var builder = new ConfigurationBuilder() - .AddUserSecrets(); +var host = Host.CreateDefaultBuilder(args) + .ConfigureAppConfiguration((context, config) => + { + config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); + config.AddUserSecrets(); + }) + .ConfigureLogging((context, logging) => + { + logging.ClearProviders(); + logging.AddConsole(); + logging.AddConfiguration(context.Configuration.GetSection("Logging")); + }) + .ConfigureServices((context, services) => + { + var connectionString = context.Configuration.GetConnectionString("DefaultConnection"); -var configuration = builder.Build(); + services.AddDbContext(options => + { + options.UseSqlServer(connectionString); + options.LogTo(Console.WriteLine, LogLevel.Warning); // Configure EF Core to log at Warning level + }); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); -var menu = new Menu(); -var runApplication = true; -while(runApplication) -{ - Console.Clear(); - var choice = menu.GetMainMenu(); - switch(choice) - { - case "View All Sessions": - break; - case "Add Jogging Session": - break; - case "Update Jogging Session": - break; - case "Delete Jogging Session": - break; - case "Exit": - runApplication = false; - break; - default: - break; - } -} + services.AddHostedService(); + }) + .Build(); + +await host.RunAsync(); \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/Interfaces/JoggingRepositoryInterface.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/Interfaces/IJoggingRepository.cs similarity index 52% rename from Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/Interfaces/JoggingRepositoryInterface.cs rename to Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/Interfaces/IJoggingRepository.cs index 602cd801..bb1e8e04 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/Interfaces/JoggingRepositoryInterface.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/Interfaces/IJoggingRepository.cs @@ -3,11 +3,11 @@ namespace Exercisetacker.Repositories.Interfaces; -public interface JoggingRepositoryInterface +public interface IJoggingRepository { Task?> GetAllJogging(); Task GetJoggingById(int id); - Task AddJogging(JoggingAddDto jogging); - Task UpdateJogging(Jogging jogging); - Task DeleteJoggingById(int id); + Task AddJogging(Jogging jogging); + Task UpdateJogging(Jogging jogging); + Task DeleteJogging(Jogging jogging); } \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/JoggingRepository.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/JoggingRepository.cs index 55702fa3..1cc62f97 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/JoggingRepository.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/JoggingRepository.cs @@ -2,10 +2,11 @@ using Exercisetacker.DTOs; using Exercisetacker.Entities; using Exercisetacker.Repositories.Interfaces; +using Microsoft.EntityFrameworkCore; namespace Exercisetacker.Repositories; -public class JoggingRepository : JoggingRepositoryInterface +public class JoggingRepository : IJoggingRepository { private readonly JoggingDbContext _context; @@ -14,28 +15,28 @@ public JoggingRepository(JoggingDbContext context) _context = context; } - public Task AddJogging(JoggingAddDto jogging) + public async Task AddJogging(Jogging jogging) { - throw new NotImplementedException(); + _context.Add(jogging); + await _context.SaveChangesAsync(); + return jogging; } - public Task DeleteJoggingById(int id) + public async Task UpdateJogging(Jogging jogging) { - throw new NotImplementedException(); + _context.Update(jogging); + return await _context.SaveChangesAsync(); } - public Task?> GetAllJogging() + public async Task DeleteJogging(Jogging jogging) { - throw new NotImplementedException(); + _context.Remove(jogging); + return await _context.SaveChangesAsync(); + } - public Task GetJoggingById(int id) - { - throw new NotImplementedException(); - } + public async Task?> GetAllJogging() => await _context.Joggings.ToListAsync(); - public Task UpdateJogging(Jogging jogging) - { - throw new NotImplementedException(); - } + public async Task GetJoggingById(int id) => await _context.Joggings.FirstOrDefaultAsync(j => j.Id == id); + } \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/Interfaces/IJoggingService.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/Interfaces/IJoggingService.cs new file mode 100644 index 00000000..68f21739 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/Interfaces/IJoggingService.cs @@ -0,0 +1,13 @@ +using Exercisetacker.DTOs; +using Exercisetacker.Entities; + +namespace Exercisetacker.Services.Interfaces; + +public interface IJoggingService +{ + Task?> GetAllJoggings(); + Task GetJoggingById(int id); + Task AddJogging(JoggingAddDto jogging); + Task UpdateJogging(Jogging jogging); + Task DeleteJogging(Jogging jogging); +} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/Interfaces/JoggingServiceInterface.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/Interfaces/JoggingServiceInterface.cs deleted file mode 100644 index bc5a2587..00000000 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/Interfaces/JoggingServiceInterface.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Exercisetacker.Services.Interfaces; - -public interface JoggingServiceInterface -{ - -} \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/JoggingService.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/JoggingService.cs index e37a8108..7a7cb2d1 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/JoggingService.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Services/JoggingService.cs @@ -1,14 +1,29 @@ -using Exercisetacker.Repositories; +using Exercisetacker.DTOs; +using Exercisetacker.Entities; +using Exercisetacker.Repositories.Interfaces; using Exercisetacker.Services.Interfaces; namespace Exercisetacker.Services; -public class JoggingService : JoggingServiceInterface +public class JoggingService : IJoggingService { - private readonly JoggingRepository _joggingRepository; + private readonly IJoggingRepository _joggingRepository; - public JoggingService(JoggingRepository joggingRepository) + public JoggingService(IJoggingRepository joggingRepository) { _joggingRepository = joggingRepository; } + + public async Task AddJogging(JoggingAddDto jogging) + { + return await _joggingRepository.AddJogging(jogging.ToJogging()); + } + + public async Task DeleteJogging(Jogging jogging) => await _joggingRepository.DeleteJogging(jogging); + + public async Task?> GetAllJoggings() => await _joggingRepository.GetAllJogging(); + + public async Task GetJoggingById(int id) => await _joggingRepository.GetJoggingById(id); + + public async Task UpdateJogging(Jogging jogging) => await _joggingRepository.UpdateJogging(jogging); } \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs index 2da3db54..9e573dd9 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs @@ -1,3 +1,5 @@ +using System.Diagnostics.CodeAnalysis; +using Exercisetacker.Entities; using Spectre.Console; namespace Exercisetacker.UI; @@ -38,4 +40,26 @@ internal static void DisplaySuccessMessage(string message) DisplayContinueMessage(); } + internal static void DisplayDateTimeError() + { + AnsiConsole.Markup("[maroon]The End Date Time should be later than Start Date Time.[/]\n"); + DisplayContinueMessage(); + } + + internal static void DisplayAllJoggings(List? joggings, [AllowNull] string title) + { + //AnsiConsole.Clear(); + if (title == null) + { + title = ""; + } + var table = CreateTable(title, $"[yellow]Displaying [blue]{joggings.Count()}[/] records[/]"); + table.AddColumns(["[green]Id[/]", "[green]Start Time[/]", "[green]End Time[/]", "[green]Duration[/]", "[green]Comments[/]"]); + foreach (var jogging in joggings) + { + table.AddRow(jogging.Id.ToString(), jogging.DateStart.ToString(), jogging.DateEnd.ToString(), jogging.Duration.ToString(), jogging.Comments); + } + AnsiConsole.Write(table); + } + } \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UserInput.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UserInput.cs index 5e38dc83..2540c08e 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UserInput.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UserInput.cs @@ -1,6 +1,91 @@ + +using System.Globalization; +using Exercisetacker.DTOs; +using Exercisetacker.Entities; +using Exercisetacker.UI; +using Exercisetacker.Validators; +using Shiftlogger.UI.Constants; +using Spectre.Console; + namespace Exercisetacker; internal class UserInput { - + internal static JoggingAddDto? GetNewJogging() + { + JoggingAddDto jogging = new JoggingAddDto(); + do + { + jogging.DateStart = GetDateInput("Enter Start date and time in [bold green](yyyy-MM-dd HH:mm:ss)[/] format.", "yyyy-MM-dd HH:mm:ss"); + if (jogging.DateStart == DateTime.MinValue) return null; + + jogging.DateEnd = GetDateInput("Enter End date and time in [bold green](yyyy-MM-dd HH:mm:ss)[/] format.", "yyyy-MM-dd HH:mm:ss"); + if (jogging.DateEnd == DateTime.MinValue) return null; + + if (ValidatorHelper.isValidDateTimeInputs(jogging.ToJogging())) + { + jogging.Duration = jogging.DateEnd.Subtract(jogging.DateStart); + break; + } + + } while (true); + jogging.Comments = GetStringInput("Enter Comments for the Jogging Session"); + if(jogging.Comments == "") return null; + + return jogging; + } + + internal static bool UpdateJogging(Jogging jogging) + { + do + { + jogging.DateStart = AnsiConsole.Confirm($"{Messages.GetStartDateUpdate(jogging.DateStart)}") ? GetDateInput(Messages.StartTime, Messages.TimeFormat) : jogging.DateStart; + if (jogging.DateStart == DateTime.MinValue) return false; + + jogging.DateEnd = AnsiConsole.Confirm($"{Messages.GetEndDateUpdate(jogging.DateEnd)}") ? GetDateInput(Messages.EndTime, Messages.TimeFormat) : jogging.DateEnd; + if (jogging.DateEnd == DateTime.MinValue) return false; + + if (ValidatorHelper.isValidDateTimeInputs(jogging)) + { + jogging.Duration = jogging.DateEnd.Subtract(jogging.DateStart); + break; + } + else + { + VisualizationEngine.DisplayDateTimeError(); + } + + } while (true); + jogging.Comments = AnsiConsole.Confirm(Messages.GetCommentsUpdate(jogging.Comments)) ? GetStringInput(Messages.Comments) : jogging.Comments; + if(jogging.Comments == "") return false; + + return true; + } + + private static string GetStringInput(string message) + { + string? userInput = AnsiConsole.Ask($"{message} Or Enter 0 to cancel:"); + while(!ValidatorHelper.IsValidComment(userInput)) + { + userInput = AnsiConsole.Ask($"[bold]Invalid input [red]({userInput})[/][/].\n{message} Or Enter 0 to cancel:"); + } + return userInput == "0" ? "" : userInput; + } + + internal static DateTime GetDateInput(string message, string format) + { + string? userInput = AnsiConsole.Ask($"{message} Or Enter 0 to cancel:"); + while (!ValidatorHelper.IsValidDateInput(userInput, format)) + { + userInput = AnsiConsole.Ask($"[bold]Invalid input [red]({userInput})[/][/].\n{message} Or Enter 0 to cancel:"); + } + return userInput == "0" ? DateTime.MinValue : DateTime.ParseExact(userInput, format, new CultureInfo("en-US")); + } + + internal static int GetIntInput() + { + int id = AnsiConsole.Ask("Enter an Id from the table Or Enter 0 to Cancel: "); + return id; + } + } \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Validators/ValidatorHelper.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Validators/ValidatorHelper.cs index f3bb7c6d..72bb2faf 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Validators/ValidatorHelper.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Validators/ValidatorHelper.cs @@ -1,5 +1,7 @@ using System.Globalization; using System.Text.RegularExpressions; +using Exercisetacker.Entities; +using Microsoft.IdentityModel.Tokens; namespace Exercisetacker.Validators; @@ -37,4 +39,19 @@ internal static bool IsValidDateInput(string? date, string? format) return true; } + internal static bool IsValidComment(string? userInput) + { + if (userInput != null && userInput == "0") + { + return true; + } + if(userInput.IsNullOrEmpty() || userInput.Length > 255) + { + return false; + } + return true; + } + + internal static bool isValidDateTimeInputs(Jogging jogging) => DateTime.Compare(jogging.DateEnd, jogging.DateStart) > 0 ? true : false; + } \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/appsettings.json b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/appsettings.json new file mode 100644 index 00000000..7e148d5d --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Warning", + "Microsoft": "Warning", + "Microsoft.EntityFrameworkCore.Database.Command": "Warning" + } + } +} \ No newline at end of file From 423a1223e4d30ed857dcf4a027ef8852a0270ee9 Mon Sep 17 00:00:00 2001 From: javedkhan2k2 Date: Sun, 23 Jun 2024 11:07:24 +0200 Subject: [PATCH 3/6] Fixed Codacy issues --- .../Controllers/JoggingController.cs | 2 +- .../Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs | 1 - .../Exercisetracker.javedkhan2k2/UserInput.cs | 6 +++--- .../Validators/ValidatorHelper.cs | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs index a571e2f1..0a99125a 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs @@ -59,7 +59,7 @@ internal async Task UpdateJogging() return; } - if(!UserInput.UpdateJogging(jogging)) + if(!UserInput.GetUpdateJogging(jogging)) { VisualizationEngine.DisplayCancelOperation(); return; diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs index 9e573dd9..f75b83b3 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UI/VisualizationEngine.cs @@ -48,7 +48,6 @@ internal static void DisplayDateTimeError() internal static void DisplayAllJoggings(List? joggings, [AllowNull] string title) { - //AnsiConsole.Clear(); if (title == null) { title = ""; diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UserInput.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UserInput.cs index 2540c08e..c91e0e0d 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UserInput.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/UserInput.cs @@ -22,7 +22,7 @@ internal class UserInput jogging.DateEnd = GetDateInput("Enter End date and time in [bold green](yyyy-MM-dd HH:mm:ss)[/] format.", "yyyy-MM-dd HH:mm:ss"); if (jogging.DateEnd == DateTime.MinValue) return null; - if (ValidatorHelper.isValidDateTimeInputs(jogging.ToJogging())) + if (ValidatorHelper.IsValidDateTimeInputs(jogging.ToJogging())) { jogging.Duration = jogging.DateEnd.Subtract(jogging.DateStart); break; @@ -35,7 +35,7 @@ internal class UserInput return jogging; } - internal static bool UpdateJogging(Jogging jogging) + internal static bool GetUpdateJogging(Jogging jogging) { do { @@ -45,7 +45,7 @@ internal static bool UpdateJogging(Jogging jogging) jogging.DateEnd = AnsiConsole.Confirm($"{Messages.GetEndDateUpdate(jogging.DateEnd)}") ? GetDateInput(Messages.EndTime, Messages.TimeFormat) : jogging.DateEnd; if (jogging.DateEnd == DateTime.MinValue) return false; - if (ValidatorHelper.isValidDateTimeInputs(jogging)) + if (ValidatorHelper.IsValidDateTimeInputs(jogging)) { jogging.Duration = jogging.DateEnd.Subtract(jogging.DateStart); break; diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Validators/ValidatorHelper.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Validators/ValidatorHelper.cs index 72bb2faf..c490cd45 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Validators/ValidatorHelper.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Validators/ValidatorHelper.cs @@ -52,6 +52,6 @@ internal static bool IsValidComment(string? userInput) return true; } - internal static bool isValidDateTimeInputs(Jogging jogging) => DateTime.Compare(jogging.DateEnd, jogging.DateStart) > 0 ? true : false; + internal static bool IsValidDateTimeInputs(Jogging jogging) => DateTime.Compare(jogging.DateEnd, jogging.DateStart) > 0 ? true : false; } \ No newline at end of file From 506eb6583ef086b19c96f01900c46d141e43df57 Mon Sep 17 00:00:00 2001 From: javedkhan2k2 Date: Sun, 23 Jun 2024 11:21:00 +0200 Subject: [PATCH 4/6] updated the file --- .../Data/JoggingDapperDbContext.cs | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDapperDbContext.cs diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDapperDbContext.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDapperDbContext.cs new file mode 100644 index 00000000..6baf4d3c --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDapperDbContext.cs @@ -0,0 +1,6 @@ +namespace Exercisetacker.Data; + +public class JoggingDapperDbContext +{ + public string name { get; set; } +} \ No newline at end of file From d7e2b9668a3845371154ae1ed9f60c074702d0fd Mon Sep 17 00:00:00 2001 From: javedkhan2k2 Date: Sun, 23 Jun 2024 13:06:57 +0200 Subject: [PATCH 5/6] Branch Challenge Completed --- .../Controllers/JoggingController.cs | 5 +- .../Data/JoggingDapperDbContext.cs | 106 +++++++++++++++++- .../Exercisetracker.javedkhan2k2.csproj | 1 + .../Exercisetracker.javedkhan2k2/Program.cs | 8 +- .../Repositores/JoggingDapperRepository.cs | 42 +++++++ 5 files changed, 153 insertions(+), 9 deletions(-) create mode 100644 Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/JoggingDapperRepository.cs diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs index 0a99125a..1a325c85 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Controllers/JoggingController.cs @@ -95,11 +95,12 @@ internal async Task DeleteJogging() if(await _joggingService.DeleteJogging(jogging) == 0) { - VisualizationEngine.DisplayFailureMessage("Jogging is not updated."); + VisualizationEngine.DisplayFailureMessage("Jogging is not deleted."); } else { - VisualizationEngine.DisplaySuccessMessage("Jogging is updated."); + VisualizationEngine.DisplaySuccessMessage("Jogging is deleted."); } } + } \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDapperDbContext.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDapperDbContext.cs index 6baf4d3c..1f32e265 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDapperDbContext.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDapperDbContext.cs @@ -1,6 +1,110 @@ +using Dapper; +using Exercisetacker.Entities; +using Exercisetacker.Services; +using Microsoft.Data.SqlClient; + namespace Exercisetacker.Data; public class JoggingDapperDbContext { - public string name { get; set; } + private string _connectionString { get; init; } + + public JoggingDapperDbContext(string connectionString) + { + _connectionString = connectionString; + CreateTable(); + } + + private SqlConnection? GetConnection() + { + return new SqlConnection(_connectionString); + } + + private void CreateTable() + { + var sql = @"IF OBJECT_ID(N'[dbo].[Joggings]', 'U') IS NULL + Create Table Joggings ( + Id INT IDENTITY (1,1) NOT NULL, + DateStart DateTime2 NOT NULL, + DateEnd DateTime2 NOT NULL, + Duration TIME NOT NULL, + Comments VARCHAR(255) NOT NULL, + CONSTRAINT [PK_Joggings] Primary Key CLUSTERED ([Id] Asc) + )"; + using (var connection = GetConnection()) + { + connection.Open(); + connection.Execute(sql); + } + } + + public async Task> GetAllAsync() + { + var sql = @$"Select * from Joggings ORDER BY Id Asc;"; + using (var connection = GetConnection()) + { + connection.Open(); + var result = await connection.QueryAsync(sql); + return result.ToList(); + } + } + + public async Task FirstOrDefaultAsync(int id) + { + var sql = @$"Select * from Joggings WHERE Id = @Id;"; + using (var connection = GetConnection()) + { + connection.Open(); + var result = await connection.QueryFirstOrDefaultAsync(sql, new { Id = id }); + return result; + } + } + + internal async Task Add(Jogging parameters) + { + var sql = @$"INSERT INTO Joggings + (DateStart, DateEnd, Duration, Comments) + VALUES(@DateStart, @DateEnd, @Duration, @Comments); + SELECT CAST(SCOPE_IDENTITY() as int);"; + using (var connection = GetConnection()) + { + connection.Open(); + var newId = await connection.ExecuteScalarAsync(sql, parameters); + //var sqlSelect = @$"SELECT * FROM Joggings WHERE Id = @Id;"; + var addedJogging = await FirstOrDefaultAsync(newId); + return addedJogging; + } + } + + internal async Task Update(Jogging parameters) + { + var sql = @$"UPDATE Joggings + SET + DateStart = @DateStart, + DateEnd = @DateEnd, + Duration = @Duration, + Comments = @Comments + WHERE Id = @Id + "; + using (var connection = GetConnection()) + { + connection.Open(); + return await connection.ExecuteAsync(sql, parameters); + } + } + + internal async Task Remove(Jogging parameters) + { + var sql = @$"DELETE FROM Joggings + WHERE Id = @Id + "; + using (var connection = GetConnection()) + { + connection.Open(); + return await connection.ExecuteAsync(sql, parameters); + } + } + + + } \ No newline at end of file diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2.csproj b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2.csproj index 4c9c08b9..eca324da 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2.csproj +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2.csproj @@ -9,6 +9,7 @@ + diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Program.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Program.cs index 095dd67d..5db6cb44 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Program.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Program.cs @@ -26,13 +26,9 @@ { var connectionString = context.Configuration.GetConnectionString("DefaultConnection"); - services.AddDbContext(options => - { - options.UseSqlServer(connectionString); - options.LogTo(Console.WriteLine, LogLevel.Warning); // Configure EF Core to log at Warning level - }); + services.AddSingleton(new JoggingDapperDbContext(connectionString)); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/JoggingDapperRepository.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/JoggingDapperRepository.cs new file mode 100644 index 00000000..1b98c704 --- /dev/null +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Repositores/JoggingDapperRepository.cs @@ -0,0 +1,42 @@ +using Exercisetacker.Data; +using Exercisetacker.DTOs; +using Exercisetacker.Entities; +using Exercisetacker.Repositories.Interfaces; +using Microsoft.EntityFrameworkCore; + +namespace Exercisetacker.Repositories; + +public class JoggingDapperRepository : IJoggingRepository +{ + private readonly JoggingDapperDbContext _context; + + public JoggingDapperRepository(JoggingDapperDbContext context) + { + _context = context; + } + + public async Task AddJogging(Jogging jogging) + { + var result = await _context.Add(jogging); + + return result; + } + + public async Task UpdateJogging(Jogging jogging) + { + int result = await _context.Update(jogging); + return result; + } + + public async Task DeleteJogging(Jogging jogging) + { + int result = await _context.Remove(jogging); + return result; + + } + + public async Task?> GetAllJogging() => await _context.GetAllAsync(); + + public async Task GetJoggingById(int id) => await _context.FirstOrDefaultAsync(id); + +} \ No newline at end of file From 13aa580252f93768b8e921f730bde2db377584c8 Mon Sep 17 00:00:00 2001 From: javedkhan2k2 Date: Sun, 23 Jun 2024 14:14:41 +0200 Subject: [PATCH 6/6] Fixed codacy issues --- .../Data/JoggingDapperDbContext.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDapperDbContext.cs b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDapperDbContext.cs index 1f32e265..3f82b23b 100644 --- a/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDapperDbContext.cs +++ b/Exercisetracker.javedkhan2k2/Exercisetracker.javedkhan2k2/Data/JoggingDapperDbContext.cs @@ -7,17 +7,17 @@ namespace Exercisetacker.Data; public class JoggingDapperDbContext { - private string _connectionString { get; init; } + private string ConnectionString { get; init; } public JoggingDapperDbContext(string connectionString) { - _connectionString = connectionString; + ConnectionString = connectionString; CreateTable(); } private SqlConnection? GetConnection() { - return new SqlConnection(_connectionString); + return new SqlConnection(ConnectionString); } private void CreateTable() @@ -70,7 +70,6 @@ internal async Task Add(Jogging parameters) { connection.Open(); var newId = await connection.ExecuteScalarAsync(sql, parameters); - //var sqlSelect = @$"SELECT * FROM Joggings WHERE Id = @Id;"; var addedJogging = await FirstOrDefaultAsync(newId); return addedJogging; }