Skip to content

Commit 65dc730

Browse files
committed
Initial commit
1 parent 19907fa commit 65dc730

File tree

106 files changed

+4499
-13
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+4499
-13
lines changed

.gitattributes

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
###############################################################################
2+
# Set default behavior to automatically normalize line endings.
3+
###############################################################################
4+
* text=auto
5+
6+
###############################################################################
7+
# Set default behavior for command prompt diff.
8+
#
9+
# This is need for earlier builds of msysgit that does not have it on by
10+
# default for csharp files.
11+
# Note: This is only used by command line
12+
###############################################################################
13+
#*.cs diff=csharp
14+
15+
###############################################################################
16+
# Set the merge driver for project and solution files
17+
#
18+
# Merging from the command prompt will add diff markers to the files if there
19+
# are conflicts (Merging from VS is not affected by the settings below, in VS
20+
# the diff markers are never inserted). Diff markers may cause the following
21+
# file extensions to fail to load in VS. An alternative would be to treat
22+
# these files as binary and thus will always conflict and require user
23+
# intervention with every merge. To do so, just uncomment the entries below
24+
###############################################################################
25+
#*.sln merge=binary
26+
#*.csproj merge=binary
27+
#*.vbproj merge=binary
28+
#*.vcxproj merge=binary
29+
#*.vcproj merge=binary
30+
#*.dbproj merge=binary
31+
#*.fsproj merge=binary
32+
#*.lsproj merge=binary
33+
#*.wixproj merge=binary
34+
#*.modelproj merge=binary
35+
#*.sqlproj merge=binary
36+
#*.wwaproj merge=binary
37+
38+
###############################################################################
39+
# behavior for image files
40+
#
41+
# image files are treated as binary by default.
42+
###############################################################################
43+
#*.jpg binary
44+
#*.png binary
45+
#*.gif binary
46+
47+
###############################################################################
48+
# diff behavior for common document formats
49+
#
50+
# Convert binary document formats to text before diffing them. This feature
51+
# is only available from the command line. Turn it on by uncommenting the
52+
# entries below.
53+
###############################################################################
54+
#*.doc diff=astextplain
55+
#*.DOC diff=astextplain
56+
#*.docx diff=astextplain
57+
#*.DOCX diff=astextplain
58+
#*.dot diff=astextplain
59+
#*.DOT diff=astextplain
60+
#*.pdf diff=astextplain
61+
#*.PDF diff=astextplain
62+
#*.rtf diff=astextplain
63+
#*.RTF diff=astextplain

.github/workflows/main.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: CI
2+
3+
on:
4+
release:
5+
types:
6+
- created
7+
8+
jobs:
9+
build:
10+
11+
env:
12+
BUILD_CONFIG: 'Release'
13+
SOLUTION: 'COINNP.sln'
14+
15+
runs-on: ubuntu-latest
16+
17+
steps:
18+
- uses: actions/checkout@v3
19+
20+
- name: Setup .NET
21+
uses: actions/setup-dotnet@v3
22+
with:
23+
dotnet-version: 8.0.x
24+
25+
- name: Setup NuGet
26+
uses: NuGet/setup-nuget@v1
27+
28+
- name: Restore dependencies
29+
run: dotnet restore $SOLUTION
30+
31+
- name: Build
32+
run: dotnet build $SOLUTION --configuration $BUILD_CONFIG --no-restore /p:Version="${{ github.event.release.tag_name }}"
33+
34+
- name: Run tests
35+
run: dotnet test --configuration $BUILD_CONFIG --no-restore --no-build --verbosity normal
36+
37+
- name: Publish
38+
run: nuget push **\*.nupkg -Source 'https://api.nuget.org/v3/index.json' -ApiKey ${{secrets.NUGET_API_KEY}}

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,4 +395,4 @@ FodyWeavers.xsd
395395
*.msp
396396

397397
# JetBrains Rider
398-
*.sln.iml
398+
*.sln.iml

COINNP.Client/Acknowledgement.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace COINNP.Client;
2+
3+
/// <summary>
4+
/// Defines the available acknowledgement options
5+
/// </summary>
6+
public enum Acknowledgement
7+
{
8+
/// <summary>Acknowledge message as received/handled; message will be removed from queue.</summary>
9+
ACK,
10+
/// <summary>Do NOT Acknowledge message as received/handled; message will be kept in queue.</summary>
11+
NACK
12+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using Coin.Sdk.NP.Messages.V3;
2+
using Coin.Sdk.NP.Service;
3+
using COINNP.Client.Mapping;
4+
5+
namespace COINNP.Client.Adapters;
6+
7+
/// <summary>
8+
/// Implements COIN's INumberPortabilityMessageListener and 'routes' all messages to OnMessage, which invokes a
9+
/// user-defined messagehandler
10+
/// </summary>
11+
internal class NPMessageListenerAdapter : INumberPortabilityMessageListener
12+
{
13+
private readonly INPMessageHandler _messagehandler;
14+
private readonly INumberPortabilityService _numberportabilityservice;
15+
private readonly IValueHelper _valuehelper;
16+
17+
public NPMessageListenerAdapter(INumberPortabilityService numberPortabilityService, INPMessageHandler messageHandler, IValueHelper valueHelper)
18+
{
19+
_numberportabilityservice = numberPortabilityService ?? throw new ArgumentNullException(nameof(numberPortabilityService));
20+
_messagehandler = messageHandler ?? throw new ArgumentNullException(nameof(messageHandler));
21+
_valuehelper = valueHelper ?? throw new ArgumentNullException(nameof(valueHelper));
22+
}
23+
24+
public async void OnActivationServiceNumber(string messageId, ActivationServiceNumberMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
25+
public async void OnCancel(string messageId, CancelMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
26+
public async void OnDeactivation(string messageId, DeactivationMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
27+
public async void OnDeactivationServiceNumber(string messageId, DeactivationServiceNumberMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
28+
public async void OnEnumActivationNumber(string messageId, EnumActivationNumberMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
29+
public async void OnEnumActivationOperator(string messageId, EnumActivationOperatorMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
30+
public async void OnEnumActivationRange(string messageId, EnumActivationRangeMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
31+
public async void OnEnumDeactivationNumber(string messageId, EnumDeactivationNumberMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
32+
public async void OnEnumDeactivationOperator(string messageId, EnumDeactivationOperatorMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
33+
public async void OnEnumDeactivationRange(string messageId, EnumDeactivationRangeMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
34+
public async void OnEnumProfileActivation(string messageId, EnumProfileActivationMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
35+
public async void OnEnumProfileDeactivation(string messageId, EnumProfileDeactivationMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
36+
public async void OnPortingPerformed(string messageId, PortingPerformedMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
37+
public async void OnPortingRequest(string messageId, PortingRequestMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
38+
public async void OnPortingRequestAnswer(string messageId, PortingRequestAnswerMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
39+
public async void OnPortingRequestAnswerDelayed(string messageId, PortingRequestAnswerDelayedMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
40+
public async void OnRangeActivation(string messageId, RangeActivationMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
41+
public async void OnRangeDeactivation(string messageId, RangeDeactivationMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
42+
public async void OnTariffChangeServiceNumber(string messageId, TariffChangeServiceNumberMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
43+
public async void OnErrorFound(string messageId, ErrorFoundMessage message) => await OnMessage(messageId, message).ConfigureAwait(false);
44+
45+
private async Task OnMessage<T>(string messageId, INpMessage<T> message)
46+
where T : INpMessageContent
47+
{
48+
try
49+
{
50+
if (await _messagehandler.OnMessageAsync(messageId, message.FromCOIN(_valuehelper)).ConfigureAwait(false) == Acknowledgement.ACK)
51+
{
52+
await _numberportabilityservice.SendConfirmationAsync(messageId).ConfigureAwait(false);
53+
}
54+
}
55+
catch (Exception ex)
56+
{
57+
await _messagehandler.OnExceptionAsync(ex).ConfigureAwait(false);
58+
}
59+
}
60+
61+
public async void OnException(Exception exception) => await _messagehandler.OnExceptionAsync(exception).ConfigureAwait(false);
62+
public async void OnKeepAlive() => await _messagehandler.OnKeepAliveAsync().ConfigureAwait(false);
63+
public async void OnUnknownMessage(string messageId, string message) => await _messagehandler.OnUnknownMessageAsync(messageId, message).ConfigureAwait(false);
64+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace COINNP.Client.Adapters;
2+
3+
internal class OffsetPersistorAdapter : Coin.Sdk.Common.Client.IOffsetPersister
4+
{
5+
private readonly IOffsetPersister _offsetpersister;
6+
public OffsetPersistorAdapter(IOffsetPersister offsetPersister)
7+
=> _offsetpersister = offsetPersister ?? throw new ArgumentNullException(nameof(offsetPersister));
8+
9+
public long Offset
10+
{
11+
get => _offsetpersister.GetOffset();
12+
set => _offsetpersister.SetOffset(value);
13+
}
14+
}

COINNP.Client/COINNP.Client.csproj

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netstandard2.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
<LangVersion>latest</LangVersion>
8+
<EnableNETAnalyzers>true</EnableNETAnalyzers>
9+
<AnalysisLevel>latest</AnalysisLevel>
10+
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
11+
<Title>COIN Number Portability Client</Title>
12+
<Authors>RobIII</Authors>
13+
<Company>Wholesale Operator</Company>
14+
<Copyright>(C) 2023 - 2024 Wholesale Operator</Copyright>
15+
<PackageProjectUrl>https://github.com/Wholesale-Operator/COINNP.Client</PackageProjectUrl>
16+
<PackageIcon>logo.png</PackageIcon>
17+
<PackageReadmeFile>README.md</PackageReadmeFile>
18+
<RepositoryType>git</RepositoryType>
19+
<RepositoryUrl>https://github.com/Wholesale-Operator/COINNP.Client</RepositoryUrl>
20+
<PackageTags>VerenigingCOIN, Vereniging-COIN, Number Portability</PackageTags>
21+
<PackageLicenseExpression>MIT</PackageLicenseExpression>
22+
<Description>Provides a 'wrapper' for vereniging COIN's Number Portability Library that hides a few 'oddities' of working with the NP messages and message consumer / listener. This library aims to provide a more 'idiomatic C#' API which uses modern C# concepts like immutable records, nullable aware and proper types like DateTimeOffset or bool where COIN's implementation mostly only provides strings.</Description>
23+
</PropertyGroup>
24+
25+
<ItemGroup>
26+
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.1" />
27+
<PackageReference Include="Newtonsoft.Json" Version="13.0.3">
28+
<PrivateAssets>compile</PrivateAssets>
29+
</PackageReference>
30+
<PackageReference Include="PolySharp" Version="1.14.1">
31+
<PrivateAssets>all</PrivateAssets>
32+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
33+
</PackageReference>
34+
<PackageReference Include="System.Collections.Immutable" Version="8.0.0" />
35+
<PackageReference Include="Vereniging-COIN.Sdk.NP" Version="1.5.0">
36+
<PrivateAssets>compile</PrivateAssets>
37+
</PackageReference>
38+
</ItemGroup>
39+
40+
<ItemGroup>
41+
<None Include="logo.png">
42+
<Pack>True</Pack>
43+
<PackagePath>\</PackagePath>
44+
</None>
45+
<None Include="README.md">
46+
<Pack>True</Pack>
47+
<PackagePath>\</PackagePath>
48+
</None>
49+
</ItemGroup>
50+
51+
<ItemGroup>
52+
<ProjectReference Include="..\COINNP.Entities\COINNP.Entities.csproj" />
53+
</ItemGroup>
54+
55+
<ItemGroup>
56+
<Compile Update="ResourceFiles\Translations.Designer.cs">
57+
<DesignTime>True</DesignTime>
58+
<AutoGen>True</AutoGen>
59+
<DependentUpon>Translations.resx</DependentUpon>
60+
</Compile>
61+
</ItemGroup>
62+
63+
<ItemGroup>
64+
<EmbeddedResource Update="ResourceFiles\Translations.resx">
65+
<Generator>ResXFileCodeGenerator</Generator>
66+
<LastGenOutput>Translations.Designer.cs</LastGenOutput>
67+
</EmbeddedResource>
68+
</ItemGroup>
69+
</Project>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace COINNP.Client.Exceptions;
2+
public abstract class COINNPException : Exception
3+
{
4+
public COINNPException(string message, Exception? innerException = null)
5+
: base(message, innerException) { }
6+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace COINNP.Client.Exceptions;
2+
3+
public class DeserializationException : COINNPException
4+
{
5+
public string Json { get; init; }
6+
public string TypeName { get; init; }
7+
8+
public DeserializationException(string message, string json, string typeName, Exception? innerException = null)
9+
: base(message, innerException)
10+
{
11+
Json = json;
12+
TypeName = typeName;
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace COINNP.Client.Exceptions;
2+
3+
public class SerializationException : COINNPException
4+
{
5+
public object Object { get; init; }
6+
public string TypeName { get; init; }
7+
8+
public SerializationException(string message, object obj, string typeName, Exception? innerException = null)
9+
: base(message, innerException)
10+
{
11+
Object = obj;
12+
TypeName = typeName;
13+
}
14+
}

0 commit comments

Comments
 (0)