From 01509e372bfa71d09ea2227d810d89c66afde600 Mon Sep 17 00:00:00 2001 From: Joel Date: Wed, 29 Jul 2026 21:25:04 +0100 Subject: [PATCH 01/11] Add Coding tracker project --- Coding-Tracker/.vscode/launch.json | 20 +++ .../Coding-Tracker/Coding tracker.txt | 77 +++++++++++ .../Coding-Tracker/Coding-Tracker.csproj | 28 ++++ .../Coding-Tracker/Coding-Tracker.db | Bin 0 -> 12288 bytes .../Coding-Tracker/CodingController.cs | 123 ++++++++++++++++++ .../Coding-Tracker/CodingSession.cs | 15 +++ Coding-Tracker/Coding-Tracker/Program1.cs | 18 +++ Coding-Tracker/Coding-Tracker/UserInput.cs | 118 +++++++++++++++++ Coding-Tracker/Coding-Tracker/Validation.cs | 37 ++++++ .../Coding-Tracker/appsettings.json | 5 + 10 files changed, 441 insertions(+) create mode 100644 Coding-Tracker/.vscode/launch.json create mode 100644 Coding-Tracker/Coding-Tracker/Coding tracker.txt create mode 100644 Coding-Tracker/Coding-Tracker/Coding-Tracker.csproj create mode 100644 Coding-Tracker/Coding-Tracker/Coding-Tracker.db create mode 100644 Coding-Tracker/Coding-Tracker/CodingController.cs create mode 100644 Coding-Tracker/Coding-Tracker/CodingSession.cs create mode 100644 Coding-Tracker/Coding-Tracker/Program1.cs create mode 100644 Coding-Tracker/Coding-Tracker/UserInput.cs create mode 100644 Coding-Tracker/Coding-Tracker/Validation.cs create mode 100644 Coding-Tracker/Coding-Tracker/appsettings.json diff --git a/Coding-Tracker/.vscode/launch.json b/Coding-Tracker/.vscode/launch.json new file mode 100644 index 000000000..af41789e1 --- /dev/null +++ b/Coding-Tracker/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "External Terminal, .NET Core Launch (console)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "${defaultBuildTask}", + "program": "C:/Users/j_men/Coding-Tracker/Coding-Tracker/bin/debug/net10.0/Coding-Tracker.dll", + "args": [], + "cwd": "${workspaceFolder}/Coding-tracker", + "stopAtEntry": false, + "console": "externalTerminal" + } + ], + +} \ No newline at end of file diff --git a/Coding-Tracker/Coding-Tracker/Coding tracker.txt b/Coding-Tracker/Coding-Tracker/Coding tracker.txt new file mode 100644 index 000000000..4d102d5c4 --- /dev/null +++ b/Coding-Tracker/Coding-Tracker/Coding tracker.txt @@ -0,0 +1,77 @@ +Coding tracker + +I was tasked with creating a coding tracker, an application that allows the user to Create, View/Read, Update and Delete any record that users enter. + +I needed four classes and a program file that acts as the entry point for the program. + +The coding tracker differs from the habit tracker in a few areas, the habit tracker used ADO.NET to write to the databse and to view the database we used an external terminal. + +The habit tracker also holds all the data in one class (program.cs) whereas the coding tracker uses separation of concerns to split the different functions into classes. + +An appsettings.json file was created so I could place the database connectionstring inside of it, to access the string I created a configuration builder which adds the file and builds it + +we store our new configuration as connectionstring, so whenever our database needs accessing we call on "connectionstring" which holds the data source of our database. + + +CodingController +The coding controller class is responsible for database operations this is where we make use of Dapper and Spectre. +Dapper is used to simplify the commands we need to communicate with our database. +Spectre was used in this project to present our data in a table in the terminal which makes viewing our user input neater and more presentable. + + +I created a CreateTable Method that uses the Dapper syntax to execute the SQL to create the table with the variables I chose, ID, StartTime, EndTime and duration. We use the connectionstring we created to create a variable that will communicate with the database. + +Create table is called as we need to create the table before anything happens. +I needed to create a method called viewRecords that contained my initial record viewer method GETallrecords as I faced issues with user input. +The method calls get all records then asks the user to "Press any key to return to main menu" followed by a readkey that exits the method. + +Getallrecords clears the console, uses connectionstring to create connectionString to create a connection to the SQLite database. It maps each row from the table to the coding tracker object. + +The returned collection is converted into a List and stored in the tableData variable. + +I created a new table and added columns for each variable where each variable would go. +we use a foreach loop to add rows, we convert the output tostring and write them to the table. + +The Insert, Delete and update methods in coding controller rely on variables being passed in. + +The insert method needs two variables startime and endtime as we need the two to calculate duration +The delete method needs an id to delete so we must pass in an id. +The update method needs id , startTime and datetime to overwrite the initial values. + +The variables being passed into the controller methods rely on user input. + +UserInput + +User input has methods that take the users input and pass them into our controller class methods to do calculations and to insert, delete or update records before putting them into the database. + +GeTimeInput - used to gather users input for StartTime and End Time methods. +The method is designed to write a question, collect users input and return the input after being validated. +The ValidateTime method from the Validation class is used here + +The variable we use to gather the users input is passed into ValidateTime + +This method has a string parameter that asks the user what to enter +When called upon we must write the question we are asking the user for example in InsertInput; + +startTime = GeTimeInput("Please enter the start Time Format: (HH:mm), Or enter 0 to exit."); +endTime = GeTimeInput("Please enter the end Time Format: (HH:mm), Or enter 0 to exit."); + +Then inside InsertInput when we call input " CodingController.Insert(startTime, endTime);" + +startTime and EndTime were passed into the method. + +InsertInput - Used to pass user input into the insert method + +DeleteInput - Used to pass user input into the delete method +clear the console +call the records +ask the record that we want to delete +collect it pass the input into our validation method +pass the collected input into the delete method. + + + + + + + diff --git a/Coding-Tracker/Coding-Tracker/Coding-Tracker.csproj b/Coding-Tracker/Coding-Tracker/Coding-Tracker.csproj new file mode 100644 index 000000000..b69b465e3 --- /dev/null +++ b/Coding-Tracker/Coding-Tracker/Coding-Tracker.csproj @@ -0,0 +1,28 @@ + + + + Exe + net10.0 + Coding_Tracker + enable + enable + + + + + + Always + + + + + + + + + + + + + + diff --git a/Coding-Tracker/Coding-Tracker/Coding-Tracker.db b/Coding-Tracker/Coding-Tracker/Coding-Tracker.db new file mode 100644 index 0000000000000000000000000000000000000000..d5a541b130a62c6ed80cc1ed3177b6d1836882ce GIT binary patch literal 12288 zcmeI&O-{l<6bJAb@FOw7DjQZNv(eZHrgSXGtVEp{qM~ArvN9E_X_OLcJ%BDef|qjZ zF+7B?5S5Y`H?H*mGVOF``rb6Zt_VFo+6!V|T=t`$7YoVe80Tz52*%hV9a%a)g44ys z$AJ1|{8KEl)h9DYcV%W@nXyDC1Oy-e0SG_<0uX=z1Rwwb2teSM1P(J(g_RZFj=hT; z|L*pNe&C+p`M39e*cl&Yw_3XHYT?#5_p}(hcRBQWevvZGhf_XXFirj#3~F}z-5|U= zk0Y;h?MLZRCRH)LCYEzEVk8<}(P+AQN4LabtFd2iwZ*P(i~5Os&}dSfecg16>6GKx zi()tE`NGv_t@8PA4i6zKv10SG_<0uX=z1Rwwb z2tWV=5cuZ;GC#?rT(B*>QnIQgyCy7KITdADqf-?n9h$PFk~Qk({78~hve!jfs tabledata = connection.Query("SELECT * FROM coding_tracker").ToList(); + + var table = new Table(); + + table.AddColumn("Id"); + table.AddColumn("Start Time"); + table.AddColumn("End Time"); + table.AddColumn("Duration"); + + foreach (var session in tabledata) + { + table.AddRow( + session.Id.ToString(), + session.StartTime.ToString(), + session.EndTime.ToString(), + session.Duration.ToString() + ); + } + + AnsiConsole.Write(table); + } + + } + + public static void Insert(DateTime startTime, DateTime endTime) + { + + string duration = (endTime - startTime).ToString(); + + using (var connection = new SqliteConnection(connectionString)) + { + int rowsAffected = connection.Execute("INSERT INTO coding_tracker (StartTime, EndTime, Duration) VALUES (@StartTime, @EndTime, @Duration)", + new { StartTime = startTime, EndTime = endTime, Duration = duration }); + Console.WriteLine("Record Inserted.\nPress any key to return to main menu."); + Console.ReadKey(); + } + } + + public static void Delete(int id) + { + + using (var connection = new SqliteConnection(connectionString)) + { + int rowsAffected = connection.Execute("DELETE FROM coding_tracker WHERE Id = @Id", new { Id = id }); + + if (rowsAffected == 0) + Console.WriteLine("No record found with that ID."); + else + Console.WriteLine("Record Deleted.\nPress any key to return to main menu."); + + Console.ReadKey(); + } + } + + public static void Update(int ID, DateTime startTime, DateTime endTime) + { + + + using (var connection = new SqliteConnection(connectionString)) + { + + int rowsAffected = connection.Execute("UPDATE coding_tracker SET StartTime = @StartTime, EndTime = @EndTime WHERE ID = @Id", + new { Id = ID, StartTime = startTime, EndTime = endTime }); + + if (rowsAffected == 0) + { + Console.WriteLine("No record found with that ID."); + } + else + Console.WriteLine("Record Updated.\nPress any key to return to main menu."); + + Console.ReadKey(); + + } + } +} + + + + + + diff --git a/Coding-Tracker/Coding-Tracker/CodingSession.cs b/Coding-Tracker/Coding-Tracker/CodingSession.cs new file mode 100644 index 000000000..33f222a13 --- /dev/null +++ b/Coding-Tracker/Coding-Tracker/CodingSession.cs @@ -0,0 +1,15 @@ +// CodingSession.cs — the model + +public class Codingtracker +{ + public int Id { get; set; } + + public DateTime StartTime { get; set; } + + public DateTime EndTime { get; set; } + + public string Duration { get; set; } + +} + + diff --git a/Coding-Tracker/Coding-Tracker/Program1.cs b/Coding-Tracker/Coding-Tracker/Program1.cs new file mode 100644 index 000000000..d4f3f92e9 --- /dev/null +++ b/Coding-Tracker/Coding-Tracker/Program1.cs @@ -0,0 +1,18 @@ +using Microsoft.Data.Sqlite; +using Dapper; +using Spectre.Console; + +class Program1 +{ + static string connectionString = @"Data Source=habit-Tracker.db"; + + static void Main(string[] args) + { + { + CodingController.CreateTable(); + Input.GetUserInput(); + Console.ReadLine(); + } + } + +} diff --git a/Coding-Tracker/Coding-Tracker/UserInput.cs b/Coding-Tracker/Coding-Tracker/UserInput.cs new file mode 100644 index 000000000..9ead22ae8 --- /dev/null +++ b/Coding-Tracker/Coding-Tracker/UserInput.cs @@ -0,0 +1,118 @@ +using System.Runtime.ConstrainedExecution; + +public class Input +{ + public static void GetUserInput() + { + DateTime startTime; + DateTime endTime; + + bool end = false; + while (end == false) + { + Console.Clear(); + Console.WriteLine("Welcome to the coding tracker!\n"); + Console.WriteLine("What would you like to do?"); + Console.WriteLine("Press 0 to close the console."); + Console.WriteLine("Press 1 to view Records."); + Console.WriteLine("Press 2 to Insert a Record."); + Console.WriteLine("Press 3 to Delete a Record."); + Console.WriteLine("Press 4 to Update a Record."); + + string command = Console.ReadLine(); + + switch (command) + { + case "0": + end = true; + Console.WriteLine("Goodbye\nPress any key to quit."); + Console.ReadLine(); + Environment.Exit(0); + break; + + case "1": + CodingController.ViewRecords(); + break; + + case "2": + InsertInput(); + break; + + case "3": + DeleteInput(); + break; + + case "4": + UpdateInput(); + break; + + default: + Console.WriteLine("Please enter an option between 1 and 4."); + break; + } + + } + } + + public static DateTime GeTimeInput(string message) + { + Console.WriteLine(message); + string getTime = Console.ReadLine(); + + if (getTime == "0") GetUserInput(); + + return Validation.ValidateTime(getTime); + } + + public static void InsertInput() + { + Console.Clear(); + + DateTime startTime; + DateTime endTime; + + startTime = GeTimeInput("Please enter the start Time Format: (HH:mm), Or enter 0 to exit."); + endTime = GeTimeInput("Please enter the end Time Format: (HH:mm), Or enter 0 to exit."); + + CodingController.Insert(startTime, endTime); + + } + + public static void DeleteInput() + { + Console.Clear(); + CodingController.GetAllRecords(); + + Console.WriteLine("Please enter a record ID to delete.\n\n"); + + int id = Validation.ValidateId(Console.ReadLine()); + + CodingController.Delete(id); + + } + + + public static void UpdateInput() + { + Console.Clear(); + CodingController.GetAllRecords(); + + Console.WriteLine("Please type Id of the record you want to update. Type 0 to return to main menu.\n\n"); + + int ID = Validation.ValidateId(Console.ReadLine()); + + Console.WriteLine("Please enter a Start Time ID to Update."); + + DateTime startTime = Validation.ValidateTime(Console.ReadLine()); + + Console.WriteLine("Please enter a End Time ID to Update."); + + DateTime endTime = Validation.ValidateTime(Console.ReadLine()); + + CodingController.Update(ID, startTime, endTime); + + } + + + +} \ No newline at end of file diff --git a/Coding-Tracker/Coding-Tracker/Validation.cs b/Coding-Tracker/Coding-Tracker/Validation.cs new file mode 100644 index 000000000..4583a4764 --- /dev/null +++ b/Coding-Tracker/Coding-Tracker/Validation.cs @@ -0,0 +1,37 @@ +using System.Globalization; + +class Validation +{ + public static DateTime ValidateTime(string getTime) + { + + DateTime result; + while (!DateTime.TryParseExact(getTime, "HH:mm", null, DateTimeStyles.None, out result)) + { + Console.WriteLine("Invalid format. Try again (HH:mm): "); + getTime = Console.ReadLine(); + } + + return result; + } + + + public static int ValidateId(string Input) + { + // Console.WriteLine($"Input received: '{Input}'"); + + int result; + + while (!int.TryParse(Input, out result) || (result <= 0)) + { + Console.WriteLine("Please enter a valid id"); + Input = Console.ReadLine(); + } + + return result; + + } + + + +} \ No newline at end of file diff --git a/Coding-Tracker/Coding-Tracker/appsettings.json b/Coding-Tracker/Coding-Tracker/appsettings.json new file mode 100644 index 000000000..9fdb8f5fe --- /dev/null +++ b/Coding-Tracker/Coding-Tracker/appsettings.json @@ -0,0 +1,5 @@ +{ + "ConnectionStrings": { + "DefaultConnection": "Data Source=Coding-Tracker.db" + } +} \ No newline at end of file From 9dc06ad05bb21277d437fbe4c063f5e8370b1acc Mon Sep 17 00:00:00 2001 From: Joel Date: Fri, 23 Oct 2026 02:35:58 +0100 Subject: [PATCH 02/11] Added images folder --- Coding-Tracker/Coding-Tracker/Images/Delete.png | Bin 0 -> 29401 bytes Coding-Tracker/Coding-Tracker/Images/Insert.png | Bin 0 -> 18353 bytes Coding-Tracker/Coding-Tracker/Images/Menu.png | Bin 0 -> 22900 bytes .../Coding-Tracker/Images/ViewSpectre.png | Bin 0 -> 18822 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Coding-Tracker/Coding-Tracker/Images/Delete.png create mode 100644 Coding-Tracker/Coding-Tracker/Images/Insert.png create mode 100644 Coding-Tracker/Coding-Tracker/Images/Menu.png create mode 100644 Coding-Tracker/Coding-Tracker/Images/ViewSpectre.png diff --git a/Coding-Tracker/Coding-Tracker/Images/Delete.png b/Coding-Tracker/Coding-Tracker/Images/Delete.png new file mode 100644 index 0000000000000000000000000000000000000000..8cd56ffa952f0e22a0b6edbad27b6fbe720ef982 GIT binary patch literal 29401 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 literal 0 HcmV?d00001 diff --git a/Coding-Tracker/Coding-Tracker/Images/Insert.png b/Coding-Tracker/Coding-Tracker/Images/Insert.png new file mode 100644 index 0000000000000000000000000000000000000000..13fead49377d7579aa918f2f24335c35fed00a7d GIT binary patch literal 18353 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 X=`=8U|2h1c9h9V~j7Xla){FlGkjLBs literal 0 HcmV?d00001 diff --git a/Coding-Tracker/Coding-Tracker/Images/Menu.png b/Coding-Tracker/Coding-Tracker/Images/Menu.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a990245d65a7925d8a3b018353465f08b050d1 GIT binary patch literal 22900 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 literal 0 HcmV?d00001 diff --git a/Coding-Tracker/Coding-Tracker/Images/ViewSpectre.png b/Coding-Tracker/Coding-Tracker/Images/ViewSpectre.png new file mode 100644 index 0000000000000000000000000000000000000000..6b85260c316ac649c4d7871eb5cee55edafbb752 GIT binary patch literal 18822 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 R{J)b>%JS-%g3IQA{x6bi==T5s literal 0 HcmV?d00001 From ca600d7d5883763f54792dcd3988034a7385c0a6 Mon Sep 17 00:00:00 2001 From: Joel Date: Fri, 23 Oct 2026 02:43:41 +0100 Subject: [PATCH 03/11] Added update image for README --- Coding-Tracker/Coding-Tracker/Images/Update.png | Bin 0 -> 40922 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Coding-Tracker/Coding-Tracker/Images/Update.png diff --git a/Coding-Tracker/Coding-Tracker/Images/Update.png b/Coding-Tracker/Coding-Tracker/Images/Update.png new file mode 100644 index 0000000000000000000000000000000000000000..a3dfca83a0594ff6db4023ad6eb1f4a07771f2a7 GIT binary patch literal 40922 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 Tw<&p(cPk?$FByCI%+>z~(4KEQ literal 0 HcmV?d00001 From 34ea82f243f848ae51842208129c18f7e3aae320 Mon Sep 17 00:00:00 2001 From: jcisco22 Date: Fri, 23 Oct 2026 15:29:09 +0100 Subject: [PATCH 04/11] Create README.md Draft --- README.md | 262 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..ce50fe822 --- /dev/null +++ b/README.md @@ -0,0 +1,262 @@ +## Coding Tracker + + +The coding tracker is a C# console application I'm building to log and manage the duration of code sessions. + +I built this as part of the C# academy curriculum. + + +## What it does: + +Log coding sessions with a start time, end time, and auto calculated duration + +View all sessions in a formatted table + +Insert, update, and delete sessions + +Input validation enforcing a strict date/time format + + + +## How to run in terminal: + +cd Coding-Tracker + +dotnet run + +.NET 10 SDK is needed to run the program + + +## Tech stack: + +C# — .NET 10 console app + +SQLite — local file based database, packeged as Microsoft.Data.Sqlite + +Dapper — Object relational mapper used for mapping query results to C# objects + +Spectre.Console — Used to create visually appealing tables in the formatted table output in the terminal + + +## How it works: + +When running the program the user will be greeted with a menu. + +The menu presents the user with five options shown in the image below with the first option being to close the program. + +The rest of the options are Create Read Update and Delete operations. + + +![Main Menu](images/Menu.png) + + +The First CRUD operation is to view the coding tracker records: + +![Viewing a record](images/View.png) + + +The second CRUD operation is to insert a record: + +![Inserting a record](images/Insert.png) + + +The third CRUD operation is to delete a record: + +![Deleting a record](images/Delete.png) + + +The fourth and final operation is the update record feature: + +![Updating a record](images/Update.png) + + +## Project structure: + + +Program.cs is the entry point, it creates the table and starts the menu by calling the CreateTable method which lives in CodingController and the GetUserInput method which lives in the UserInput class. + +CodingSession.cs is the model, it holds the properties used throughout the program, it mirrors the database table. + +CodingController.cs is for database operations, all CRUD methods live inside this class, Dapper is used to execute the raw SQLite queries. + +UserInput.cs is for user interaction, this class contains the switch menu, input collection methods and contains methods that call the CodingController class. + +Validation.cs is for input validation, this class holds the ValidateTime & ValidateId methods used for date format and ID validation. + +appsettings.json is for configuration, this file stores the database connection string. + + +## Separation of concerns + +Each class has one job. + +This is the first time I used classes in a program, the project requirements made separation of concerns a must for this project. + +I decided to split the program into four main classes: + + +UserInput talks to the user, displays menus, collects input, calls controller methods. + +CodingController talks to the database, receives parameters, runs SQL. + +Validation checks input, never interacts with the user directly beyond error messages. + +CodingSession is the model, Containing the properties used throughout the program. + + +## Database Layout: + + + + +Id is of type int, this is the primary key of the data, it is set to auto-increment. + + + +StartTime is of type string, the format of the start time is dd-MM-yyyy HH:mm. + + + +EndTime is of type string, it follows the same format of StartTime which is dd-MM-yyyy HH:mm. + + + +Duration is of type string and is calculated from EndTime - StartTime, stored as string. + + + +SQLite does not have set DateTime or TimeSpan types. + + + +Dates are stored as strings and parsed in C#. + + + +Duration is calculated as a TimeSpan then stored as a string. + + + +The table is created on startup if it does not already exist: + + + + + +```` +CREATE TABLE IF NOT EXISTS coding_tracker ( +Id INTEGER PRIMARY KEY AUTOINCREMENT, +StartTime TEXT, +EndTime TEXT, +Duration TEXT +) + +```` + + + +## Duration calculation: + +Duration is not collected from the user. It is a product of endTime minus startTime: + +``` +string duration = (endTime - startTime).ToString(); +``` +When a value of type DateTime is subtracted its result returns as a TimeSpan type. + +This is converted to a string before being stored in SQLite. + + +## Validation: + +Date input is validated with DateTime.TryParseExact, enforcing the format `dd-MM-yyyy HH:mm`. + +The loop keeps asking until valid input is received: + +``` +while (!DateTime.TryParseExact(input, "dd-MM-yyyy HH:mm", null, DateTimeStyles.None, out result)) +{ + Console.WriteLine("Invalid format. Try again (dd-MM-yyyy HH:mm): "); + input = Console.ReadLine(); +} +``` + +ID input is validated with int.TryParse, rejecting non numeric input and values less than or equal to zero. + +## Rows affected: + +connection.Execute returns the number of rows affected. Used to detect when a user enters an ID that does not exist: + + + +``` +int rowsAffected = connection.Execute(sql, parameters); +if (rowsAffected == 0) + Console.WriteLine("No record found with that ID."); +``` + + + +## Key concepts: + +### Dapper: + +Dapper sits on top of ADO.NET and removes the need to manually map database columns to the properties. + +connection.Query(sql) — runs a SELECT and maps each row to a CodingSession object. + +connection.Execute(sql, parameters) — runs INSERT, UPDATE, DELETE operations. + +Parameters are passed as anonymous objects and being assigned value: new { Id = id, StartTime = startTime }. + +The property names on the anonymous object must match the `@placeholder` names in the SQL exactly or values won't be passed over and values will be null. + + +### Connection string: + +The database connection string is stored in appsettings.json rather than being hardcoded, this allows us to reference it with ease throughout the program. + +It' stored in appsettings.json and read at startup via ConfigurationBuilder. + +``` +{ + "ConnectionStrings": { + "DefaultConnection": "Data Source=Coding-Tracker.db" + } +} +``` + +### Reading the connection string + +The connection string needed to access the database is read into a static field using ConfigurationBuilder: + + +``` +static string connectionString = new ConfigurationBuilder() + .AddJsonFile("appsettings.json") + .Build() + .GetConnectionString("DefaultConnection") + ?? throw new InvalidOperationException("Connection string not found."); +``` + +If the connection string is missing, GetConnectionString returns null. The ?? operator then throws an exception with a not found message so the program fails immediately instead of hitting a confusing null error later. + + +### Copying appsettings.json to the build output + +``` + + + Always + + +``` + + +## Limitations: + +When running the program and viewing records I noticed that id's that were deleted affected the new id number, the pre-existing id numbers could not be used again. + + + + From d28b99e43815f8bd4015cd9fe70d8f25cd0dd2f4 Mon Sep 17 00:00:00 2001 From: Joel Date: Fri, 23 Oct 2026 21:25:51 +0100 Subject: [PATCH 05/11] Code Review: recalculate duration on update, validate end after start --- .../Coding-Tracker/CodingController.cs | 6 ++--- Coding-Tracker/Coding-Tracker/UserInput.cs | 22 +++++++++---------- Coding-Tracker/Coding-Tracker/Validation.cs | 17 +++++++++----- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/Coding-Tracker/Coding-Tracker/CodingController.cs b/Coding-Tracker/Coding-Tracker/CodingController.cs index 8e46dc934..cacfbf808 100644 --- a/Coding-Tracker/Coding-Tracker/CodingController.cs +++ b/Coding-Tracker/Coding-Tracker/CodingController.cs @@ -93,15 +93,15 @@ public static void Delete(int id) } } - public static void Update(int ID, DateTime startTime, DateTime endTime) + public static void Update(int ID, DateTime startTime, DateTime endTime, string duration) { using (var connection = new SqliteConnection(connectionString)) { - int rowsAffected = connection.Execute("UPDATE coding_tracker SET StartTime = @StartTime, EndTime = @EndTime WHERE ID = @Id", - new { Id = ID, StartTime = startTime, EndTime = endTime }); + int rowsAffected = connection.Execute("UPDATE coding_tracker SET StartTime = @StartTime, EndTime = @EndTime, Duration = @Duration WHERE ID = @Id", + new { Id = ID, StartTime = startTime, EndTime = endTime, Duration = duration }); if (rowsAffected == 0) { diff --git a/Coding-Tracker/Coding-Tracker/UserInput.cs b/Coding-Tracker/Coding-Tracker/UserInput.cs index 9ead22ae8..1bf66856e 100644 --- a/Coding-Tracker/Coding-Tracker/UserInput.cs +++ b/Coding-Tracker/Coding-Tracker/UserInput.cs @@ -73,10 +73,13 @@ public static void InsertInput() startTime = GeTimeInput("Please enter the start Time Format: (HH:mm), Or enter 0 to exit."); endTime = GeTimeInput("Please enter the end Time Format: (HH:mm), Or enter 0 to exit."); - - CodingController.Insert(startTime, endTime); - - } + while (endTime <= startTime) + { + Console.WriteLine("End time must be after start time."); + endTime = GeTimeInput("Please enter the end time (HH:mm), or enter 0 to exit."); + } + CodingController.Insert(startTime, endTime); + } public static void DeleteInput() { @@ -88,10 +91,8 @@ public static void DeleteInput() int id = Validation.ValidateId(Console.ReadLine()); CodingController.Delete(id); - } - public static void UpdateInput() { Console.Clear(); @@ -107,12 +108,11 @@ public static void UpdateInput() Console.WriteLine("Please enter a End Time ID to Update."); - DateTime endTime = Validation.ValidateTime(Console.ReadLine()); - - CodingController.Update(ID, startTime, endTime); - - } + DateTime endTime = Validation.ValidateEndTime(startTime); + string duration = (endTime - startTime).ToString(); + CodingController.Update(ID, startTime, endTime, duration); + } } \ No newline at end of file diff --git a/Coding-Tracker/Coding-Tracker/Validation.cs b/Coding-Tracker/Coding-Tracker/Validation.cs index 4583a4764..360a796ca 100644 --- a/Coding-Tracker/Coding-Tracker/Validation.cs +++ b/Coding-Tracker/Coding-Tracker/Validation.cs @@ -4,8 +4,8 @@ class Validation { public static DateTime ValidateTime(string getTime) { - DateTime result; + while (!DateTime.TryParseExact(getTime, "HH:mm", null, DateTimeStyles.None, out result)) { Console.WriteLine("Invalid format. Try again (HH:mm): "); @@ -15,7 +15,18 @@ public static DateTime ValidateTime(string getTime) return result; } + public static DateTime ValidateEndTime(DateTime startTime) + { + DateTime endTime = ValidateTime(Console.ReadLine()); + + while (endTime <= startTime) + { + Console.WriteLine("End time must be after start time.\nPlease try again (dd-MM-yyyy HH:mm): "); + endTime = ValidateTime(Console.ReadLine()); + } + return endTime; + } public static int ValidateId(string Input) { // Console.WriteLine($"Input received: '{Input}'"); @@ -29,9 +40,5 @@ public static int ValidateId(string Input) } return result; - } - - - } \ No newline at end of file From 55d8f2b2a6dda918ede8a6ca72a7ad8ac9b22725 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 24 Oct 2026 15:59:39 +0100 Subject: [PATCH 06/11] Added README image --- .../Coding-Tracker/Images/Insert.png | Bin 18353 -> 22581 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Coding-Tracker/Coding-Tracker/Images/Insert.png b/Coding-Tracker/Coding-Tracker/Images/Insert.png index 13fead49377d7579aa918f2f24335c35fed00a7d..eba61bb94d8bc6b5dd5c64eabe9f7224b56ea0e1 100644 GIT binary patch literal 22581 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 literal 18353 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 X=`=8U|2h1c9h9V~j7Xla){FlGkjLBs From b0d0698582155d441abd9fb5070a849fffb5bca4 Mon Sep 17 00:00:00 2001 From: jcisco22 Date: Sat, 24 Oct 2026 19:37:41 +0100 Subject: [PATCH 07/11] Improve README.md clarity and formatting Updated README.md for clarity and corrections in text formatting, including changes to section headings, descriptions of functionalities, and validation methods. --- README.md | 173 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 114 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index ce50fe822..280f20f62 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,44 @@ -## Coding Tracker +# Coding Tracker The coding tracker is a C# console application I'm building to log and manage the duration of code sessions. -I built this as part of the C# academy curriculum. +I built this as part of the C# Academy curriculum. ## What it does: -Log coding sessions with a start time, end time, and auto calculated duration +Log coding sessions with a start time, end time, and auto calculated duration including date View all sessions in a formatted table -Insert, update, and delete sessions +Insert, update, and delete and view created sessions Input validation enforcing a strict date/time format +## How to run -## How to run in terminal: +### Prerequisites -cd Coding-Tracker +- [.NET 10 SDK](https://dotnet.microsoft.com/download) +### Steps + +```bash +git clone https://github.com/jcisco22/CodeReviews.Console.CodingTracker.git +cd CodeReviews.Console.CodingTracker/Coding-Tracker/Coding-Tracker dotnet run +``` -.NET 10 SDK is needed to run the program +The database file is created automatically on first run. ## Tech stack: C# — .NET 10 console app -SQLite — local file based database, packeged as Microsoft.Data.Sqlite +SQLite — local file based database, packaged as Microsoft.Data.Sqlite Dapper — Object relational mapper used for mapping query results to C# objects @@ -44,30 +51,48 @@ When running the program the user will be greeted with a menu. The menu presents the user with five options shown in the image below with the first option being to close the program. -The rest of the options are Create Read Update and Delete operations. +The rest of the options are Create Read Update and Delete operations labelled from 1 - 4. -![Main Menu](images/Menu.png) +![Main Menu](Coding-Tracker/Coding-Tracker/Images/Menu.png) The First CRUD operation is to view the coding tracker records: -![Viewing a record](images/View.png) +The table consists of the four properties Id, Start Time, End Time and Duration. + +![Viewing a record](Coding-Tracker/Coding-Tracker/Images/ViewSpectre.png) + The second CRUD operation is to insert a record: -![Inserting a record](images/Insert.png) +The insert menu asks a user to enter a start and end time in the format provided including the date. + +If successfully inserted, a message showing the record was inserted is shown, followed by a return to the main menu option. + +![Inserting a record](Coding-Tracker/Coding-Tracker/Images/Insert.png) + The third CRUD operation is to delete a record: -![Deleting a record](images/Delete.png) +The program shows a list of the records in the database and prompts the user to enter the id number of the record to delete. + +If successfully deleted, a message showing the record was deleted is shown, followed by a return to the main menu option. + +![Deleting a record](Coding-Tracker/Coding-Tracker/Images/Delete.png) The fourth and final operation is the update record feature: -![Updating a record](images/Update.png) +The program prompts the user to enter the id of the record they'd like updated then asks the user to enter a new start and end time. + +If successfully updated, a message showing the record was updated is shown, followed by a return to the main menu option. + +![Updating a record](Coding-Tracker/Coding-Tracker/Images/Update.png) + + ## Project structure: @@ -81,7 +106,7 @@ CodingController.cs is for database operations, all CRUD methods live inside thi UserInput.cs is for user interaction, this class contains the switch menu, input collection methods and contains methods that call the CodingController class. -Validation.cs is for input validation, this class holds the ValidateTime & ValidateId methods used for date format and ID validation. +Validation.cs is for input validation, this class holds the ValidateTime, ValidateId and ValidateEndTime methods used for date format and ID validation. appsettings.json is for configuration, this file stores the database connection string. @@ -99,33 +124,40 @@ UserInput talks to the user, displays menus, collects input, calls controller me CodingController talks to the database, receives parameters, runs SQL. -Validation checks input, never interacts with the user directly beyond error messages. +Validation checks input. When input is invalid, it shows an error message and asks the user to try again. -CodingSession is the model, Containing the properties used throughout the program. +CodingSession is the model, containing the properties used throughout the program. ## Database Layout: +The table is created on startup if it does not already exist: -Id is of type int, this is the primary key of the data, it is set to auto-increment. - +```` +CREATE TABLE IF NOT EXISTS coding_tracker ( +Id INTEGER PRIMARY KEY AUTOINCREMENT, +StartTime TEXT, +EndTime TEXT, +Duration TEXT +) +```` -StartTime is of type string, the format of the start time is dd-MM-yyyy HH:mm. +Id is of type INTEGER, this is the primary key of the data, it is set to auto-increment. -EndTime is of type string, it follows the same format of StartTime which is dd-MM-yyyy HH:mm. +StartTime is of type TEXT, the format of the start time is dd-MM-yyyy HH:mm. -Duration is of type string and is calculated from EndTime - StartTime, stored as string. +EndTime is of type TEXT, it follows the same format of StartTime which is dd-MM-yyyy HH:mm. -SQLite does not have set DateTime or TimeSpan types. +Duration is calculated as EndTime - StartTime, which gives a TimeSpan. SQLite has no built in DateTime or TimeSpan types, so the duration is converted to a string and stored as TEXT. @@ -133,55 +165,60 @@ Dates are stored as strings and parsed in C#. -Duration is calculated as a TimeSpan then stored as a string. - - +## Duration calculation: -The table is created on startup if it does not already exist: +Duration is not entered by the user. Subtracting one DateTime from another gives a TimeSpan which is converted to a string before being stored in SQLite: +``` +string duration = (endTime - startTime).ToString(); +``` +## Validation: +Date input is validated with DateTime.TryParseExact, enforcing the format "dd-MM-yyyy HH:mm". +The ValidateTime method ensures that the user enters the correct format by looping until the correct format is received: -```` -CREATE TABLE IF NOT EXISTS coding_tracker ( -Id INTEGER PRIMARY KEY AUTOINCREMENT, -StartTime TEXT, -EndTime TEXT, -Duration TEXT -) -```` +``` + public static DateTime ValidateTime(string getTime) + { + DateTime result; + + while (!DateTime.TryParseExact(getTime, "dd-MM-yyyy HH:mm", null, DateTimeStyles.None, out result)) + { + Console.WriteLine("Invalid format. Try again (dd-MM-yyyy HH:mm): "); + getTime = Console.ReadLine(); + } + + return result; + } +``` +ID input is validated with int.TryParse, rejecting non numeric input and values less than or equal to zero. +## End time validation: -## Duration calculation: +ValidateEndTime was added after code review pointed out that an end time could be earlier than the start time, producing a negative duration. It takes the already-validated start time and uses a while loop to keep asking for an end time until it is later than the start, preventing zero or negative durations. -Duration is not collected from the user. It is a product of endTime minus startTime: ``` -string duration = (endTime - startTime).ToString(); -``` -When a value of type DateTime is subtracted its result returns as a TimeSpan type. - -This is converted to a string before being stored in SQLite. + public static DateTime ValidateEndTime(DateTime startTime) + { + DateTime endTime = ValidateTime(Console.ReadLine()); + while (endTime <= startTime) + { + Console.WriteLine("End time must be after start time.\nPlease try again (dd-MM-yyyy HH:mm): "); + endTime = ValidateTime(Console.ReadLine()); + } -## Validation: - -Date input is validated with DateTime.TryParseExact, enforcing the format `dd-MM-yyyy HH:mm`. - -The loop keeps asking until valid input is received: + return endTime; + } -``` -while (!DateTime.TryParseExact(input, "dd-MM-yyyy HH:mm", null, DateTimeStyles.None, out result)) -{ - Console.WriteLine("Invalid format. Try again (dd-MM-yyyy HH:mm): "); - input = Console.ReadLine(); -} ``` -ID input is validated with int.TryParse, rejecting non numeric input and values less than or equal to zero. + ## Rows affected: @@ -209,14 +246,13 @@ connection.Execute(sql, parameters) — runs INSERT, UPDATE, DELETE operations. Parameters are passed as anonymous objects and being assigned value: new { Id = id, StartTime = startTime }. -The property names on the anonymous object must match the `@placeholder` names in the SQL exactly or values won't be passed over and values will be null. +The property names on the anonymous object must match the @placeholder names in the SQL exactly or values won't be passed over and values will be null. ### Connection string: -The database connection string is stored in appsettings.json rather than being hardcoded, this allows us to reference it with ease throughout the program. +The database connection string is stored in appsettings.json rather than being hardcoded. This keeps configuration separate from code, so the database location can be changed without editing or recompiling the program. -It' stored in appsettings.json and read at startup via ConfigurationBuilder. ``` { @@ -251,11 +287,30 @@ If the connection string is missing, GetConnectionString returns null. The ?? op ``` +This configuration in the .csproj file ensures that appsettings.json is copied to the build output directory whenever the project is built. This is necessary because the application needs to access the file at runtime to retrieve the database connection string. Without the file in the output directory, the application may be unable to load its configuration. + + + +## Reflection: + +When initially submitting my project for review, my project could not be approved due to an error with the Duration field. I had correctly calculated and stored the duration when a record was being inserted but the update method would only update the StartTime and EndTime fields leaving out duration which is the thing we are actually tracking. This meant the record could contain an outdated duration after an update. To fix this issue I added duration as a parameter to the update method and included it in the SQL UPDATE statement. This ensures that StartTime, EndTime and Duration are all updated together when a record is modified. + + +I prematurely committed the program before verifying the issue had been resolved, after running the program I realised that it hadn't. After updating a record and viewing it I noticed that the duration column was still missing as I hadn't updated the UpdateInput method in the UserInput class to assign the duration field the result of EndTime minus StartTime which I did with the line string duration = (endTime - startTime).ToString(); converting it to string as duration is stored as string. After adding this line I ran the program without this issue. + +The second issue returned from my code review was end time could be earlier than start time which is a clear problem as it would be calculated as a negative duration. To solve this issue I created a new validation method called ValidateEndTime. The method starts by creating a local variable named endTime and assigning it the value of the ValidateTime method which checks that the user’s input is in the correct format. ValidateEndTime receives the start time as a DateTime parameter, which is used to compare against the end time. A while loop checks whether the end time is earlier than or equal to the start time; if it is, the user is shown an error message and asked to enter the end time again. The loop repeats until a valid end time is entered, and the method then returns it. The insert menu applies the same check inside InsertInput, so the user can still enter 0 to exit. + +Overall I think the project taught me a lot, mainly about separation of concerns as well as validation and what ORMs are by using Dapper. I gained a better understanding of how separating input logic from database operations makes code easier to maintain, and how validation helps prevent invalid records from being stored and even accepted. I also learned how Dapper simplifies database interactions by mapping query results to C# objects and allowing SQL queries to be executed directly from the application. + + +## Limitations : + +As duration is stored as text, calculations like "total hours coded this week" can’t be calculated in SQLite. + +Some CodingController methods write directly to the console. The messages are needed, but displaying them is UserInput’s job, so this breaks separation of concerns. A cleaner design would return a result and let UserInput show the message. -## Limitations: -When running the program and viewing records I noticed that id's that were deleted affected the new id number, the pre-existing id numbers could not be used again. From be75cf64b731d1a2532b4d44ef44ebec5a38b284 Mon Sep 17 00:00:00 2001 From: Joel Date: Wed, 28 Oct 2026 19:54:53 +0000 Subject: [PATCH 08/11] Added validation to ValidateId method, return check placed inside DeleteInput and UpdateInput methods. --- Coding-Tracker/Coding-Tracker/UserInput.cs | 20 +++++++++++---- Coding-Tracker/Coding-Tracker/Validation.cs | 27 +++++++++++++-------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/Coding-Tracker/Coding-Tracker/UserInput.cs b/Coding-Tracker/Coding-Tracker/UserInput.cs index 1bf66856e..89c39407b 100644 --- a/Coding-Tracker/Coding-Tracker/UserInput.cs +++ b/Coding-Tracker/Coding-Tracker/UserInput.cs @@ -86,10 +86,12 @@ public static void DeleteInput() Console.Clear(); CodingController.GetAllRecords(); - Console.WriteLine("Please enter a record ID to delete.\n\n"); + Console.WriteLine("Please enter a record ID to delete.\n\nOr enter 0 to exit"); - int id = Validation.ValidateId(Console.ReadLine()); + int id = Validation.ValidateId(Console.ReadLine()); + if (id == 0) return; + CodingController.Delete(id); } @@ -98,17 +100,25 @@ public static void UpdateInput() Console.Clear(); CodingController.GetAllRecords(); - Console.WriteLine("Please type Id of the record you want to update. Type 0 to return to main menu.\n\n"); + + DateTime startTime; + DateTime endTime; + + startTime = GeTimeInput("Please type Id of the record you want to update. Type 0 to return to main menu.\n\n"); + endTime = GeTimeInput("Please type Id of the record you want to update. Type 0 to return to main menu.\n\n"); + + // Console.WriteLine("Please type Id of the record you want to update. Type 0 to return to main menu.\n\n"); int ID = Validation.ValidateId(Console.ReadLine()); + if (ID == 0) return; Console.WriteLine("Please enter a Start Time ID to Update."); - DateTime startTime = Validation.ValidateTime(Console.ReadLine()); + startTime = Validation.ValidateTime(Console.ReadLine()); Console.WriteLine("Please enter a End Time ID to Update."); - DateTime endTime = Validation.ValidateEndTime(startTime); + endTime = Validation.ValidateEndTime(startTime); string duration = (endTime - startTime).ToString(); diff --git a/Coding-Tracker/Coding-Tracker/Validation.cs b/Coding-Tracker/Coding-Tracker/Validation.cs index 360a796ca..5d3e0fe0c 100644 --- a/Coding-Tracker/Coding-Tracker/Validation.cs +++ b/Coding-Tracker/Coding-Tracker/Validation.cs @@ -2,18 +2,24 @@ class Validation { - public static DateTime ValidateTime(string getTime) +public static DateTime ValidateTime(string getTime) +{ + DateTime result; + + while (true) { - DateTime result; - - while (!DateTime.TryParseExact(getTime, "HH:mm", null, DateTimeStyles.None, out result)) + + + if (DateTime.TryParseExact(getTime, "HH:mm", null, + DateTimeStyles.None, out result)) { - Console.WriteLine("Invalid format. Try again (HH:mm): "); - getTime = Console.ReadLine(); + return result; } - return result; + Console.WriteLine("Invalid format. Try again (HH:mm): "); + getTime = Console.ReadLine(); } +} public static DateTime ValidateEndTime(DateTime startTime) { @@ -29,13 +35,14 @@ public static DateTime ValidateEndTime(DateTime startTime) } public static int ValidateId(string Input) { - // Console.WriteLine($"Input received: '{Input}'"); - int result; while (!int.TryParse(Input, out result) || (result <= 0)) { - Console.WriteLine("Please enter a valid id"); + + if (Input == "0") return 0; + + Console.WriteLine("Please enter a valid id, or press 0 to return to the main menu"); Input = Console.ReadLine(); } From 6725636e971deb94db651cdda5fb0f1df0480f88 Mon Sep 17 00:00:00 2001 From: Joel Date: Wed, 28 Oct 2026 22:16:28 +0000 Subject: [PATCH 09/11] ValidateId returns 0 and ValidateTime/ValidateEndTime return null when the user enters 0. Insert now uses ValidateEndTime instead of duplicating the check. Removed recursive menu call from GeTimeInput. Restored dd-MM-yyyy HH:mm format. --- Coding-Tracker/Coding-Tracker/UserInput.cs | 55 +++++++++------------ Coding-Tracker/Coding-Tracker/Validation.cs | 33 ++++++------- 2 files changed, 37 insertions(+), 51 deletions(-) diff --git a/Coding-Tracker/Coding-Tracker/UserInput.cs b/Coding-Tracker/Coding-Tracker/UserInput.cs index 89c39407b..0aa26e85c 100644 --- a/Coding-Tracker/Coding-Tracker/UserInput.cs +++ b/Coding-Tracker/Coding-Tracker/UserInput.cs @@ -54,32 +54,30 @@ public static void GetUserInput() } } - public static DateTime GeTimeInput(string message) + public static DateTime? GeTimeInput(string message) { Console.WriteLine(message); string getTime = Console.ReadLine(); - if (getTime == "0") GetUserInput(); - return Validation.ValidateTime(getTime); + } public static void InsertInput() { Console.Clear(); - DateTime startTime; - DateTime endTime; - startTime = GeTimeInput("Please enter the start Time Format: (HH:mm), Or enter 0 to exit."); - endTime = GeTimeInput("Please enter the end Time Format: (HH:mm), Or enter 0 to exit."); - while (endTime <= startTime) - { - Console.WriteLine("End time must be after start time."); - endTime = GeTimeInput("Please enter the end time (HH:mm), or enter 0 to exit."); - } - CodingController.Insert(startTime, endTime); - } + + DateTime? startTime = GeTimeInput("Please enter the start Time Format: (dd-MM-yyyy, HH:mm), Or enter 0 to exit."); + if (startTime == null) return; + + DateTime? endTime = GeTimeInput("Please enter the end Time Format: (dd-MM-yyyy, HH:mm), Or enter 0 to exit."); + if (endTime == null) return; + + + CodingController.Insert(startTime.Value, endTime.Value); + } public static void DeleteInput() { @@ -91,7 +89,7 @@ public static void DeleteInput() int id = Validation.ValidateId(Console.ReadLine()); if (id == 0) return; - + CodingController.Delete(id); } @@ -100,29 +98,20 @@ public static void UpdateInput() Console.Clear(); CodingController.GetAllRecords(); - - DateTime startTime; - DateTime endTime; - - startTime = GeTimeInput("Please type Id of the record you want to update. Type 0 to return to main menu.\n\n"); - endTime = GeTimeInput("Please type Id of the record you want to update. Type 0 to return to main menu.\n\n"); - - // Console.WriteLine("Please type Id of the record you want to update. Type 0 to return to main menu.\n\n"); - + Console.WriteLine("Please type the Id of the record you want to update, or enter 0 to return to the main menu."); int ID = Validation.ValidateId(Console.ReadLine()); if (ID == 0) return; - - Console.WriteLine("Please enter a Start Time ID to Update."); - - startTime = Validation.ValidateTime(Console.ReadLine()); - - Console.WriteLine("Please enter a End Time ID to Update."); - endTime = Validation.ValidateEndTime(startTime); + Console.WriteLine("Please enter the new start time (dd-MM-yyyy, HH:mm), or enter 0 to return to the main menu."); + DateTime? startTime = Validation.ValidateTime(Console.ReadLine()); + if (startTime == null) return; - string duration = (endTime - startTime).ToString(); + Console.WriteLine("Please enter the new end time (dd-MM-yyyy, HH:mm), or enter 0 to return to the main menu."); + DateTime? endTime = Validation.ValidateEndTime(startTime.Value); + if (endTime == null) return; - CodingController.Update(ID, startTime, endTime, duration); + string duration = (endTime.Value - startTime.Value).ToString(); + CodingController.Update(ID, startTime.Value, endTime.Value, duration); } } \ No newline at end of file diff --git a/Coding-Tracker/Coding-Tracker/Validation.cs b/Coding-Tracker/Coding-Tracker/Validation.cs index 5d3e0fe0c..850ca425d 100644 --- a/Coding-Tracker/Coding-Tracker/Validation.cs +++ b/Coding-Tracker/Coding-Tracker/Validation.cs @@ -2,33 +2,30 @@ class Validation { -public static DateTime ValidateTime(string getTime) -{ - DateTime result; - - while (true) + public static DateTime? ValidateTime(string getTime) { + DateTime result; - - if (DateTime.TryParseExact(getTime, "HH:mm", null, - DateTimeStyles.None, out result)) + while (!DateTime.TryParseExact(getTime, "dd-MM-yyyy HH:mm", null, DateTimeStyles.None, out result)) { - return result; + if (getTime == "0") return null; + + Console.WriteLine("Invalid format. Try again (dd-MM-yyyy, HH:mm): \nOr enter 0 to exit. "); + getTime = Console.ReadLine(); } - Console.WriteLine("Invalid format. Try again (HH:mm): "); - getTime = Console.ReadLine(); + return result; + } -} - public static DateTime ValidateEndTime(DateTime startTime) + public static DateTime? ValidateEndTime(DateTime startTime) { - DateTime endTime = ValidateTime(Console.ReadLine()); + DateTime? endTime = ValidateTime(Console.ReadLine()); - while (endTime <= startTime) + while (endTime != null && endTime <= startTime) { - Console.WriteLine("End time must be after start time.\nPlease try again (dd-MM-yyyy HH:mm): "); - endTime = ValidateTime(Console.ReadLine()); + Console.WriteLine("End time must be after start time. Try again (dd-MM-yyyy, HH:mm), or enter 0 to return to the main menu: "); + endTime = ValidateTime(Console.ReadLine()); } return endTime; @@ -40,7 +37,7 @@ public static int ValidateId(string Input) while (!int.TryParse(Input, out result) || (result <= 0)) { - if (Input == "0") return 0; + if (Input == "0") return 0; Console.WriteLine("Please enter a valid id, or press 0 to return to the main menu"); Input = Console.ReadLine(); From 7059ad2547d3cc1533b13014d3fcf53b11dcdc2f Mon Sep 17 00:00:00 2001 From: Joel Date: Wed, 28 Oct 2026 23:52:21 +0000 Subject: [PATCH 10/11] Allow 0 to return to main menu from all prompts --- Coding-Tracker/Coding-Tracker/UserInput.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Coding-Tracker/Coding-Tracker/UserInput.cs b/Coding-Tracker/Coding-Tracker/UserInput.cs index 0aa26e85c..f5682e152 100644 --- a/Coding-Tracker/Coding-Tracker/UserInput.cs +++ b/Coding-Tracker/Coding-Tracker/UserInput.cs @@ -67,8 +67,6 @@ public static void InsertInput() { Console.Clear(); - - DateTime? startTime = GeTimeInput("Please enter the start Time Format: (dd-MM-yyyy, HH:mm), Or enter 0 to exit."); if (startTime == null) return; From e9ddc665a22bb283bcbffb154e54b7807c6d2842 Mon Sep 17 00:00:00 2001 From: jcisco22 Date: Wed, 28 Oct 2026 23:55:12 +0000 Subject: [PATCH 11/11] README updated to discuss code review feedback --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 280f20f62..2b9a79636 100644 --- a/README.md +++ b/README.md @@ -302,6 +302,8 @@ The second issue returned from my code review was end time could be earlier than Overall I think the project taught me a lot, mainly about separation of concerns as well as validation and what ORMs are by using Dapper. I gained a better understanding of how separating input logic from database operations makes code easier to maintain, and how validation helps prevent invalid records from being stored and even accepted. I also learned how Dapper simplifies database interactions by mapping query results to C# objects and allowing SQL queries to be executed directly from the application. +Refactoring for the time propmts was a little different as the ValidateTime and ValidateEndTime methods return types were DateTime, returning 0 wasnt an option here. I needed a value that could mean nothing, so I changed ValidateTime and ValidateEndTime to return a nullable DateTime?. If the user enters 0, these methods return null, and InsertInput and UpdateInput return to the main menu when they receive it. While making this change, I also removed a call to GetUserInput from GeTimeInput, which had been opening a new menu on top of the existing one. Changing the DateTime methods to DateTime? in the validation class meant i had to do it throughout the program.Lastly I updated InsertInput to use ValidateEndTime instead of its own copy of the end time check. + ## Limitations :