diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index a714b91..0000000 --- a/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -# https://hub.docker.com/_/microsoft-dotnet-core -FROM mcr.microsoft.com/dotnet/core/sdk:latest AS build -WORKDIR /source - -# copy csproj and restore as distinct layers -COPY . . - -WORKDIR /source -RUN dotnet build -RUN dotnet test diff --git a/MyNumberNET_ApiServer/Controllers/MyNumberController.cs b/MyNumberNET_ApiServer/Controllers/MyNumberController.cs new file mode 100644 index 0000000..1f88367 --- /dev/null +++ b/MyNumberNET_ApiServer/Controllers/MyNumberController.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNetCore.Mvc; +using MyNumberNET; + +namespace MyNumberNET_ApiServer.Controllers +{ + /// + /// Controller for exposing MyNumberNET functionality via REST API. + /// + [ApiController] + [Route("api/[controller]")] + public class MyNumberController : ControllerBase + { + /// + /// Verifies if the provided 12-digit array is a valid "My Number". + /// + /// An array of 12 integers representing the My Number digits. + /// True if valid, false otherwise. Returns BadRequest if input is malformed. + [HttpPost("verify")] + public ActionResult Verify([FromBody] int[] number) + { + try + { + bool isValid = MyNumber.VerifyNumber(number); + return Ok(isValid); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } + + /// + /// Calculates the check digit for the provided 11-digit array. + /// + /// An array of 11 integers representing the first 11 digits of My Number. + /// The calculated check digit. Returns BadRequest if input is malformed. + [HttpPost("checkdigit")] + public ActionResult CheckDigit([FromBody] int[] number) + { + try + { + int checkDigit = MyNumber.CalculateCheckDigits(number); + return Ok(checkDigit); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } + } +} diff --git a/MyNumberNET_ApiServer/MyNumberNET_ApiServer.csproj b/MyNumberNET_ApiServer/MyNumberNET_ApiServer.csproj new file mode 100644 index 0000000..f8ef484 --- /dev/null +++ b/MyNumberNET_ApiServer/MyNumberNET_ApiServer.csproj @@ -0,0 +1,12 @@ + + + net8.0 + enable + enable + true + 1591 + + + + + diff --git a/MyNumberNET_ApiServer/Program.cs b/MyNumberNET_ApiServer/Program.cs new file mode 100644 index 0000000..e633767 --- /dev/null +++ b/MyNumberNET_ApiServer/Program.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace MyNumberNET_ApiServer +{ + public class Program + { + public static void Main(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + builder.Services.AddControllers(); + + var app = builder.Build(); + + app.UseRouting(); + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + + app.Run(); + } + } +} diff --git a/MyNumberNET_Test/MyNumberControllerTests.cs b/MyNumberNET_Test/MyNumberControllerTests.cs new file mode 100644 index 0000000..57372ff --- /dev/null +++ b/MyNumberNET_Test/MyNumberControllerTests.cs @@ -0,0 +1,72 @@ +using System; +using Xunit; +using MyNumberNET_ApiServer.Controllers; +using Microsoft.AspNetCore.Mvc; + +namespace MyNumberNET_Test +{ + public class MyNumberControllerTests + { + [Fact] + public void Verify_ValidNumber_ReturnsTrue() + { + var controller = new MyNumberController(); + var first11 = new[] { 1,2,3,4,5,6,7,8,9,0,1 }; + var checkDigit = MyNumberNET.MyNumber.CalculateCheckDigits((int[])first11.Clone()); + var validNumber = new int[12]; + Array.Copy(first11, validNumber, 11); + validNumber[11] = checkDigit; + var result = controller.Verify(validNumber); + Assert.NotNull(result.Result); + var okResult = result.Result as OkObjectResult; + Assert.NotNull(okResult); + Assert.True((bool)okResult.Value); + } + + [Fact] + public void Verify_InvalidNumber_ReturnsFalse() + { + var controller = new MyNumberController(); + var invalidNumber = new[] { 1,2,3,4,5,6,7,8,9,0,1,3 }; // Last digit is wrong + var result = controller.Verify(invalidNumber); + Assert.NotNull(result.Result); + var okResult = result.Result as OkObjectResult; + Assert.NotNull(okResult); + Assert.False((bool)okResult.Value); + } + + [Fact] + public void Verify_MalformedNumber_ReturnsBadRequest() + { + var controller = new MyNumberController(); + var malformedNumber = new[] { 1,2,3 }; // Too short + var result = controller.Verify(malformedNumber); + Assert.NotNull(result.Result); + var badRequestResult = result.Result as BadRequestObjectResult; + Assert.NotNull(badRequestResult); + } + + [Fact] + public void CheckDigit_ValidInput_ReturnsDigit() + { + var controller = new MyNumberController(); + var digits = new[] { 1,2,3,4,5,6,7,8,9,0,1 }; + var result = controller.CheckDigit(digits); + Assert.NotNull(result.Result); + var okResult = result.Result as OkObjectResult; + Assert.NotNull(okResult); + Assert.True(int.TryParse(okResult.Value.ToString(), out _)); + } + + [Fact] + public void CheckDigit_MalformedInput_ReturnsBadRequest() + { + var controller = new MyNumberController(); + var malformedDigits = new[] { 1,2,3 }; // Too short + var result = controller.CheckDigit(malformedDigits); + Assert.NotNull(result.Result); + var badRequestResult = result.Result as BadRequestObjectResult; + Assert.NotNull(badRequestResult); + } + } +} diff --git a/MyNumberNET_Test/MyNumberNET_Test.csproj b/MyNumberNET_Test/MyNumberNET_Test.csproj index f95d818..066552b 100644 --- a/MyNumberNET_Test/MyNumberNET_Test.csproj +++ b/MyNumberNET_Test/MyNumberNET_Test.csproj @@ -20,9 +20,12 @@ + + + true diff --git a/README.md b/README.md index 36615f4..909ca1c 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,21 @@ # My Number Library for .NET -This repository provides tools for validating and generating Japanese My Number (Social Security and Tax Number System) in .NET. +This repository provides tools for validating and generating Japanese My Number (Social Security and Tax Number System) in .NET 8.0. + +## Project Structure + +- **MyNumberNET/**: Core .NET 8.0 library for My Number validation and generation. +- **MyNumberNET_ApiServer/**: ASP.NET Core Web API for My Number validation and generation. +- **MyNumberNET_CLI/**: Command-line interface for interacting with the library. Uses NLog for logging. +- **MyNumberNET_Test/**: Unit tests for the library and API server. +- **Jenkinsfile**: CI/CD pipeline configuration. +- **global.json**: Specifies the .NET SDK version. +- **MyNumberNET.sln**: Solution file for managing all projects. ## Projects ### MyNumberNET -A .NET library for validating and generating My Number sequences. +A .NET 8.0 library for validating and generating My Number sequences. **Features:** - Validate a 12-digit My Number: `MyNumber.VerifyNumber(int[] number)` @@ -19,13 +29,26 @@ int[] number = {6,1,4,1,0,6,5,2,6,0,0,0}; bool isValid = MyNumber.VerifyNumber(number); ``` +### MyNumberNET_ApiServer +ASP.NET Core Web API for validating and generating My Numbers. + +**Usage:** +``` +dotnet run --project MyNumberNET_ApiServer +``` +The API exposes endpoints for validation and generation. See `Controllers/MyNumberController.cs` for details. + ### MyNumberNET_CLI -A command-line interface for validating and generating My Numbers. +A command-line interface for validating and generating My Numbers. Uses NLog for logging. **Usage:** ``` dotnet run --project MyNumberNET_CLI [command] [arguments] ``` +Or run the built executable directly: +``` +MyNumberNET_CLI\bin\Debug\net8.0\MyNumberNET_CLI.exe [command] [arguments] +``` **Commands:** - `generate [count]` : Generate valid My Numbers - `check [My Number]` : Validate a given number @@ -34,27 +57,20 @@ dotnet run --project MyNumberNET_CLI [command] [arguments] - `ranges [min] [max]` : Generate numbers in a sequential range ### MyNumberNET_Test -Unit tests for the library. +Unit tests for the library and API server. -**To run tests:** +**Run tests:** ``` dotnet test MyNumberNET_Test ``` -## Build Instructions +## Solution Management -1. Clone the repository. -2. Build the solution: - ``` - dotnet build MyNumberNET.sln - ``` -3. Run CLI or tests as shown above. +Use the solution file to build and manage all projects: +``` +dotnet build MyNumberNET.sln +``` ## .NET Version -All projects now target **.NET 8 (net8.0)**. You need the [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) to build and run. - -## Logging -The CLI uses **NLog** for logging. Configuration is in `MyNumberNET_CLI/nlog.config`. -## License -See LICENSE for details. +This repository uses .NET 8.0. The required SDK version is specified in `global.json`.