This commit is contained in:
Zeeshaun
2026-03-17 11:20:00 -05:00
parent 6e7edcfe1b
commit de9ddd5001
130 changed files with 268474 additions and 0 deletions
@@ -0,0 +1,351 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
.idea
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
@@ -0,0 +1,15 @@
{
"header": "Collections API Changelog",
"types": [
{"type": "feat", "section": "Features"},
{"type": "fix", "section": "Bug Fixes"},
{"type": "chore", "hidden": true},
{"type": "docs", "hidden": true},
{"type": "style", "hidden": true},
{"type": "refactor", "hidden": true},
{"type": "perf", "hidden": true},
{"type": "test", "hidden": true}
],
"commitUrlFormat": "{{host}}/Repo/_git/LCU.API.Collections.CollectionsApi",
"issueUrlFormat": "{{host}}/Repo/_workitems/edit/{{id}}/"
}
@@ -0,0 +1,40 @@
# Changelog
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## 1.1.0 (2020-08-27)
### Bug Fixes
* **ApiLib:** Bump library to 1.3.0 ([fff2439](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **CollectionsLetterRepository:** Filter on history.PrintDate != null ([b38d824](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **Cors:** Fix cors issue ([7251f67](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **Formatting:** Remove unused import, rename badly named variables, etc ([8fc43fe](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **IntellecRepository:** Remove the hard coded o4r/repo status list ([26ecc2b](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **Temenos:** Add additional account fields ([03351e2](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **TemenosAccountDao:** Replace TODO in TemenosAccountDao ([63e44c9](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **TemenosSessionDao:** Remove unnecessary scope factory ([df3913e](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
### Features
* **CollectionsApi:** Setup project and add cors loan service ([77337bc](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **CollectionsAPI:** Remove CORS and Intellect ([f3b01c3](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **CollectionsApiLib:** Publish library for use ([12c0e15](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **CollectionsHistory:** Create CollectionsHistory Endpoint ([5b71e5a](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi)), closes [#2664](https://landmarkcu.visualstudio.com/Repo/_workitems/edit/2664/)
* **CORS:** Add further internal CORS ([eeef0df](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **CORS:** Allow CORS from localhost:3000 ([60687e3](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **FilterBase:** Increase Max Limit to 10,000 ([f6c37c0](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi)), closes [#3259](https://landmarkcu.visualstudio.com/Repo/_workitems/edit/3259/)
* **History:** Create History Comment endpoint ([753fe26](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi)), closes [#2615](https://landmarkcu.visualstudio.com/Repo/_workitems/edit/2615/)
* **Intellec:** Add intellect service, paging, logging, tests ([746f823](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **Intellec:** Find by account no ([9bd8cc0](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **RepoStatus:** NEw repo status ([b9a1764](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **SessionDao:** Add Temenos Session Dao ([42bfaca](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **Status:** Add status screen and environments ([267b551](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **Status:** Better status values ([fbb74fd](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **Temenos:** Add fields ([ecf82c6](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **Temenos:** Convert Temenos Status to Repo Status ([052dccd](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **Temenos:** Load Accounts and Cases by id/no ([543f26c](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **Temenos:** Reconfigure temenos api ([6380daa](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
* **TemenosAccount:** Load custom fields as map ([dd880d3](https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi))
@@ -0,0 +1,72 @@
# Build stage
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
ARG PAT=bh2lq3jibktw67b2wdbqyfln7cd3je6lk52kijntpj43v6kimpgq
WORKDIR /source
# Install credential provider for authenticated Azure DevOps feeds
# Debian 10 (buster) is archived; repoint sources to archive.debian.org before installing packages.
RUN sed -i 's|deb.debian.org/debian|archive.debian.org/debian|g; s|security.debian.org/debian-security|archive.debian.org/debian-security|g; s|deb.debian.org/debian-security|archive.debian.org/debian-security|g' /etc/apt/sources.list && \
apt-get update && apt-get install -y --no-install-recommends ca-certificates curl unzip && \
update-ca-certificates && \
rm -rf /var/lib/apt/lists/*
# Configure NuGet with Azure DevOps feed credentials (avoids plugin dependency)
RUN mkdir -p /root/.nuget/NuGet && \
cat > /root/.nuget/NuGet/NuGet.Config <<EOF
<configuration>
<packageSources>
<clear />
<add key="LCU-Internal" value="https://landmarkcu.pkgs.visualstudio.com/_packaging/LCU-Internal/nuget/v3/index.json" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<packageSourceCredentials>
<LCU-Internal>
<add key="Username" value="pat" />
<add key="ClearTextPassword" value="${PAT}" />
</LCU-Internal>
</packageSourceCredentials>
<fallbackPackageFolders>
<clear />
</fallbackPackageFolders>
</configuration>
EOF
# Copy solution and project files and restore
COPY LCU.API.Collections.CollectionsApi.sln .
COPY LCU.API.Collections.CollectionsApi/LCU.API.Collections.CollectionsApi.csproj ./LCU.API.Collections.CollectionsApi/
COPY LCU.API.Collections.CollectionsApiLib/LCU.API.Collections.CollectionsApiLib.csproj ./LCU.API.Collections.CollectionsApiLib/
COPY LCU.API.Collections.CollectionsApiTests/LCU.API.Collections.CollectionsApiTests.csproj ./LCU.API.Collections.CollectionsApiTests/
RUN dotnet restore -s "https://landmarkcu.pkgs.visualstudio.com/_packaging/LCU-Internal/nuget/v3/index.json" -s "https://api.nuget.org/v3/index.json" ./LCU.API.Collections.CollectionsApi.sln
# Copy full source and build
COPY . .
RUN dotnet restore -s "https://landmarkcu.pkgs.visualstudio.com/_packaging/LCU-Internal/nuget/v3/index.json" -s "https://api.nuget.org/v3/index.json" ./LCU.API.Collections.CollectionsApi.sln
RUN dotnet build ./LCU.API.Collections.CollectionsApi/LCU.API.Collections.CollectionsApi.csproj -c Release --no-restore
# Test stage
FROM build AS test
WORKDIR /source
RUN dotnet test ./LCU.API.Collections.CollectionsApiTests/LCU.API.Collections.CollectionsApiTests.csproj -c Release --no-restore --logger "trx;LogFileName=test_results.trx"
# Publish stage
FROM build AS publish
WORKDIR /source
RUN dotnet publish ./LCU.API.Collections.CollectionsApi/LCU.API.Collections.CollectionsApi.csproj -c Release -o /app/publish --no-restore
# Runtime stage
FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS final
# Debian 10 (buster) is archived; repoint sources to archive.debian.org before installing packages.
RUN sed -i 's|deb.debian.org/debian|archive.debian.org/debian|g; s|security.debian.org/debian-security|archive.debian.org/debian-security|g; s|deb.debian.org/debian-security|archive.debian.org/debian-security|g' /etc/apt/sources.list && \
apt-get update && \
apt-get install -y --no-install-recommends libicu-dev tzdata && \
rm -rf /var/lib/apt/lists/*
ENV TZ=America/Chicago
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
ENV ASPNETCORE_ENVIRONMENT=Development
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "LCU.API.Collections.CollectionsApi.dll"]
@@ -0,0 +1,40 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30002.166
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LCU.API.Collections.CollectionsApi", "LCU.API.Collections.CollectionsApi\LCU.API.Collections.CollectionsApi.csproj", "{7D12B7C0-7967-41CA-A442-A3F78182F0B5}"
ProjectSection(ProjectDependencies) = postProject
{43E63D22-FF4F-4833-8E66-28090BAA152A} = {43E63D22-FF4F-4833-8E66-28090BAA152A}
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LCU.API.Collections.CollectionsApiTests", "LCU.API.Collections.CollectionsApiTests\LCU.API.Collections.CollectionsApiTests.csproj", "{EA9E0245-8AA9-4E33-8507-E7C41EFC5DA5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LCU.API.Collections.CollectionsApiLib", "LCU.API.Collections.CollectionsApiLib\LCU.API.Collections.CollectionsApiLib.csproj", "{43E63D22-FF4F-4833-8E66-28090BAA152A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{7D12B7C0-7967-41CA-A442-A3F78182F0B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7D12B7C0-7967-41CA-A442-A3F78182F0B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7D12B7C0-7967-41CA-A442-A3F78182F0B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7D12B7C0-7967-41CA-A442-A3F78182F0B5}.Release|Any CPU.Build.0 = Release|Any CPU
{EA9E0245-8AA9-4E33-8507-E7C41EFC5DA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EA9E0245-8AA9-4E33-8507-E7C41EFC5DA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EA9E0245-8AA9-4E33-8507-E7C41EFC5DA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EA9E0245-8AA9-4E33-8507-E7C41EFC5DA5}.Release|Any CPU.Build.0 = Release|Any CPU
{43E63D22-FF4F-4833-8E66-28090BAA152A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{43E63D22-FF4F-4833-8E66-28090BAA152A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{43E63D22-FF4F-4833-8E66-28090BAA152A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{43E63D22-FF4F-4833-8E66-28090BAA152A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {458D6DB8-766A-4013-8923-6571AB24E3EF}
EndGlobalSection
EndGlobal
@@ -0,0 +1,50 @@
using System.Collections.Generic;
using LCU.API.Collections.CollectionsApi.Dao;
using LCU.API.Collections.CollectionsApiLib.Models;
namespace LCU.API.Collections.CollectionsApi.Configuration
{
public class CollectionsApiConfiguration : ITemenosSecurityConfig, ICaseStageConfig
{
public string AppName { get; set; }
public string SeqApiKey { get; set; }
public string SeqUrl { get; set; }
public string TemenosUrl { get; set; }
public string TemenosUser { get; set; }
public string TemenosPassword { get; set; }
public int TemenosCaseCommentMinDate { get; set; }
public IReadOnlyCollection<RepoCaseRepoType> CaseRepoTypes { get; set; }
public IReadOnlyCollection<RepoCaseStage> CaseStages { get; set; }
public IReadOnlyCollection<RepoAccountType> RepoAccountTypes { get; set; }
public string GetUrl()
{
return TemenosUrl;
}
public string GetUsername()
{
return TemenosUser;
}
public string GetPassword()
{
return TemenosPassword;
}
public IReadOnlyCollection<RepoCaseStage> GetCaseStages()
{
return CaseStages;
}
public IReadOnlyCollection<RepoCaseRepoType> GetCaseRepoTypes()
{
return CaseRepoTypes;
}
public IReadOnlyCollection<RepoAccountType> GetRepoAccountTypes()
{
return RepoAccountTypes;
}
}
}
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using LCU.API.Collections.CollectionsApiLib.Models;
namespace LCU.API.Collections.CollectionsApi.Configuration
{
public interface ICaseStageConfig
{
IReadOnlyCollection<RepoCaseStage> GetCaseStages();
}
}
@@ -0,0 +1,9 @@
namespace LCU.API.Collections.CollectionsApi.Configuration
{
public class TemenosApiWrapperConfiguration
{
public string TemenosApiWrapperUrl { get; set; }
public string AccountSearch { get; set; }
public string DefaultLookupType { get; set; }
}
}
@@ -0,0 +1,177 @@
{
"ExtendedData": {
"inputs": [
"https://lms-app-lcu.temenoscloudna.com/Akcelerant.AccountServicing.Service/Account.svc?WSDL"
],
"collectionTypes": [
"System.Array",
"System.Collections.Generic.Dictionary`2"
],
"namespaceMappings": [
"*, TemenosAccount"
],
"references": [
"AutoMapper, {AutoMapper, 9.0.0}",
"dotnet-aspnet-codegenerator-design, {Microsoft.VisualStudio.Web.CodeGeneration.Design, 2.2.3}",
"Microsoft.AspNetCore.Authentication.Abstractions, {Microsoft.AspNetCore.Authentication.Abstractions, 2.0.0}",
"Microsoft.AspNetCore.Authentication.Core, {Microsoft.AspNetCore.Authentication.Core, 2.0.0}",
"Microsoft.AspNetCore.Authorization, {Microsoft.AspNetCore.Authorization, 2.0.0}",
"Microsoft.AspNetCore.Authorization.Policy, {Microsoft.AspNetCore.Authorization.Policy, 2.0.0}",
"Microsoft.AspNetCore.Hosting.Abstractions, {Microsoft.AspNetCore.Hosting.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Hosting.Server.Abstractions, {Microsoft.AspNetCore.Hosting.Server.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Http, {Microsoft.AspNetCore.Http, 2.0.0}",
"Microsoft.AspNetCore.Http.Abstractions, {Microsoft.AspNetCore.Http.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Http.Extensions, {Microsoft.AspNetCore.Http.Extensions, 2.0.0}",
"Microsoft.AspNetCore.Http.Features, {Microsoft.AspNetCore.Http.Features, 2.2.0}",
"Microsoft.AspNetCore.JsonPatch, {Microsoft.AspNetCore.JsonPatch, 2.0.0}",
"Microsoft.AspNetCore.Mvc.Abstractions, {Microsoft.AspNetCore.Mvc.Abstractions, 2.0.0}",
"Microsoft.AspNetCore.Mvc.ApiExplorer, {Microsoft.AspNetCore.Mvc.ApiExplorer, 2.0.0}",
"Microsoft.AspNetCore.Mvc.Core, {Microsoft.AspNetCore.Mvc.Core, 2.0.0}",
"Microsoft.AspNetCore.Mvc.DataAnnotations, {Microsoft.AspNetCore.Mvc.DataAnnotations, 2.0.0}",
"Microsoft.AspNetCore.Mvc.Formatters.Json, {Microsoft.AspNetCore.Mvc.Formatters.Json, 2.0.0}",
"Microsoft.AspNetCore.Razor.Language, {Microsoft.AspNetCore.Razor.Language, 2.2.0}",
"Microsoft.AspNetCore.ResponseCaching.Abstractions, {Microsoft.AspNetCore.ResponseCaching.Abstractions, 2.0.0}",
"Microsoft.AspNetCore.Routing, {Microsoft.AspNetCore.Routing, 2.0.0}",
"Microsoft.AspNetCore.Routing.Abstractions, {Microsoft.AspNetCore.Routing.Abstractions, 2.0.0}",
"Microsoft.AspNetCore.StaticFiles, {Microsoft.AspNetCore.StaticFiles, 2.0.0}",
"Microsoft.AspNetCore.WebUtilities, {Microsoft.AspNetCore.WebUtilities, 2.0.0}",
"Microsoft.Bcl.AsyncInterfaces, {Microsoft.Bcl.AsyncInterfaces, 5.0.0}",
"Microsoft.CodeAnalysis, {Microsoft.CodeAnalysis.Common, 2.8.0}",
"Microsoft.CodeAnalysis.CSharp, {Microsoft.CodeAnalysis.CSharp, 2.8.0}",
"Microsoft.CodeAnalysis.CSharp.Workspaces, {Microsoft.CodeAnalysis.CSharp.Workspaces, 2.8.0}",
"Microsoft.CodeAnalysis.Workspaces, {Microsoft.CodeAnalysis.Workspaces.Common, 2.8.0}",
"Microsoft.DotNet.PlatformAbstractions, {Microsoft.DotNet.PlatformAbstractions, 2.0.4}",
"Microsoft.Extensions.Configuration, {Microsoft.Extensions.Configuration, 2.2.0}",
"Microsoft.Extensions.Configuration.Abstractions, {Microsoft.Extensions.Configuration.Abstractions, 2.2.0}",
"Microsoft.Extensions.Configuration.Binder, {Microsoft.Extensions.Configuration.Binder, 2.2.0}",
"Microsoft.Extensions.DependencyInjection, {Microsoft.Extensions.DependencyInjection, 2.2.0}",
"Microsoft.Extensions.DependencyInjection.Abstractions, {Microsoft.Extensions.DependencyInjection.Abstractions, 2.2.0}",
"Microsoft.Extensions.DependencyModel, {Microsoft.Extensions.DependencyModel, 2.0.4}",
"Microsoft.Extensions.FileProviders.Abstractions, {Microsoft.Extensions.FileProviders.Abstractions, 2.2.0}",
"Microsoft.Extensions.FileProviders.Embedded, {Microsoft.Extensions.FileProviders.Embedded, 2.0.0}",
"Microsoft.Extensions.Hosting.Abstractions, {Microsoft.Extensions.Hosting.Abstractions, 2.2.0}",
"Microsoft.Extensions.Localization, {Microsoft.Extensions.Localization, 2.0.0}",
"Microsoft.Extensions.Localization.Abstractions, {Microsoft.Extensions.Localization.Abstractions, 2.0.0}",
"Microsoft.Extensions.Logging, {Microsoft.Extensions.Logging, 2.2.0}",
"Microsoft.Extensions.Logging.Abstractions, {Microsoft.Extensions.Logging.Abstractions, 2.2.0}",
"Microsoft.Extensions.Logging.EventLog, {Microsoft.Extensions.Logging.EventLog, 2.2.0}",
"Microsoft.Extensions.ObjectPool, {Microsoft.Extensions.ObjectPool, 5.0.10}",
"Microsoft.Extensions.Options, {Microsoft.Extensions.Options, 2.2.0}",
"Microsoft.Extensions.Options.ConfigurationExtensions, {Microsoft.Extensions.Options.ConfigurationExtensions, 2.0.0}",
"Microsoft.Extensions.Primitives, {Microsoft.Extensions.Primitives, 2.2.0}",
"Microsoft.Extensions.WebEncoders, {Microsoft.Extensions.WebEncoders, 2.0.0}",
"Microsoft.IdentityModel.Logging, {Microsoft.IdentityModel.Logging, 6.8.0}",
"Microsoft.IdentityModel.Protocols.WsTrust, {Microsoft.IdentityModel.Protocols.WsTrust, 6.8.0}",
"Microsoft.IdentityModel.Tokens, {Microsoft.IdentityModel.Tokens, 6.8.0}",
"Microsoft.IdentityModel.Tokens.Saml, {Microsoft.IdentityModel.Tokens.Saml, 6.8.0}",
"Microsoft.IdentityModel.Xml, {Microsoft.IdentityModel.Xml, 6.8.0}",
"Microsoft.Net.Http.Headers, {Microsoft.Net.Http.Headers, 2.0.0}",
"Microsoft.VisualStudio.Web.CodeGeneration, {Microsoft.VisualStudio.Web.CodeGeneration, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.Contracts, {Microsoft.VisualStudio.Web.CodeGeneration.Contracts, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.Core, {Microsoft.VisualStudio.Web.CodeGeneration.Core, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore, {Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.Templating, {Microsoft.VisualStudio.Web.CodeGeneration.Templating, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.Utils, {Microsoft.VisualStudio.Web.CodeGeneration.Utils, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc, {Microsoft.VisualStudio.Web.CodeGenerators.Mvc, 2.2.3}",
"Microsoft.Win32.Primitives, {Microsoft.Win32.Primitives, 4.3.0}",
"Newtonsoft.Json, {Newtonsoft.Json, 11.0.2}",
"NuGet.Frameworks, {NuGet.Frameworks, 4.7.0}",
"Serilog, {Serilog, 2.9.0}",
"Serilog.AspNetCore, {Serilog.AspNetCore, 3.2.0}",
"Serilog.Extensions.Hosting, {Serilog.Extensions.Hosting, 3.0.0}",
"Serilog.Extensions.Logging, {Serilog.Extensions.Logging, 3.0.1}",
"Serilog.Formatting.Compact, {Serilog.Formatting.Compact, 1.0.0}",
"Serilog.Settings.Configuration, {Serilog.Settings.Configuration, 3.1.0}",
"Serilog.Sinks.Async, {Serilog.Sinks.Async, 1.4.0}",
"Serilog.Sinks.Console, {Serilog.Sinks.Console, 3.1.1}",
"Serilog.Sinks.Debug, {Serilog.Sinks.Debug, 1.0.1}",
"Serilog.Sinks.File, {Serilog.Sinks.File, 4.0.0}",
"Serilog.Sinks.PeriodicBatching, {Serilog.Sinks.PeriodicBatching, 2.1.1}",
"Serilog.Sinks.Seq, {Serilog.Sinks.Seq, 4.0.0}",
"Swashbuckle.AspNetCore, {Swashbuckle.AspNetCore, 4.0.1}",
"Swashbuckle.AspNetCore.Swagger, {Swashbuckle.AspNetCore.Swagger, 4.0.1}",
"Swashbuckle.AspNetCore.SwaggerGen, {Swashbuckle.AspNetCore.SwaggerGen, 4.0.1}",
"Swashbuckle.AspNetCore.SwaggerUI, {Swashbuckle.AspNetCore.SwaggerUI, 4.0.1}",
"System.AppContext, {System.AppContext, 4.3.0}",
"System.Collections, {System.Collections, 4.3.0}",
"System.Collections.Concurrent, {System.Collections.Concurrent, 4.3.0}",
"System.Collections.Immutable, {System.Collections.Immutable, 1.3.1}",
"System.Composition.AttributedModel, {System.Composition.AttributedModel, 1.0.31}",
"System.Composition.Convention, {System.Composition.Convention, 1.0.31}",
"System.Composition.Hosting, {System.Composition.Hosting, 1.0.31}",
"System.Composition.Runtime, {System.Composition.Runtime, 1.0.31}",
"System.Composition.TypedParts, {System.Composition.TypedParts, 1.0.31}",
"System.Console, {System.Console, 4.3.0}",
"System.Diagnostics.Contracts, {System.Diagnostics.Contracts, 4.3.0}",
"System.Diagnostics.Debug, {System.Diagnostics.Debug, 4.3.0}",
"System.Diagnostics.EventLog, {System.Diagnostics.EventLog, 4.5.0}",
"System.Diagnostics.Tools, {System.Diagnostics.Tools, 4.3.0}",
"System.Diagnostics.Tracing, {System.Diagnostics.Tracing, 4.3.0}",
"System.Dynamic.Runtime, {System.Dynamic.Runtime, 4.3.0}",
"System.Formats.Asn1, {System.Formats.Asn1, 6.0.0}",
"System.Globalization, {System.Globalization, 4.3.0}",
"System.Globalization.Calendars, {System.Globalization.Calendars, 4.3.0}",
"System.IO, {System.IO, 4.3.0}",
"System.IO.Compression, {System.IO.Compression, 4.3.0}",
"System.IO.Compression.ZipFile, {System.IO.Compression.ZipFile, 4.3.0}",
"System.IO.FileSystem, {System.IO.FileSystem, 4.3.0}",
"System.IO.FileSystem.Primitives, {System.IO.FileSystem.Primitives, 4.3.0}",
"System.Linq, {System.Linq, 4.3.0}",
"System.Linq.Expressions, {System.Linq.Expressions, 4.3.0}",
"System.Linq.Parallel, {System.Linq.Parallel, 4.3.0}",
"System.Net.Http, {System.Net.Http, 4.3.2}",
"System.Net.Primitives, {System.Net.Primitives, 4.3.0}",
"System.Net.Sockets, {System.Net.Sockets, 4.3.0}",
"System.ObjectModel, {System.ObjectModel, 4.3.0}",
"System.Reflection, {System.Reflection, 4.3.0}",
"System.Reflection.DispatchProxy, {System.Reflection.DispatchProxy, 4.7.1}",
"System.Reflection.Emit, {System.Reflection.Emit, 4.3.0}",
"System.Reflection.Emit.ILGeneration, {System.Reflection.Emit.ILGeneration, 4.3.0}",
"System.Reflection.Extensions, {System.Reflection.Extensions, 4.3.0}",
"System.Reflection.Metadata, {System.Reflection.Metadata, 1.4.2}",
"System.Reflection.Primitives, {System.Reflection.Primitives, 4.3.0}",
"System.Reflection.TypeExtensions, {System.Reflection.TypeExtensions, 4.3.0}",
"System.Resources.ResourceManager, {System.Resources.ResourceManager, 4.3.0}",
"System.Runtime, {System.Runtime, 4.3.0}",
"System.Runtime.Caching, {System.Runtime.Caching, 4.7.0}",
"System.Runtime.CompilerServices.Unsafe, {System.Runtime.CompilerServices.Unsafe, 4.5.1}",
"System.Runtime.Extensions, {System.Runtime.Extensions, 4.3.0}",
"System.Runtime.Handles, {System.Runtime.Handles, 4.3.0}",
"System.Runtime.InteropServices, {System.Runtime.InteropServices, 4.3.0}",
"System.Runtime.InteropServices.RuntimeInformation, {System.Runtime.InteropServices.RuntimeInformation, 4.3.0}",
"System.Runtime.Numerics, {System.Runtime.Numerics, 4.3.0}",
"System.Security.AccessControl, {System.Security.AccessControl, 6.0.0}",
"System.Security.Cryptography.Algorithms, {System.Security.Cryptography.Algorithms, 4.3.0}",
"System.Security.Cryptography.Cng, {System.Security.Cryptography.Cng, 5.0.0}",
"System.Security.Cryptography.Encoding, {System.Security.Cryptography.Encoding, 4.3.0}",
"System.Security.Cryptography.Pkcs, {System.Security.Cryptography.Pkcs, 6.0.1}",
"System.Security.Cryptography.Primitives, {System.Security.Cryptography.Primitives, 4.3.0}",
"System.Security.Cryptography.X509Certificates, {System.Security.Cryptography.X509Certificates, 4.3.0}",
"System.Security.Cryptography.Xml, {System.Security.Cryptography.Xml, 6.0.1}",
"System.Security.Permissions, {System.Security.Permissions, 4.7.0}",
"System.Security.Principal.Windows, {System.Security.Principal.Windows, 5.0.0}",
"System.ServiceModel, {System.ServiceModel.Primitives, 4.10.3}",
"System.ServiceModel.Duplex, {System.ServiceModel.Duplex, 4.10.3}",
"System.ServiceModel.Federation, {System.ServiceModel.Federation, 4.10.3}",
"System.ServiceModel.Http, {System.ServiceModel.Http, 4.10.3}",
"System.ServiceModel.NetTcp, {System.ServiceModel.NetTcp, 4.10.3}",
"System.ServiceModel.Primitives, {System.ServiceModel.Primitives, 4.10.3}",
"System.ServiceModel.Security, {System.ServiceModel.Security, 4.10.3}",
"System.Text.Encoding, {System.Text.Encoding, 4.3.0}",
"System.Text.Encoding.Extensions, {System.Text.Encoding.Extensions, 4.3.0}",
"System.Text.Encodings.Web, {System.Text.Encodings.Web, 4.5.0}",
"System.Text.RegularExpressions, {System.Text.RegularExpressions, 4.3.0}",
"System.Threading, {System.Threading, 4.3.0}",
"System.Threading.Tasks, {System.Threading.Tasks, 4.3.0}",
"System.Threading.Tasks.Parallel, {System.Threading.Tasks.Parallel, 4.3.0}",
"System.Threading.Timer, {System.Threading.Timer, 4.3.0}",
"System.ValueTuple, {System.ValueTuple, 4.3.0}",
"System.Windows.Extensions, {System.Windows.Extensions, 4.7.0}",
"System.Xml.ReaderWriter, {System.Xml.ReaderWriter, 4.3.0}",
"System.Xml.XDocument, {System.Xml.XDocument, 4.3.0}",
"System.Xml.XmlDocument, {System.Xml.XmlDocument, 4.3.0}"
],
"targetFramework": "netcoreapp3.1",
"typeReuseMode": "All"
}
}
@@ -0,0 +1,177 @@
{
"ExtendedData": {
"inputs": [
"https://lms-app-lcu.temenoscloudna.com/Akcelerant.AccountServicing.Service/Case.svc?WSDL"
],
"collectionTypes": [
"System.Array",
"System.Collections.Generic.Dictionary`2"
],
"namespaceMappings": [
"*, TemenosCase"
],
"references": [
"AutoMapper, {AutoMapper, 9.0.0}",
"dotnet-aspnet-codegenerator-design, {Microsoft.VisualStudio.Web.CodeGeneration.Design, 2.2.3}",
"Microsoft.AspNetCore.Authentication.Abstractions, {Microsoft.AspNetCore.Authentication.Abstractions, 2.0.0}",
"Microsoft.AspNetCore.Authentication.Core, {Microsoft.AspNetCore.Authentication.Core, 2.0.0}",
"Microsoft.AspNetCore.Authorization, {Microsoft.AspNetCore.Authorization, 2.0.0}",
"Microsoft.AspNetCore.Authorization.Policy, {Microsoft.AspNetCore.Authorization.Policy, 2.0.0}",
"Microsoft.AspNetCore.Hosting.Abstractions, {Microsoft.AspNetCore.Hosting.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Hosting.Server.Abstractions, {Microsoft.AspNetCore.Hosting.Server.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Http, {Microsoft.AspNetCore.Http, 2.0.0}",
"Microsoft.AspNetCore.Http.Abstractions, {Microsoft.AspNetCore.Http.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Http.Extensions, {Microsoft.AspNetCore.Http.Extensions, 2.0.0}",
"Microsoft.AspNetCore.Http.Features, {Microsoft.AspNetCore.Http.Features, 2.2.0}",
"Microsoft.AspNetCore.JsonPatch, {Microsoft.AspNetCore.JsonPatch, 2.0.0}",
"Microsoft.AspNetCore.Mvc.Abstractions, {Microsoft.AspNetCore.Mvc.Abstractions, 2.0.0}",
"Microsoft.AspNetCore.Mvc.ApiExplorer, {Microsoft.AspNetCore.Mvc.ApiExplorer, 2.0.0}",
"Microsoft.AspNetCore.Mvc.Core, {Microsoft.AspNetCore.Mvc.Core, 2.0.0}",
"Microsoft.AspNetCore.Mvc.DataAnnotations, {Microsoft.AspNetCore.Mvc.DataAnnotations, 2.0.0}",
"Microsoft.AspNetCore.Mvc.Formatters.Json, {Microsoft.AspNetCore.Mvc.Formatters.Json, 2.0.0}",
"Microsoft.AspNetCore.Razor.Language, {Microsoft.AspNetCore.Razor.Language, 2.2.0}",
"Microsoft.AspNetCore.ResponseCaching.Abstractions, {Microsoft.AspNetCore.ResponseCaching.Abstractions, 2.0.0}",
"Microsoft.AspNetCore.Routing, {Microsoft.AspNetCore.Routing, 2.0.0}",
"Microsoft.AspNetCore.Routing.Abstractions, {Microsoft.AspNetCore.Routing.Abstractions, 2.0.0}",
"Microsoft.AspNetCore.StaticFiles, {Microsoft.AspNetCore.StaticFiles, 2.0.0}",
"Microsoft.AspNetCore.WebUtilities, {Microsoft.AspNetCore.WebUtilities, 2.0.0}",
"Microsoft.Bcl.AsyncInterfaces, {Microsoft.Bcl.AsyncInterfaces, 5.0.0}",
"Microsoft.CodeAnalysis, {Microsoft.CodeAnalysis.Common, 2.8.0}",
"Microsoft.CodeAnalysis.CSharp, {Microsoft.CodeAnalysis.CSharp, 2.8.0}",
"Microsoft.CodeAnalysis.CSharp.Workspaces, {Microsoft.CodeAnalysis.CSharp.Workspaces, 2.8.0}",
"Microsoft.CodeAnalysis.Workspaces, {Microsoft.CodeAnalysis.Workspaces.Common, 2.8.0}",
"Microsoft.DotNet.PlatformAbstractions, {Microsoft.DotNet.PlatformAbstractions, 2.0.4}",
"Microsoft.Extensions.Configuration, {Microsoft.Extensions.Configuration, 2.2.0}",
"Microsoft.Extensions.Configuration.Abstractions, {Microsoft.Extensions.Configuration.Abstractions, 2.2.0}",
"Microsoft.Extensions.Configuration.Binder, {Microsoft.Extensions.Configuration.Binder, 2.2.0}",
"Microsoft.Extensions.DependencyInjection, {Microsoft.Extensions.DependencyInjection, 2.2.0}",
"Microsoft.Extensions.DependencyInjection.Abstractions, {Microsoft.Extensions.DependencyInjection.Abstractions, 2.2.0}",
"Microsoft.Extensions.DependencyModel, {Microsoft.Extensions.DependencyModel, 2.0.4}",
"Microsoft.Extensions.FileProviders.Abstractions, {Microsoft.Extensions.FileProviders.Abstractions, 2.2.0}",
"Microsoft.Extensions.FileProviders.Embedded, {Microsoft.Extensions.FileProviders.Embedded, 2.0.0}",
"Microsoft.Extensions.Hosting.Abstractions, {Microsoft.Extensions.Hosting.Abstractions, 2.2.0}",
"Microsoft.Extensions.Localization, {Microsoft.Extensions.Localization, 2.0.0}",
"Microsoft.Extensions.Localization.Abstractions, {Microsoft.Extensions.Localization.Abstractions, 2.0.0}",
"Microsoft.Extensions.Logging, {Microsoft.Extensions.Logging, 2.2.0}",
"Microsoft.Extensions.Logging.Abstractions, {Microsoft.Extensions.Logging.Abstractions, 2.2.0}",
"Microsoft.Extensions.Logging.EventLog, {Microsoft.Extensions.Logging.EventLog, 2.2.0}",
"Microsoft.Extensions.ObjectPool, {Microsoft.Extensions.ObjectPool, 5.0.10}",
"Microsoft.Extensions.Options, {Microsoft.Extensions.Options, 2.2.0}",
"Microsoft.Extensions.Options.ConfigurationExtensions, {Microsoft.Extensions.Options.ConfigurationExtensions, 2.0.0}",
"Microsoft.Extensions.Primitives, {Microsoft.Extensions.Primitives, 2.2.0}",
"Microsoft.Extensions.WebEncoders, {Microsoft.Extensions.WebEncoders, 2.0.0}",
"Microsoft.IdentityModel.Logging, {Microsoft.IdentityModel.Logging, 6.8.0}",
"Microsoft.IdentityModel.Protocols.WsTrust, {Microsoft.IdentityModel.Protocols.WsTrust, 6.8.0}",
"Microsoft.IdentityModel.Tokens, {Microsoft.IdentityModel.Tokens, 6.8.0}",
"Microsoft.IdentityModel.Tokens.Saml, {Microsoft.IdentityModel.Tokens.Saml, 6.8.0}",
"Microsoft.IdentityModel.Xml, {Microsoft.IdentityModel.Xml, 6.8.0}",
"Microsoft.Net.Http.Headers, {Microsoft.Net.Http.Headers, 2.0.0}",
"Microsoft.VisualStudio.Web.CodeGeneration, {Microsoft.VisualStudio.Web.CodeGeneration, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.Contracts, {Microsoft.VisualStudio.Web.CodeGeneration.Contracts, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.Core, {Microsoft.VisualStudio.Web.CodeGeneration.Core, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore, {Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.Templating, {Microsoft.VisualStudio.Web.CodeGeneration.Templating, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.Utils, {Microsoft.VisualStudio.Web.CodeGeneration.Utils, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc, {Microsoft.VisualStudio.Web.CodeGenerators.Mvc, 2.2.3}",
"Microsoft.Win32.Primitives, {Microsoft.Win32.Primitives, 4.3.0}",
"Newtonsoft.Json, {Newtonsoft.Json, 11.0.2}",
"NuGet.Frameworks, {NuGet.Frameworks, 4.7.0}",
"Serilog, {Serilog, 2.9.0}",
"Serilog.AspNetCore, {Serilog.AspNetCore, 3.2.0}",
"Serilog.Extensions.Hosting, {Serilog.Extensions.Hosting, 3.0.0}",
"Serilog.Extensions.Logging, {Serilog.Extensions.Logging, 3.0.1}",
"Serilog.Formatting.Compact, {Serilog.Formatting.Compact, 1.0.0}",
"Serilog.Settings.Configuration, {Serilog.Settings.Configuration, 3.1.0}",
"Serilog.Sinks.Async, {Serilog.Sinks.Async, 1.4.0}",
"Serilog.Sinks.Console, {Serilog.Sinks.Console, 3.1.1}",
"Serilog.Sinks.Debug, {Serilog.Sinks.Debug, 1.0.1}",
"Serilog.Sinks.File, {Serilog.Sinks.File, 4.0.0}",
"Serilog.Sinks.PeriodicBatching, {Serilog.Sinks.PeriodicBatching, 2.1.1}",
"Serilog.Sinks.Seq, {Serilog.Sinks.Seq, 4.0.0}",
"Swashbuckle.AspNetCore, {Swashbuckle.AspNetCore, 4.0.1}",
"Swashbuckle.AspNetCore.Swagger, {Swashbuckle.AspNetCore.Swagger, 4.0.1}",
"Swashbuckle.AspNetCore.SwaggerGen, {Swashbuckle.AspNetCore.SwaggerGen, 4.0.1}",
"Swashbuckle.AspNetCore.SwaggerUI, {Swashbuckle.AspNetCore.SwaggerUI, 4.0.1}",
"System.AppContext, {System.AppContext, 4.3.0}",
"System.Collections, {System.Collections, 4.3.0}",
"System.Collections.Concurrent, {System.Collections.Concurrent, 4.3.0}",
"System.Collections.Immutable, {System.Collections.Immutable, 1.3.1}",
"System.Composition.AttributedModel, {System.Composition.AttributedModel, 1.0.31}",
"System.Composition.Convention, {System.Composition.Convention, 1.0.31}",
"System.Composition.Hosting, {System.Composition.Hosting, 1.0.31}",
"System.Composition.Runtime, {System.Composition.Runtime, 1.0.31}",
"System.Composition.TypedParts, {System.Composition.TypedParts, 1.0.31}",
"System.Console, {System.Console, 4.3.0}",
"System.Diagnostics.Contracts, {System.Diagnostics.Contracts, 4.3.0}",
"System.Diagnostics.Debug, {System.Diagnostics.Debug, 4.3.0}",
"System.Diagnostics.EventLog, {System.Diagnostics.EventLog, 4.5.0}",
"System.Diagnostics.Tools, {System.Diagnostics.Tools, 4.3.0}",
"System.Diagnostics.Tracing, {System.Diagnostics.Tracing, 4.3.0}",
"System.Dynamic.Runtime, {System.Dynamic.Runtime, 4.3.0}",
"System.Formats.Asn1, {System.Formats.Asn1, 6.0.0}",
"System.Globalization, {System.Globalization, 4.3.0}",
"System.Globalization.Calendars, {System.Globalization.Calendars, 4.3.0}",
"System.IO, {System.IO, 4.3.0}",
"System.IO.Compression, {System.IO.Compression, 4.3.0}",
"System.IO.Compression.ZipFile, {System.IO.Compression.ZipFile, 4.3.0}",
"System.IO.FileSystem, {System.IO.FileSystem, 4.3.0}",
"System.IO.FileSystem.Primitives, {System.IO.FileSystem.Primitives, 4.3.0}",
"System.Linq, {System.Linq, 4.3.0}",
"System.Linq.Expressions, {System.Linq.Expressions, 4.3.0}",
"System.Linq.Parallel, {System.Linq.Parallel, 4.3.0}",
"System.Net.Http, {System.Net.Http, 4.3.2}",
"System.Net.Primitives, {System.Net.Primitives, 4.3.0}",
"System.Net.Sockets, {System.Net.Sockets, 4.3.0}",
"System.ObjectModel, {System.ObjectModel, 4.3.0}",
"System.Reflection, {System.Reflection, 4.3.0}",
"System.Reflection.DispatchProxy, {System.Reflection.DispatchProxy, 4.7.1}",
"System.Reflection.Emit, {System.Reflection.Emit, 4.3.0}",
"System.Reflection.Emit.ILGeneration, {System.Reflection.Emit.ILGeneration, 4.3.0}",
"System.Reflection.Extensions, {System.Reflection.Extensions, 4.3.0}",
"System.Reflection.Metadata, {System.Reflection.Metadata, 1.4.2}",
"System.Reflection.Primitives, {System.Reflection.Primitives, 4.3.0}",
"System.Reflection.TypeExtensions, {System.Reflection.TypeExtensions, 4.3.0}",
"System.Resources.ResourceManager, {System.Resources.ResourceManager, 4.3.0}",
"System.Runtime, {System.Runtime, 4.3.0}",
"System.Runtime.Caching, {System.Runtime.Caching, 4.7.0}",
"System.Runtime.CompilerServices.Unsafe, {System.Runtime.CompilerServices.Unsafe, 4.5.1}",
"System.Runtime.Extensions, {System.Runtime.Extensions, 4.3.0}",
"System.Runtime.Handles, {System.Runtime.Handles, 4.3.0}",
"System.Runtime.InteropServices, {System.Runtime.InteropServices, 4.3.0}",
"System.Runtime.InteropServices.RuntimeInformation, {System.Runtime.InteropServices.RuntimeInformation, 4.3.0}",
"System.Runtime.Numerics, {System.Runtime.Numerics, 4.3.0}",
"System.Security.AccessControl, {System.Security.AccessControl, 6.0.0}",
"System.Security.Cryptography.Algorithms, {System.Security.Cryptography.Algorithms, 4.3.0}",
"System.Security.Cryptography.Cng, {System.Security.Cryptography.Cng, 5.0.0}",
"System.Security.Cryptography.Encoding, {System.Security.Cryptography.Encoding, 4.3.0}",
"System.Security.Cryptography.Pkcs, {System.Security.Cryptography.Pkcs, 6.0.1}",
"System.Security.Cryptography.Primitives, {System.Security.Cryptography.Primitives, 4.3.0}",
"System.Security.Cryptography.X509Certificates, {System.Security.Cryptography.X509Certificates, 4.3.0}",
"System.Security.Cryptography.Xml, {System.Security.Cryptography.Xml, 6.0.1}",
"System.Security.Permissions, {System.Security.Permissions, 4.7.0}",
"System.Security.Principal.Windows, {System.Security.Principal.Windows, 5.0.0}",
"System.ServiceModel, {System.ServiceModel.Primitives, 4.10.3}",
"System.ServiceModel.Duplex, {System.ServiceModel.Duplex, 4.10.3}",
"System.ServiceModel.Federation, {System.ServiceModel.Federation, 4.10.3}",
"System.ServiceModel.Http, {System.ServiceModel.Http, 4.10.3}",
"System.ServiceModel.NetTcp, {System.ServiceModel.NetTcp, 4.10.3}",
"System.ServiceModel.Primitives, {System.ServiceModel.Primitives, 4.10.3}",
"System.ServiceModel.Security, {System.ServiceModel.Security, 4.10.3}",
"System.Text.Encoding, {System.Text.Encoding, 4.3.0}",
"System.Text.Encoding.Extensions, {System.Text.Encoding.Extensions, 4.3.0}",
"System.Text.Encodings.Web, {System.Text.Encodings.Web, 4.5.0}",
"System.Text.RegularExpressions, {System.Text.RegularExpressions, 4.3.0}",
"System.Threading, {System.Threading, 4.3.0}",
"System.Threading.Tasks, {System.Threading.Tasks, 4.3.0}",
"System.Threading.Tasks.Parallel, {System.Threading.Tasks.Parallel, 4.3.0}",
"System.Threading.Timer, {System.Threading.Timer, 4.3.0}",
"System.ValueTuple, {System.ValueTuple, 4.3.0}",
"System.Windows.Extensions, {System.Windows.Extensions, 4.7.0}",
"System.Xml.ReaderWriter, {System.Xml.ReaderWriter, 4.3.0}",
"System.Xml.XDocument, {System.Xml.XDocument, 4.3.0}",
"System.Xml.XmlDocument, {System.Xml.XmlDocument, 4.3.0}"
],
"targetFramework": "netcoreapp3.1",
"typeReuseMode": "All"
}
}
@@ -0,0 +1,379 @@
{
"ExtendedData": {
"inputs": [
"https://lms-app-lcu.temenoscloudna.com/Akcelerant.AccountServicing.Service/Configuration.svc?WSDL"
],
"collectionTypes": [
"System.Array",
"System.Collections.Generic.Dictionary`2"
],
"namespaceMappings": [
"*, TemenosConfiguration"
],
"references": [
"AutoMapper, {AutoMapper, 9.0.0}",
"C:\\Projects\\LCU.API.Collections.CollectionsApi\\LCU.API.Collections.CollectionsApi\\bin\\Debug\\netcoreapp2.2\\LCU.API.Collections.CollectionsApiLib.dll",
"dotnet-aspnet-codegenerator-design, {Microsoft.VisualStudio.Web.CodeGeneration.Design, 2.2.3}",
"Microsoft.AspNetCore, {Microsoft.AspNetCore, 2.2.0}",
"Microsoft.AspNetCore.Antiforgery, {Microsoft.AspNetCore.Antiforgery, 2.2.0}",
"Microsoft.AspNetCore.Authentication, {Microsoft.AspNetCore.Authentication, 2.2.0}",
"Microsoft.AspNetCore.Authentication.Abstractions, {Microsoft.AspNetCore.Authentication.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Authentication.Cookies, {Microsoft.AspNetCore.Authentication.Cookies, 2.2.0}",
"Microsoft.AspNetCore.Authentication.Core, {Microsoft.AspNetCore.Authentication.Core, 2.2.0}",
"Microsoft.AspNetCore.Authentication.Facebook, {Microsoft.AspNetCore.Authentication.Facebook, 2.2.0}",
"Microsoft.AspNetCore.Authentication.Google, {Microsoft.AspNetCore.Authentication.Google, 2.2.0}",
"Microsoft.AspNetCore.Authentication.JwtBearer, {Microsoft.AspNetCore.Authentication.JwtBearer, 2.2.0}",
"Microsoft.AspNetCore.Authentication.MicrosoftAccount, {Microsoft.AspNetCore.Authentication.MicrosoftAccount, 2.2.0}",
"Microsoft.AspNetCore.Authentication.OAuth, {Microsoft.AspNetCore.Authentication.OAuth, 2.2.0}",
"Microsoft.AspNetCore.Authentication.OpenIdConnect, {Microsoft.AspNetCore.Authentication.OpenIdConnect, 2.2.0}",
"Microsoft.AspNetCore.Authentication.Twitter, {Microsoft.AspNetCore.Authentication.Twitter, 2.2.0}",
"Microsoft.AspNetCore.Authentication.WsFederation, {Microsoft.AspNetCore.Authentication.WsFederation, 2.2.0}",
"Microsoft.AspNetCore.Authorization, {Microsoft.AspNetCore.Authorization, 2.2.0}",
"Microsoft.AspNetCore.Authorization.Policy, {Microsoft.AspNetCore.Authorization.Policy, 2.2.0}",
"Microsoft.AspNetCore.Connections.Abstractions, {Microsoft.AspNetCore.Connections.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.CookiePolicy, {Microsoft.AspNetCore.CookiePolicy, 2.2.0}",
"Microsoft.AspNetCore.Cors, {Microsoft.AspNetCore.Cors, 2.2.0}",
"Microsoft.AspNetCore.Cryptography.Internal, {Microsoft.AspNetCore.Cryptography.Internal, 2.2.0}",
"Microsoft.AspNetCore.Cryptography.KeyDerivation, {Microsoft.AspNetCore.Cryptography.KeyDerivation, 2.2.0}",
"Microsoft.AspNetCore.DataProtection, {Microsoft.AspNetCore.DataProtection, 2.2.0}",
"Microsoft.AspNetCore.DataProtection.Abstractions, {Microsoft.AspNetCore.DataProtection.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.DataProtection.Extensions, {Microsoft.AspNetCore.DataProtection.Extensions, 2.2.0}",
"Microsoft.AspNetCore.Diagnostics, {Microsoft.AspNetCore.Diagnostics, 2.2.0}",
"Microsoft.AspNetCore.Diagnostics.Abstractions, {Microsoft.AspNetCore.Diagnostics.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore, {Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore, 2.2.0}",
"Microsoft.AspNetCore.Diagnostics.HealthChecks, {Microsoft.AspNetCore.Diagnostics.HealthChecks, 2.2.0}",
"Microsoft.AspNetCore.HostFiltering, {Microsoft.AspNetCore.HostFiltering, 2.2.0}",
"Microsoft.AspNetCore.Hosting, {Microsoft.AspNetCore.Hosting, 2.2.0}",
"Microsoft.AspNetCore.Hosting.Abstractions, {Microsoft.AspNetCore.Hosting.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Hosting.Server.Abstractions, {Microsoft.AspNetCore.Hosting.Server.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Html.Abstractions, {Microsoft.AspNetCore.Html.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Http, {Microsoft.AspNetCore.Http, 2.2.0}",
"Microsoft.AspNetCore.Http.Abstractions, {Microsoft.AspNetCore.Http.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Http.Connections, {Microsoft.AspNetCore.Http.Connections, 1.1.0}",
"Microsoft.AspNetCore.Http.Connections.Common, {Microsoft.AspNetCore.Http.Connections.Common, 1.1.0}",
"Microsoft.AspNetCore.Http.Extensions, {Microsoft.AspNetCore.Http.Extensions, 2.2.0}",
"Microsoft.AspNetCore.Http.Features, {Microsoft.AspNetCore.Http.Features, 2.2.0}",
"Microsoft.AspNetCore.HttpOverrides, {Microsoft.AspNetCore.HttpOverrides, 2.2.0}",
"Microsoft.AspNetCore.HttpsPolicy, {Microsoft.AspNetCore.HttpsPolicy, 2.2.0}",
"Microsoft.AspNetCore.Identity, {Microsoft.AspNetCore.Identity, 2.2.0}",
"Microsoft.AspNetCore.Identity.EntityFrameworkCore, {Microsoft.AspNetCore.Identity.EntityFrameworkCore, 2.2.0}",
"Microsoft.AspNetCore.Identity.UI, {Microsoft.AspNetCore.Identity.UI, 2.2.0}",
"Microsoft.AspNetCore.Identity.UI.Views.V3, {Microsoft.AspNetCore.Identity.UI, 2.2.0}",
"Microsoft.AspNetCore.Identity.UI.Views.V4, {Microsoft.AspNetCore.Identity.UI, 2.2.0}",
"Microsoft.AspNetCore.JsonPatch, {Microsoft.AspNetCore.JsonPatch, 2.2.0}",
"Microsoft.AspNetCore.Localization, {Microsoft.AspNetCore.Localization, 2.2.0}",
"Microsoft.AspNetCore.Localization.Routing, {Microsoft.AspNetCore.Localization.Routing, 2.2.0}",
"Microsoft.AspNetCore.MiddlewareAnalysis, {Microsoft.AspNetCore.MiddlewareAnalysis, 2.2.0}",
"Microsoft.AspNetCore.Mvc, {Microsoft.AspNetCore.Mvc, 2.2.0}",
"Microsoft.AspNetCore.Mvc.Abstractions, {Microsoft.AspNetCore.Mvc.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Mvc.ApiExplorer, {Microsoft.AspNetCore.Mvc.ApiExplorer, 2.2.0}",
"Microsoft.AspNetCore.Mvc.Core, {Microsoft.AspNetCore.Mvc.Core, 2.2.0}",
"Microsoft.AspNetCore.Mvc.Cors, {Microsoft.AspNetCore.Mvc.Cors, 2.2.0}",
"Microsoft.AspNetCore.Mvc.DataAnnotations, {Microsoft.AspNetCore.Mvc.DataAnnotations, 2.2.0}",
"Microsoft.AspNetCore.Mvc.Formatters.Json, {Microsoft.AspNetCore.Mvc.Formatters.Json, 2.2.0}",
"Microsoft.AspNetCore.Mvc.Formatters.Xml, {Microsoft.AspNetCore.Mvc.Formatters.Xml, 2.2.0}",
"Microsoft.AspNetCore.Mvc.Localization, {Microsoft.AspNetCore.Mvc.Localization, 2.2.0}",
"Microsoft.AspNetCore.Mvc.Razor, {Microsoft.AspNetCore.Mvc.Razor, 2.2.0}",
"Microsoft.AspNetCore.Mvc.Razor.Extensions, {Microsoft.AspNetCore.Mvc.Razor.Extensions, 2.2.0}",
"Microsoft.AspNetCore.Mvc.RazorPages, {Microsoft.AspNetCore.Mvc.RazorPages, 2.2.0}",
"Microsoft.AspNetCore.Mvc.TagHelpers, {Microsoft.AspNetCore.Mvc.TagHelpers, 2.2.0}",
"Microsoft.AspNetCore.Mvc.ViewFeatures, {Microsoft.AspNetCore.Mvc.ViewFeatures, 2.2.0}",
"Microsoft.AspNetCore.NodeServices, {Microsoft.AspNetCore.NodeServices, 2.2.0}",
"Microsoft.AspNetCore.Owin, {Microsoft.AspNetCore.Owin, 2.2.0}",
"Microsoft.AspNetCore.Razor, {Microsoft.AspNetCore.Razor, 2.2.0}",
"Microsoft.AspNetCore.Razor.Language, {Microsoft.AspNetCore.Razor.Language, 2.2.0}",
"Microsoft.AspNetCore.Razor.Runtime, {Microsoft.AspNetCore.Razor.Runtime, 2.2.0}",
"Microsoft.AspNetCore.ResponseCaching, {Microsoft.AspNetCore.ResponseCaching, 2.2.0}",
"Microsoft.AspNetCore.ResponseCaching.Abstractions, {Microsoft.AspNetCore.ResponseCaching.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.ResponseCompression, {Microsoft.AspNetCore.ResponseCompression, 2.2.0}",
"Microsoft.AspNetCore.Rewrite, {Microsoft.AspNetCore.Rewrite, 2.2.0}",
"Microsoft.AspNetCore.Routing, {Microsoft.AspNetCore.Routing, 2.2.0}",
"Microsoft.AspNetCore.Routing.Abstractions, {Microsoft.AspNetCore.Routing.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Server.HttpSys, {Microsoft.AspNetCore.Server.HttpSys, 2.2.0}",
"Microsoft.AspNetCore.Server.IIS, {Microsoft.AspNetCore.Server.IIS, 2.2.0}",
"Microsoft.AspNetCore.Server.IISIntegration, {Microsoft.AspNetCore.Server.IISIntegration, 2.2.0}",
"Microsoft.AspNetCore.Server.Kestrel, {Microsoft.AspNetCore.Server.Kestrel, 2.2.0}",
"Microsoft.AspNetCore.Server.Kestrel.Core, {Microsoft.AspNetCore.Server.Kestrel.Core, 2.2.0}",
"Microsoft.AspNetCore.Server.Kestrel.Https, {Microsoft.AspNetCore.Server.Kestrel.Https, 2.2.0}",
"Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions, {Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions, 2.2.0}",
"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets, {Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets, 2.2.0}",
"Microsoft.AspNetCore.Session, {Microsoft.AspNetCore.Session, 2.2.0}",
"Microsoft.AspNetCore.SignalR, {Microsoft.AspNetCore.SignalR, 1.1.0}",
"Microsoft.AspNetCore.SignalR.Common, {Microsoft.AspNetCore.SignalR.Common, 1.1.0}",
"Microsoft.AspNetCore.SignalR.Core, {Microsoft.AspNetCore.SignalR.Core, 1.1.0}",
"Microsoft.AspNetCore.SignalR.Protocols.Json, {Microsoft.AspNetCore.SignalR.Protocols.Json, 1.1.0}",
"Microsoft.AspNetCore.SpaServices, {Microsoft.AspNetCore.SpaServices, 2.2.0}",
"Microsoft.AspNetCore.SpaServices.Extensions, {Microsoft.AspNetCore.SpaServices.Extensions, 2.2.0}",
"Microsoft.AspNetCore.StaticFiles, {Microsoft.AspNetCore.StaticFiles, 2.2.0}",
"Microsoft.AspNetCore.WebSockets, {Microsoft.AspNetCore.WebSockets, 2.2.0}",
"Microsoft.AspNetCore.WebUtilities, {Microsoft.AspNetCore.WebUtilities, 2.2.0}",
"Microsoft.CodeAnalysis, {Microsoft.CodeAnalysis.Common, 2.8.0}",
"Microsoft.CodeAnalysis.CSharp, {Microsoft.CodeAnalysis.CSharp, 2.8.0}",
"Microsoft.CodeAnalysis.CSharp.Workspaces, {Microsoft.CodeAnalysis.CSharp.Workspaces, 2.8.0}",
"Microsoft.CodeAnalysis.Razor, {Microsoft.CodeAnalysis.Razor, 2.2.0}",
"Microsoft.CodeAnalysis.Workspaces, {Microsoft.CodeAnalysis.Workspaces.Common, 2.8.0}",
"Microsoft.CSharp, {Microsoft.NETCore.App, 2.2.0}",
"Microsoft.DotNet.PlatformAbstractions, {Microsoft.DotNet.PlatformAbstractions, 2.1.0}",
"Microsoft.EntityFrameworkCore, {Microsoft.EntityFrameworkCore, 2.2.0}",
"Microsoft.EntityFrameworkCore.Abstractions, {Microsoft.EntityFrameworkCore.Abstractions, 2.2.0}",
"Microsoft.EntityFrameworkCore.Design, {Microsoft.EntityFrameworkCore.Design, 2.2.0}",
"Microsoft.EntityFrameworkCore.InMemory, {Microsoft.EntityFrameworkCore.InMemory, 2.2.0}",
"Microsoft.EntityFrameworkCore.Relational, {Microsoft.EntityFrameworkCore.Relational, 2.2.0}",
"Microsoft.EntityFrameworkCore.SqlServer, {Microsoft.EntityFrameworkCore.SqlServer, 2.2.0}",
"Microsoft.Extensions.Caching.Abstractions, {Microsoft.Extensions.Caching.Abstractions, 2.2.0}",
"Microsoft.Extensions.Caching.Memory, {Microsoft.Extensions.Caching.Memory, 2.2.0}",
"Microsoft.Extensions.Caching.SqlServer, {Microsoft.Extensions.Caching.SqlServer, 2.2.0}",
"Microsoft.Extensions.Configuration, {Microsoft.Extensions.Configuration, 2.2.0}",
"Microsoft.Extensions.Configuration.Abstractions, {Microsoft.Extensions.Configuration.Abstractions, 2.2.0}",
"Microsoft.Extensions.Configuration.Binder, {Microsoft.Extensions.Configuration.Binder, 2.2.0}",
"Microsoft.Extensions.Configuration.CommandLine, {Microsoft.Extensions.Configuration.CommandLine, 2.2.0}",
"Microsoft.Extensions.Configuration.EnvironmentVariables, {Microsoft.Extensions.Configuration.EnvironmentVariables, 2.2.0}",
"Microsoft.Extensions.Configuration.FileExtensions, {Microsoft.Extensions.Configuration.FileExtensions, 2.2.0}",
"Microsoft.Extensions.Configuration.Ini, {Microsoft.Extensions.Configuration.Ini, 2.2.0}",
"Microsoft.Extensions.Configuration.Json, {Microsoft.Extensions.Configuration.Json, 2.2.0}",
"Microsoft.Extensions.Configuration.KeyPerFile, {Microsoft.Extensions.Configuration.KeyPerFile, 2.2.0}",
"Microsoft.Extensions.Configuration.UserSecrets, {Microsoft.Extensions.Configuration.UserSecrets, 2.2.0}",
"Microsoft.Extensions.Configuration.Xml, {Microsoft.Extensions.Configuration.Xml, 2.2.0}",
"Microsoft.Extensions.DependencyInjection, {Microsoft.Extensions.DependencyInjection, 2.2.0}",
"Microsoft.Extensions.DependencyInjection.Abstractions, {Microsoft.Extensions.DependencyInjection.Abstractions, 2.2.0}",
"Microsoft.Extensions.DependencyModel, {Microsoft.Extensions.DependencyModel, 2.1.0}",
"Microsoft.Extensions.DiagnosticAdapter, {Microsoft.Extensions.DiagnosticAdapter, 2.2.0}",
"Microsoft.Extensions.Diagnostics.HealthChecks, {Microsoft.Extensions.Diagnostics.HealthChecks, 2.2.0}",
"Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions, {Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions, 2.2.0}",
"Microsoft.Extensions.FileProviders.Abstractions, {Microsoft.Extensions.FileProviders.Abstractions, 2.2.0}",
"Microsoft.Extensions.FileProviders.Composite, {Microsoft.Extensions.FileProviders.Composite, 2.2.0}",
"Microsoft.Extensions.FileProviders.Embedded, {Microsoft.Extensions.FileProviders.Embedded, 2.2.0}",
"Microsoft.Extensions.FileProviders.Physical, {Microsoft.Extensions.FileProviders.Physical, 2.2.0}",
"Microsoft.Extensions.FileSystemGlobbing, {Microsoft.Extensions.FileSystemGlobbing, 2.2.0}",
"Microsoft.Extensions.Hosting, {Microsoft.Extensions.Hosting, 2.2.0}",
"Microsoft.Extensions.Hosting.Abstractions, {Microsoft.Extensions.Hosting.Abstractions, 2.2.0}",
"Microsoft.Extensions.Http, {Microsoft.Extensions.Http, 2.2.0}",
"Microsoft.Extensions.Identity.Core, {Microsoft.Extensions.Identity.Core, 2.2.0}",
"Microsoft.Extensions.Identity.Stores, {Microsoft.Extensions.Identity.Stores, 2.2.0}",
"Microsoft.Extensions.Localization, {Microsoft.Extensions.Localization, 2.2.0}",
"Microsoft.Extensions.Localization.Abstractions, {Microsoft.Extensions.Localization.Abstractions, 2.2.0}",
"Microsoft.Extensions.Logging, {Microsoft.Extensions.Logging, 2.2.0}",
"Microsoft.Extensions.Logging.Abstractions, {Microsoft.Extensions.Logging.Abstractions, 2.2.0}",
"Microsoft.Extensions.Logging.Configuration, {Microsoft.Extensions.Logging.Configuration, 2.2.0}",
"Microsoft.Extensions.Logging.Console, {Microsoft.Extensions.Logging.Console, 2.2.0}",
"Microsoft.Extensions.Logging.Debug, {Microsoft.Extensions.Logging.Debug, 2.2.0}",
"Microsoft.Extensions.Logging.EventLog, {Microsoft.Extensions.Logging.EventLog, 2.2.0}",
"Microsoft.Extensions.Logging.EventSource, {Microsoft.Extensions.Logging.EventSource, 2.2.0}",
"Microsoft.Extensions.Logging.TraceSource, {Microsoft.Extensions.Logging.TraceSource, 2.2.0}",
"Microsoft.Extensions.ObjectPool, {Microsoft.Extensions.ObjectPool, 2.2.0}",
"Microsoft.Extensions.Options, {Microsoft.Extensions.Options, 2.2.0}",
"Microsoft.Extensions.Options.ConfigurationExtensions, {Microsoft.Extensions.Options.ConfigurationExtensions, 2.2.0}",
"Microsoft.Extensions.Options.DataAnnotations, {Microsoft.Extensions.Options.DataAnnotations, 2.2.0}",
"Microsoft.Extensions.Primitives, {Microsoft.Extensions.Primitives, 2.2.0}",
"Microsoft.Extensions.WebEncoders, {Microsoft.Extensions.WebEncoders, 2.2.0}",
"Microsoft.IdentityModel.JsonWebTokens, {Microsoft.IdentityModel.JsonWebTokens, 5.3.0}",
"Microsoft.IdentityModel.Logging, {Microsoft.IdentityModel.Logging, 5.3.0}",
"Microsoft.IdentityModel.Protocols, {Microsoft.IdentityModel.Protocols, 5.3.0}",
"Microsoft.IdentityModel.Protocols.OpenIdConnect, {Microsoft.IdentityModel.Protocols.OpenIdConnect, 5.3.0}",
"Microsoft.IdentityModel.Protocols.WsFederation, {Microsoft.IdentityModel.Protocols.WsFederation, 5.3.0}",
"Microsoft.IdentityModel.Tokens, {Microsoft.IdentityModel.Tokens, 5.3.0}",
"Microsoft.IdentityModel.Tokens.Saml, {Microsoft.IdentityModel.Tokens.Saml, 5.3.0}",
"Microsoft.IdentityModel.Xml, {Microsoft.IdentityModel.Xml, 5.3.0}",
"Microsoft.Net.Http.Headers, {Microsoft.Net.Http.Headers, 2.2.0}",
"Microsoft.VisualBasic, {Microsoft.NETCore.App, 2.2.0}",
"Microsoft.VisualStudio.Web.CodeGeneration, {Microsoft.VisualStudio.Web.CodeGeneration, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.Contracts, {Microsoft.VisualStudio.Web.CodeGeneration.Contracts, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.Core, {Microsoft.VisualStudio.Web.CodeGeneration.Core, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore, {Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.Templating, {Microsoft.VisualStudio.Web.CodeGeneration.Templating, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGeneration.Utils, {Microsoft.VisualStudio.Web.CodeGeneration.Utils, 2.2.3}",
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc, {Microsoft.VisualStudio.Web.CodeGenerators.Mvc, 2.2.3}",
"Microsoft.Win32.Primitives, {Microsoft.NETCore.App, 2.2.0}",
"Microsoft.Win32.Registry, {Microsoft.Win32.Registry, 4.5.0}",
"mscorlib, {Microsoft.NETCore.App, 2.2.0}",
"netstandard, {Microsoft.NETCore.App, 2.2.0}",
"Newtonsoft.Json, {Newtonsoft.Json, 11.0.2}",
"Newtonsoft.Json.Bson, {Newtonsoft.Json.Bson, 1.0.1}",
"NuGet.Frameworks, {NuGet.Frameworks, 4.7.0}",
"Remotion.Linq, {Remotion.Linq, 2.2.0}",
"Serilog, {Serilog, 2.9.0}",
"Serilog.AspNetCore, {Serilog.AspNetCore, 3.2.0}",
"Serilog.Extensions.Hosting, {Serilog.Extensions.Hosting, 3.0.0}",
"Serilog.Extensions.Logging, {Serilog.Extensions.Logging, 3.0.1}",
"Serilog.Formatting.Compact, {Serilog.Formatting.Compact, 1.0.0}",
"Serilog.Settings.Configuration, {Serilog.Settings.Configuration, 3.1.0}",
"Serilog.Sinks.Async, {Serilog.Sinks.Async, 1.4.0}",
"Serilog.Sinks.Console, {Serilog.Sinks.Console, 3.1.1}",
"Serilog.Sinks.Debug, {Serilog.Sinks.Debug, 1.0.1}",
"Serilog.Sinks.File, {Serilog.Sinks.File, 4.0.0}",
"Serilog.Sinks.PeriodicBatching, {Serilog.Sinks.PeriodicBatching, 2.1.1}",
"Serilog.Sinks.Seq, {Serilog.Sinks.Seq, 4.0.0}",
"Swashbuckle.AspNetCore, {Swashbuckle.AspNetCore, 4.0.1}",
"Swashbuckle.AspNetCore.Swagger, {Swashbuckle.AspNetCore.Swagger, 4.0.1}",
"Swashbuckle.AspNetCore.SwaggerGen, {Swashbuckle.AspNetCore.SwaggerGen, 4.0.1}",
"Swashbuckle.AspNetCore.SwaggerUI, {Swashbuckle.AspNetCore.SwaggerUI, 4.0.1}",
"System, {Microsoft.NETCore.App, 2.2.0}",
"System.AppContext, {Microsoft.NETCore.App, 2.2.0}",
"System.Buffers, {Microsoft.NETCore.App, 2.2.0}",
"System.Collections, {Microsoft.NETCore.App, 2.2.0}",
"System.Collections.Concurrent, {Microsoft.NETCore.App, 2.2.0}",
"System.Collections.Immutable, {Microsoft.NETCore.App, 2.2.0}",
"System.Collections.NonGeneric, {Microsoft.NETCore.App, 2.2.0}",
"System.Collections.Specialized, {Microsoft.NETCore.App, 2.2.0}",
"System.ComponentModel, {Microsoft.NETCore.App, 2.2.0}",
"System.ComponentModel.Annotations, {Microsoft.NETCore.App, 2.2.0}",
"System.ComponentModel.DataAnnotations, {Microsoft.NETCore.App, 2.2.0}",
"System.ComponentModel.EventBasedAsync, {Microsoft.NETCore.App, 2.2.0}",
"System.ComponentModel.Primitives, {Microsoft.NETCore.App, 2.2.0}",
"System.ComponentModel.TypeConverter, {Microsoft.NETCore.App, 2.2.0}",
"System.Composition.AttributedModel, {System.Composition.AttributedModel, 1.0.31}",
"System.Composition.Convention, {System.Composition.Convention, 1.0.31}",
"System.Composition.Hosting, {System.Composition.Hosting, 1.0.31}",
"System.Composition.Runtime, {System.Composition.Runtime, 1.0.31}",
"System.Composition.TypedParts, {System.Composition.TypedParts, 1.0.31}",
"System.Configuration, {Microsoft.NETCore.App, 2.2.0}",
"System.Console, {Microsoft.NETCore.App, 2.2.0}",
"System.Core, {Microsoft.NETCore.App, 2.2.0}",
"System.Data, {Microsoft.NETCore.App, 2.2.0}",
"System.Data.Common, {Microsoft.NETCore.App, 2.2.0}",
"System.Data.SqlClient, {System.Data.SqlClient, 4.6.0}",
"System.Diagnostics.Contracts, {Microsoft.NETCore.App, 2.2.0}",
"System.Diagnostics.Debug, {Microsoft.NETCore.App, 2.2.0}",
"System.Diagnostics.DiagnosticSource, {Microsoft.NETCore.App, 2.2.0}",
"System.Diagnostics.EventLog, {System.Diagnostics.EventLog, 4.5.0}",
"System.Diagnostics.FileVersionInfo, {Microsoft.NETCore.App, 2.2.0}",
"System.Diagnostics.Process, {Microsoft.NETCore.App, 2.2.0}",
"System.Diagnostics.StackTrace, {Microsoft.NETCore.App, 2.2.0}",
"System.Diagnostics.TextWriterTraceListener, {Microsoft.NETCore.App, 2.2.0}",
"System.Diagnostics.Tools, {Microsoft.NETCore.App, 2.2.0}",
"System.Diagnostics.TraceSource, {Microsoft.NETCore.App, 2.2.0}",
"System.Diagnostics.Tracing, {Microsoft.NETCore.App, 2.2.0}",
"System.Drawing, {Microsoft.NETCore.App, 2.2.0}",
"System.Drawing.Primitives, {Microsoft.NETCore.App, 2.2.0}",
"System.Dynamic.Runtime, {Microsoft.NETCore.App, 2.2.0}",
"System.Globalization, {Microsoft.NETCore.App, 2.2.0}",
"System.Globalization.Calendars, {Microsoft.NETCore.App, 2.2.0}",
"System.Globalization.Extensions, {Microsoft.NETCore.App, 2.2.0}",
"System.IdentityModel.Tokens.Jwt, {System.IdentityModel.Tokens.Jwt, 5.3.0}",
"System.Interactive.Async, {System.Interactive.Async, 3.2.0}",
"System.IO, {Microsoft.NETCore.App, 2.2.0}",
"System.IO.Compression, {Microsoft.NETCore.App, 2.2.0}",
"System.IO.Compression.Brotli, {Microsoft.NETCore.App, 2.2.0}",
"System.IO.Compression.FileSystem, {Microsoft.NETCore.App, 2.2.0}",
"System.IO.Compression.ZipFile, {Microsoft.NETCore.App, 2.2.0}",
"System.IO.FileSystem, {Microsoft.NETCore.App, 2.2.0}",
"System.IO.FileSystem.DriveInfo, {Microsoft.NETCore.App, 2.2.0}",
"System.IO.FileSystem.Primitives, {Microsoft.NETCore.App, 2.2.0}",
"System.IO.FileSystem.Watcher, {Microsoft.NETCore.App, 2.2.0}",
"System.IO.IsolatedStorage, {Microsoft.NETCore.App, 2.2.0}",
"System.IO.MemoryMappedFiles, {Microsoft.NETCore.App, 2.2.0}",
"System.IO.Pipelines, {System.IO.Pipelines, 4.5.2}",
"System.IO.Pipes, {Microsoft.NETCore.App, 2.2.0}",
"System.IO.UnmanagedMemoryStream, {Microsoft.NETCore.App, 2.2.0}",
"System.Linq, {Microsoft.NETCore.App, 2.2.0}",
"System.Linq.Expressions, {Microsoft.NETCore.App, 2.2.0}",
"System.Linq.Parallel, {Microsoft.NETCore.App, 2.2.0}",
"System.Linq.Queryable, {Microsoft.NETCore.App, 2.2.0}",
"System.Memory, {Microsoft.NETCore.App, 2.2.0}",
"System.Net, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.Http, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.Http.Formatting, {Microsoft.AspNet.WebApi.Client, 5.2.6}",
"System.Net.HttpListener, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.Mail, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.NameResolution, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.NetworkInformation, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.Ping, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.Primitives, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.Requests, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.Security, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.ServicePoint, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.Sockets, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.WebClient, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.WebHeaderCollection, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.WebProxy, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.WebSockets, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.WebSockets.Client, {Microsoft.NETCore.App, 2.2.0}",
"System.Net.WebSockets.WebSocketProtocol, {System.Net.WebSockets.WebSocketProtocol, 4.5.1}",
"System.Numerics, {Microsoft.NETCore.App, 2.2.0}",
"System.Numerics.Vectors, {Microsoft.NETCore.App, 2.2.0}",
"System.ObjectModel, {Microsoft.NETCore.App, 2.2.0}",
"System.Reflection, {Microsoft.NETCore.App, 2.2.0}",
"System.Reflection.DispatchProxy, {Microsoft.NETCore.App, 2.2.0}",
"System.Reflection.Emit, {Microsoft.NETCore.App, 2.2.0}",
"System.Reflection.Emit.ILGeneration, {Microsoft.NETCore.App, 2.2.0}",
"System.Reflection.Emit.Lightweight, {Microsoft.NETCore.App, 2.2.0}",
"System.Reflection.Extensions, {Microsoft.NETCore.App, 2.2.0}",
"System.Reflection.Metadata, {Microsoft.NETCore.App, 2.2.0}",
"System.Reflection.Primitives, {Microsoft.NETCore.App, 2.2.0}",
"System.Reflection.TypeExtensions, {Microsoft.NETCore.App, 2.2.0}",
"System.Resources.Reader, {Microsoft.NETCore.App, 2.2.0}",
"System.Resources.ResourceManager, {Microsoft.NETCore.App, 2.2.0}",
"System.Resources.Writer, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.Caching, {System.Runtime.Caching, 4.7.0}",
"System.Runtime.CompilerServices.Unsafe, {System.Runtime.CompilerServices.Unsafe, 4.5.1}",
"System.Runtime.CompilerServices.VisualC, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.Extensions, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.Handles, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.InteropServices, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.InteropServices.RuntimeInformation, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.InteropServices.WindowsRuntime, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.Loader, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.Numerics, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.Serialization, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.Serialization.Formatters, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.Serialization.Json, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.Serialization.Primitives, {Microsoft.NETCore.App, 2.2.0}",
"System.Runtime.Serialization.Xml, {Microsoft.NETCore.App, 2.2.0}",
"System.Security, {Microsoft.NETCore.App, 2.2.0}",
"System.Security.AccessControl, {System.Security.AccessControl, 4.7.0}",
"System.Security.Claims, {Microsoft.NETCore.App, 2.2.0}",
"System.Security.Cryptography.Algorithms, {Microsoft.NETCore.App, 2.2.0}",
"System.Security.Cryptography.Cng, {System.Security.Cryptography.Cng, 4.5.0}",
"System.Security.Cryptography.Csp, {Microsoft.NETCore.App, 2.2.0}",
"System.Security.Cryptography.Encoding, {Microsoft.NETCore.App, 2.2.0}",
"System.Security.Cryptography.Primitives, {Microsoft.NETCore.App, 2.2.0}",
"System.Security.Cryptography.X509Certificates, {Microsoft.NETCore.App, 2.2.0}",
"System.Security.Cryptography.Xml, {System.Security.Cryptography.Xml, 4.5.0}",
"System.Security.Permissions, {System.Security.Permissions, 4.7.0}",
"System.Security.Principal, {Microsoft.NETCore.App, 2.2.0}",
"System.Security.Principal.Windows, {System.Security.Principal.Windows, 4.7.0}",
"System.Security.SecureString, {Microsoft.NETCore.App, 2.2.0}",
"System.ServiceModel, {System.ServiceModel.Primitives, 4.4.4}",
"System.ServiceModel.Duplex, {System.ServiceModel.Duplex, 4.4.4}",
"System.ServiceModel.Http, {System.ServiceModel.Http, 4.4.4}",
"System.ServiceModel.NetTcp, {System.ServiceModel.NetTcp, 4.4.4}",
"System.ServiceModel.Primitives, {System.ServiceModel.Primitives, 4.4.4}",
"System.ServiceModel.Security, {System.ServiceModel.Security, 4.4.4}",
"System.ServiceModel.Web, {Microsoft.NETCore.App, 2.2.0}",
"System.ServiceProcess, {Microsoft.NETCore.App, 2.2.0}",
"System.Text.Encoding, {Microsoft.NETCore.App, 2.2.0}",
"System.Text.Encoding.Extensions, {Microsoft.NETCore.App, 2.2.0}",
"System.Text.Encodings.Web, {System.Text.Encodings.Web, 4.5.0}",
"System.Text.RegularExpressions, {Microsoft.NETCore.App, 2.2.0}",
"System.Threading, {Microsoft.NETCore.App, 2.2.0}",
"System.Threading.Channels, {System.Threading.Channels, 4.5.0}",
"System.Threading.Overlapped, {Microsoft.NETCore.App, 2.2.0}",
"System.Threading.Tasks, {Microsoft.NETCore.App, 2.2.0}",
"System.Threading.Tasks.Dataflow, {Microsoft.NETCore.App, 2.2.0}",
"System.Threading.Tasks.Extensions, {Microsoft.NETCore.App, 2.2.0}",
"System.Threading.Tasks.Parallel, {Microsoft.NETCore.App, 2.2.0}",
"System.Threading.Thread, {Microsoft.NETCore.App, 2.2.0}",
"System.Threading.ThreadPool, {Microsoft.NETCore.App, 2.2.0}",
"System.Threading.Timer, {Microsoft.NETCore.App, 2.2.0}",
"System.Transactions, {Microsoft.NETCore.App, 2.2.0}",
"System.Transactions.Local, {Microsoft.NETCore.App, 2.2.0}",
"System.ValueTuple, {Microsoft.NETCore.App, 2.2.0}",
"System.Web, {Microsoft.NETCore.App, 2.2.0}",
"System.Web.HttpUtility, {Microsoft.NETCore.App, 2.2.0}",
"System.Windows, {Microsoft.NETCore.App, 2.2.0}",
"System.Xml, {Microsoft.NETCore.App, 2.2.0}",
"System.Xml.Linq, {Microsoft.NETCore.App, 2.2.0}",
"System.Xml.ReaderWriter, {Microsoft.NETCore.App, 2.2.0}",
"System.Xml.Serialization, {Microsoft.NETCore.App, 2.2.0}",
"System.Xml.XDocument, {Microsoft.NETCore.App, 2.2.0}",
"System.Xml.XmlDocument, {Microsoft.NETCore.App, 2.2.0}",
"System.Xml.XmlSerializer, {Microsoft.NETCore.App, 2.2.0}",
"System.Xml.XPath, {Microsoft.NETCore.App, 2.2.0}",
"System.Xml.XPath.XDocument, {Microsoft.NETCore.App, 2.2.0}",
"WindowsBase, {Microsoft.NETCore.App, 2.2.0}"
],
"targetFramework": "netcoreapp2.2",
"typeReuseMode": "All"
}
}
@@ -0,0 +1,24 @@
{
"ProviderId": "Microsoft.VisualStudio.ConnectedService.Wcf",
"Version": "15.0.20628.921",
"ExtendedData": {
"Uri": "https://lms-app-lcu.temenoscloudna.com/Akcelerant.Core.Service/Security.svc?WSDL",
"Namespace": "TemenosSecurity",
"SelectedAccessLevelForGeneratedClass": "Public",
"GenerateMessageContract": false,
"ReuseTypesinReferencedAssemblies": true,
"ReuseTypesinAllReferencedAssemblies": true,
"CollectionTypeReference": {
"Item1": "System.Array",
"Item2": "System.Runtime.dll"
},
"DictionaryCollectionTypeReference": {
"Item1": "System.Collections.Generic.Dictionary`2",
"Item2": "System.Collections.dll"
},
"CheckedReferencedAssemblies": [],
"InstanceId": null,
"Name": "TemenosSecurity",
"Metadata": {}
}
}
@@ -0,0 +1,98 @@
using LCU.API.Collections.CollectionsApi.Exceptions;
using LCU.API.Collections.CollectionsApi.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
namespace LCU.API.Collections.CollectionsApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class AccountController : ControllerBase
{
private readonly IAccountService _accountService;
public AccountController(IAccountService accountService)
{
_accountService = accountService;
}
// GET: api/account/5
[HttpGet("{accountId}", Name = "GetAccountByAccountId")]
[ProducesResponseType(typeof(CollectionsApiLib.Models.TemenosAccount), 200)]
[ProducesResponseType(typeof(string), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> GetAccountByAccountId([Required] int accountId)
{
try
{
var result = await _accountService.FindByIdAsync(accountId);
return Ok(result);
}
catch (NotFoundException nfe)
{
return NotFound(nfe.Message);
}
catch (Exception ex)
{
Log.Error(ex, "Error Executing GetTemenosAccountById");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
// GET: api/account/ByAccountNo/54444-143
[HttpGet("ByAccountNo/{accountNo}", Name = "GetAccountByAccountNo")]
[ProducesResponseType(typeof(CollectionsApiLib.Models.TemenosAccount), 200)]
[ProducesResponseType(typeof(string), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> GetAccountByAccountNo(string accountNo)
{
try
{
var account = Int64.TryParse(accountNo, out var parsedaccount);
if (!account || parsedaccount <= 0)
{
return BadRequest("Invalid Account ID");
}
var result = await _accountService.ListByAccountNoAsync(accountNo);
return Ok(result);
}
catch (NotFoundException nfe)
{
return NotFound(nfe.Message);
}
catch (Exception ex)
{
Log.Error(ex, "Error Executing GetTemenosAccountByAccountNo ");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
// GET: api/History/5
[HttpGet("{accountId}/history", Name = "GetHistoryByAccountId")]
[ProducesResponseType(typeof(IReadOnlyCollection<CollectionsApiLib.Models.TemenosHistory>), 200)]
[ProducesResponseType(typeof(string), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> GetHistoryByAccountId([Required] int accountId)
{
try
{
var result = await _accountService.GetHistoryByAccountIdAsync(accountId);
return Ok(result);
}
catch (NotFoundException nfe)
{
return NotFound(nfe.Message);
}
catch (Exception ex)
{
Log.Error(ex, "Error Executing GetTemenosAccountById");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}
@@ -0,0 +1,104 @@
using LCU.API.Collections.CollectionsApi.Exceptions;
using LCU.API.Collections.CollectionsApi.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
namespace LCU.API.Collections.CollectionsApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class CaseController : ControllerBase
{
private readonly ICaseService _caseService;
public CaseController(ICaseService caseService)
{
_caseService = caseService;
}
// GET: api/case/123
[HttpGet("{caseId}", Name = "GetCaseByCaseId")]
[ProducesResponseType(typeof(CollectionsApiLib.Models.TemenosCase), 200)]
[ProducesResponseType(typeof(string), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> GetCaseByCaseId([Required] int caseId)
{
try
{
if (caseId <= 0)
{
return BadRequest("Invalid Case ID");
}
var result = await _caseService.GetCaseByIdAsync(caseId);
return Ok(result);
}
catch (NotFoundException nfe)
{
return NotFound(nfe.Message);
}
catch (Exception ex)
{
Log.Error(ex, "Error Executing GetTemenosCaseByCaseId ");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
// GET: api/case/CaseByNo/54444-143
[HttpGet("CaseByNo/{caseNo}", Name = "GetCaseByCaseNo")]
[ProducesResponseType(typeof(CollectionsApiLib.Models.TemenosCase), 200)]
[ProducesResponseType(typeof(string), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> GetCaseByCaseNo([Required] string caseNo)
{
try
{
if (string.IsNullOrWhiteSpace(caseNo))
{
return BadRequest("Invalid Case No");
}
var result = await _caseService.GetCaseByCaseNoAsync(caseNo);
return Ok(result);
}
catch (NotFoundException nfe)
{
return NotFound(nfe.Message);
}
catch (Exception ex)
{
Log.Error(ex, "Error Executing GetTemenosCaseByCaseId ");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
// GET: api/case/history/5444
[HttpGet("{caseId}/history", Name = "GetHistoryByCaseId")]
[ProducesResponseType(typeof(IReadOnlyCollection<CollectionsApiLib.Models.TemenosHistory>), 200)]
[ProducesResponseType(typeof(string), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> GetHistoryByCaseId([Required] int caseId)
{
try
{
var result = await _caseService.GetHistoryByAccountIdAsync(caseId);
return Ok(result);
}
catch (NotFoundException nfe)
{
return NotFound(nfe.Message);
}
catch (Exception ex)
{
Log.Error(ex, "Error Executing GetTemenosCaseByCaseId ");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}
@@ -0,0 +1,40 @@
using LCU.API.Collections.CollectionsApi.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using System;
using System.Threading.Tasks;
namespace LCU.API.Collections.CollectionsApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ConfigurationController : ControllerBase
{
private readonly IConfigurationService _configurationService;
public ConfigurationController(IConfigurationService configurationService)
{
_configurationService = configurationService;
}
// GET: api/configuration
[HttpGet("", Name = "GetConfiguration")]
[ProducesResponseType(typeof(CollectionsApiLib.Models.TemenosConfiguration), 200)]
[ProducesResponseType(typeof(string), 400)]
[ProducesResponseType(500)]
public async Task<IActionResult> Get()
{
try
{
var result = await _configurationService.GetAsync();
return Ok(result);
}
catch (Exception ex)
{
Log.Error(ex, "Error Executing Get Temenos Configuration.");
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}
@@ -0,0 +1,35 @@
using LCU.API.Collections.CollectionsApi.Models;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using System;
namespace LCU.API.Collections.CollectionsApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class StatusController : ControllerBase
{
private readonly IEnvironmentView _environmentView;
public StatusController(IEnvironmentView environmentView)
{
_environmentView = environmentView;
}
[HttpGet()]
[ProducesResponseType(200)]
[ProducesResponseType(500)]
public IActionResult Get()
{
try
{
return Ok(_environmentView);
}
catch (Exception e)
{
Log.Fatal("Failure return status, message: {0}", e.StackTrace);
return StatusCode((int)System.Net.HttpStatusCode.InternalServerError);
}
}
}
}
@@ -0,0 +1,13 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace LCU.API.Collections.CollectionsApi.Dao
{
public interface ITemenosAccountDao
{
Task<CollectionsApiLib.Models.TemenosAccount> FindByIdAsync(int accountId);
Task<IReadOnlyCollection<CollectionsApiLib.Models.TemenosAccount>> ListByAccountNoAsync(string accountNo, string internalAccountIdentifier);
Task<IReadOnlyCollection<CollectionsApiLib.Models.TemenosHistory>> FindHistoryAsync(int accountId);
Task<IReadOnlyCollection<CollectionsApiLib.Models.TemenosHistory>> FindCommentsAsync(int accountId);
}
}
@@ -0,0 +1,11 @@
using LCU.API.Collections.CollectionsApi.Models.TemenosApiWrapper;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace LCU.API.Collections.TemenosApiWrapper.DataAccess
{
public interface ITemenosApiWrapperDao
{
Task<List<AccountSearchResponse>> AccountSearch(AccountSearchRequest request);
}
}
@@ -0,0 +1,12 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace LCU.API.Collections.CollectionsApi.Dao
{
public interface ITemenosCaseDao
{
Task<CollectionsApiLib.Models.TemenosCase> FindByIdAsync(int caseId);
Task<CollectionsApiLib.Models.TemenosCase> FindByCaseNoAsync(string caseNo);
Task<IReadOnlyCollection<CollectionsApiLib.Models.TemenosHistory>> FindCommentsAsync(int caseId);
}
}
@@ -0,0 +1,9 @@
using System.Threading.Tasks;
namespace LCU.API.Collections.CollectionsApi.Dao
{
public interface ITemenosConfigurationDao
{
Task<CollectionsApiLib.Models.TemenosConfiguration> GetAsync();
}
}
@@ -0,0 +1,10 @@
namespace LCU.API.Collections.CollectionsApi.Dao
{
public interface ITemenosSecurityConfig
{
string GetUrl();
string GetUsername();
string GetPassword();
}
}
@@ -0,0 +1,10 @@
using System.Threading.Tasks;
using TemenosSecurity;
namespace LCU.API.Collections.CollectionsApi.Dao
{
public interface ITemenosSessionDao
{
Task<GetSessionResponse> GetSession();
}
}
@@ -0,0 +1,294 @@
using System;
using LCU.API.Collections.CollectionsApi.Exceptions;
using Serilog;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
using LCU.API.Collections.CollectionsApi.Mappers;
using LCU.API.Collections.CollectionsApi.Services;
using LCU.API.Collections.CollectionsApiLib.Models;
using TemenosAccount;
namespace LCU.API.Collections.CollectionsApi.Dao
{
public class TemenosAccountDao : ITemenosAccountDao
{
private readonly IAccount _accountService;
private readonly ITemenosSessionDao _sessionDao;
private readonly ILookupConversionService _conversionService;
private readonly AccountMapper _mapper;
private const string FieldDateFirstDelinquent = "Date of First Delinquency";
public TemenosAccountDao(IAccount accountService, ITemenosSessionDao sessionDao,
ILookupConversionService conversionService)
{
_accountService = accountService;
_sessionDao = sessionDao;
_conversionService = conversionService;
_mapper = new AccountMapper();
}
public async Task<CollectionsApiLib.Models.TemenosAccount> FindByIdAsync(int accountId)
{
var sessionResult = await _sessionDao.GetSession();
GetAccountRequest request = new GetAccountRequest()
{
AccountId = accountId,
UserToken = sessionResult.UserToken,
LoadOptions = GetLoadOptions()
};
var response = await _accountService.GetAccountAsync(request);
if (response != null && response.Result)
{
if (response.Account.AccountID == 0)
{
throw new NotFoundException($"Temenos account {accountId} was not found.");
}
return ConvertTemenosAccount(response.Account);
}
Log.Error($"Error finding account from Temenos by AccountId: {accountId}");
throw new ServerErrorException();
}
public async Task<IReadOnlyCollection<TemenosHistory>> FindHistoryAsync(int accountId)
{
var sessionResult = await _sessionDao.GetSession();
var request = new GetWorkflowsRequest()
{
AccountId = accountId,
UserToken = sessionResult.UserToken
};
var response = await _accountService.GetWorkflowsAsync(request);
if (response != null && response.Result)
{
return ConvertTemenosHistories(response.Workflows);
}
Log.Error($"Error loading history from Temenos by AccountId: {accountId}");
throw new ServerErrorException();
}
private IReadOnlyCollection<TemenosHistory> ConvertTemenosHistories(Workflow[] responseWorkflows)
{
var history = new List<TemenosHistory>();
foreach (var workflow in responseWorkflows)
{
if (workflow.Status == "Completed" && workflow.WorkflowSteps != null)
{
foreach (var workflowStep in workflow.WorkflowSteps)
{
if (workflowStep.Status == "Completed")
{
history.Add(new TemenosHistory()
{
Type = DetermineHistoryType(workflowStep.Name, HistoryType.Workflow),
Created = workflow.CreatedDate,
Name = workflow.Name,
Message = workflowStep.Name,
UserId = workflow.CreatedByID
});
}
}
}
}
return history;
}
private HistoryType DetermineHistoryType(string searchThis, HistoryType defaultType)
{
return searchThis.Contains("Sent letter") ? HistoryType.Letter : defaultType;
}
public async Task<IReadOnlyCollection<TemenosHistory>> FindCommentsAsync(int accountId)
{
var sessionResult = await _sessionDao.GetSession();
var request = new GetCommentsRequest()
{
AccountId = accountId,
UserToken = sessionResult.UserToken
};
var response = await _accountService.GetCommentsAsync(request);
if (response != null && response.Result)
{
return ConvertTemenosComments(response.Comment);
}
Log.Error($"Error Finding Comments from Temenos by AccountId {accountId}");
throw new ServerErrorException();
}
private IReadOnlyCollection<TemenosHistory> ConvertTemenosComments(Comment[] responseComments)
{
var history = new List<TemenosHistory>();
foreach (var comment in responseComments)
{
if (!string.IsNullOrWhiteSpace(comment.CommentText))
{
history.Add(new TemenosHistory()
{
Type = DetermineHistoryType(comment.CommentText, HistoryType.Comment),
Created = comment.CreatedDate,
Name = "Comment",
Message = comment.CommentText,
UserId = comment.CreatedById
});
}
}
return history;
}
public CollectionsApiLib.Models.TemenosAccount ConvertTemenosAccount(Account1 responseAccount)
{
var temenosAccount = _mapper.MapToCollectionsAccount(responseAccount);
temenosAccount.AccountType =
_conversionService.ConvertRepoAccountType(responseAccount.AccountTypeID);
foreach (var temenosAccountCase in temenosAccount.Cases)
{
try
{
temenosAccountCase.RepoStatus =
_conversionService.ConvertRepoStatus(temenosAccountCase.CaseStageId);
}
catch (IndexOutOfRangeException ex)
{
Log.Error(ex, "Could not find case stage, marking Ineligible");
// Per bill and kyle. All stages are in temenos and configured. If we don't recognize it, the
// account is ineligible.
temenosAccountCase.RepoStatus = RepoStatus.INELIGIBLE;
}
temenosAccountCase.RepoType = _conversionService.ConvertRepoType(temenosAccountCase.RepoTypeId);
}
if (responseAccount.CustomFields != null && responseAccount.CustomFields.Any())
{
var map = new Dictionary<string, string>();
foreach (var customField in responseAccount.CustomFields)
{
if (map.ContainsKey(customField._Label))
{
continue;
}
if (string.Equals(customField._Label, FieldDateFirstDelinquent))
{
temenosAccount.DateFirstDelinquent = customField._Value;
continue;
}
map.Add(customField._Label, customField._Value);
}
temenosAccount.CustomFieldMap = map;
}
return temenosAccount;
}
// TODO there are two copies of this because there are technically two different case types TemenosAccount.Case1 and TemenosCase.Case1
// If you can resolve these types together, you can merge the methods in AccountMapper and CaseMapper.
public async Task<IReadOnlyCollection<CollectionsApiLib.Models.TemenosAccount>> ListByAccountNoAsync(string accountNo, string internalAccountIdentifier)
{
var sessionResult = await _sessionDao.GetSession();
if (sessionResult.Result)
{
var idRequest = new GetAccountIdRequest()
{
AccountIdentifier = accountNo,
InternalAccountIdentifier = new Guid(internalAccountIdentifier),
UserToken = sessionResult.UserToken,
};
var idResponse = await _accountService.GetAccountIdAsync(idRequest);
if (idResponse.Result)
{
if (idResponse.AccountId == 0)
{
throw new NotFoundException($"Temenos account {accountNo} was not found.");
}
var request = new GetAccountRequest()
{
AccountId = idResponse.AccountId,
UserToken = sessionResult.UserToken,
LoadOptions = GetLoadOptions()
};
var response = await _accountService.GetAccountAsync(request);
if (response != null && response.Result)
{
CollectionsApiLib.Models.TemenosAccount convertedTemenosAccount = ConvertTemenosAccount(response.Account);
return new List<CollectionsApiLib.Models.TemenosAccount> {convertedTemenosAccount};
}
}
}
throw new NotFoundException($"Temenos account {accountNo} was not found, or related account not loaded.");
}
/**
* When making a request to Temenos you must present this options object to communicate exactly which fields
* and attributes you would like retrieved. If something is missing in a result, it may not be that it's missing
* in the data; you may need to find and add the relevant option here.
*/
public LoadOptions GetLoadOptions()
{
return new LoadOptions()
{
_Account = new Account()
{
_Cases = true,
_ChargeOff = new Account.ChargeOffOption()
{
_ChargeOff = true
},
_Collaterals = true,
_CustomFields = true,
_Recovery = new Account.RecoveryOption()
{
_Recovery = true
}
},
_Case = new Case()
{
_Collaterals = true,
_Letters = true,
_Repossession = new Case.RepossessionOption()
{
_Repossession = true,
_Notices = true
}
},
_Collateral = new Collateral()
{
_Valuations = true,
_Listings = true
},
_IntendToSave = false,
_Person = new Person()
{
_Workflow = true
},
_RepaymentPlan = new RepaymentPlan(),
_Ticket = new Ticket()
{
_Tasks = true
}
};
}
}
}
@@ -0,0 +1,26 @@
using LCU.API.Collections.CollectionsApi.Configuration;
using LCU.API.Collections.CollectionsApi.Dao;
using LCU.API.Collections.CollectionsApi.Models.TemenosApiWrapper;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace LCU.API.Collections.TemenosApiWrapper.DataAccess
{
public class TemenosApiWrapperDao : TrustingHttpClient, ITemenosApiWrapperDao
{
private readonly TemenosApiWrapperConfiguration _temenosApiWrapperConfiguration;
public TemenosApiWrapperDao(TemenosApiWrapperConfiguration temenosApiWrapperConfiguration)
{
_temenosApiWrapperConfiguration = temenosApiWrapperConfiguration;
}
public async Task<List<AccountSearchResponse>> AccountSearch(AccountSearchRequest request)
{
var accountSearchRequest = JsonConvert.SerializeObject(request);
var url = _temenosApiWrapperConfiguration.TemenosApiWrapperUrl + _temenosApiWrapperConfiguration.AccountSearch;
return await PostAsync<List<AccountSearchResponse>>(url, accountSearchRequest);
}
}
}
@@ -0,0 +1,186 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.CollectionsApi.Exceptions;
using Serilog;
using System.Threading.Tasks;
using LCU.API.Collections.CollectionsApi.Mappers;
using LCU.API.Collections.CollectionsApi.Services;
using LCU.API.Collections.CollectionsApiLib.Models;
using TemenosCase;
using LCU.API.Collections.CollectionsApi.Configuration;
namespace LCU.API.Collections.CollectionsApi.Dao
{
public class TemenosCaseDao : ITemenosCaseDao
{
private readonly ICase _caseService;
private readonly ITemenosSessionDao _sessionDao;
private readonly ILookupConversionService _statusService;
private readonly CollectionsApiConfiguration _collectionsApiConfiguration;
private readonly CaseMapper _mapper;
public TemenosCaseDao(ICase caseService, ITemenosSessionDao sessionDao, ILookupConversionService statusService, CollectionsApiConfiguration collectionsApiConfiguration)
{
_caseService = caseService;
_sessionDao = sessionDao;
_statusService = statusService;
_collectionsApiConfiguration = collectionsApiConfiguration;
_mapper = new CaseMapper();
}
public async Task<CollectionsApiLib.Models.TemenosCase> FindByIdAsync(int caseId)
{
var sessionResult = await _sessionDao.GetSession();
GetCaseRequest request = new GetCaseRequest()
{
CaseId = caseId,
UserToken = sessionResult.UserToken
};
var response = await _caseService.GetCaseAsync(request);
if (response != null && response.Result)
{
return ConvertTemenosCase(response.Case);
}
Log.Error($"Error Finding Case from Temenos by CaseId {caseId}");
throw new ServerErrorException();
}
public async Task<IReadOnlyCollection<CollectionsApiLib.Models.TemenosHistory>> FindCommentsAsync(int caseId)
{
var sessionResult = await _sessionDao.GetSession();
var request = new GetCommentsRequest()
{
CaseId = caseId,
UserToken = sessionResult.UserToken,
MinDate = DateTime.Now.AddYears(_collectionsApiConfiguration.TemenosCaseCommentMinDate),
MaxDate = DateTime.Now
};
var response = await _caseService.GetCommentsAsync(request);
if (response != null && response.Result)
{
return ConvertTemenosComments(response.Comment);
}
Log.Error($"Error Finding Comments from Temenos by CaseId {caseId}");
throw new ServerErrorException();
}
private IReadOnlyCollection<TemenosHistory> ConvertTemenosComments(Comment[] responseComments)
{
var history = new List<TemenosHistory>();
foreach (var comment in responseComments)
{
if (!string.IsNullOrWhiteSpace(comment.CommentText))
{
history.Add(new TemenosHistory()
{
Type = DetermineHistoryType(comment.CommentText, HistoryType.Comment),
Created = comment.CreatedDate,
Message = comment.CommentText,
Name = "Comment",
UserId = comment.CreatedById
});
}
}
return history;
}
private IReadOnlyCollection<TemenosHistory> ConvertTemenosHistories(Workflow[] responseWorkflows)
{
var history = new List<TemenosHistory>();
foreach (var workflow in responseWorkflows)
{
if (workflow.Status == "Completed" && workflow.WorkflowSteps != null )
{
foreach (var workflowStep in workflow.WorkflowSteps)
{
if (workflowStep.Status == "Completed")
{
history.Add(new TemenosHistory()
{
Type = DetermineHistoryType(workflowStep.Name, HistoryType.Workflow),
Created = workflow.CreatedDate,
Name = workflow.Name,
Message = workflowStep.Name,
UserId = workflow.CreatedByID
});
}
}
}
}
return history;
}
public async Task<CollectionsApiLib.Models.TemenosCase> FindByCaseNoAsync(string caseNo)
{
var sessionResult = await _sessionDao.GetSession();
GetCaseIdRequest idRequest = new GetCaseIdRequest()
{
CaseNumber = caseNo,
UserToken = sessionResult.UserToken
};
var idResponse = await _caseService.GetCaseIdAsync(idRequest);
if (idResponse != null && idResponse.Result)
{
if (idResponse.CaseId == 0)
{
throw new NotFoundException($"Temenos case {caseNo} was not found.");
}
GetCaseRequest request = new GetCaseRequest()
{
CaseId = idResponse.CaseId,
UserToken = sessionResult.UserToken
};
var response = await _caseService.GetCaseAsync(request);
if (response != null && response.Result)
{
return ConvertTemenosCase(response.Case);
}
Log.Error($"Error getting case from Temenos {caseNo}");
}
throw new ServerErrorException();
}
public CollectionsApiLib.Models.TemenosCase ConvertTemenosCase(Case1 responseCase)
{
var temenosCase = _mapper.MapToCollectionsCase(responseCase);
try
{
temenosCase.RepoStatus = _statusService.ConvertRepoStatus(responseCase.CaseStageID);
}
catch (IndexOutOfRangeException ex)
{
Log.Error(ex, "Could not find case stage, marking Ineligible");
// Per bill and kyle. All stages are in temenos and configured. If we don't recognize it, the
// account is ineligible.
temenosCase.RepoStatus = RepoStatus.INELIGIBLE;
}
return temenosCase;
}
private HistoryType DetermineHistoryType(string searchThis, HistoryType defaultType)
{
return searchThis.Contains("Sent letter") ? HistoryType.Letter : defaultType;
}
}
}
@@ -0,0 +1,71 @@
using Serilog;
using System.Linq;
using System.Threading.Tasks;
using TemenosConfiguration;
using LCU.API.Collections.CollectionsApiLib.Models;
using LCU.API.Collections.CollectionsApi.Exceptions;
using LCU.API.Collections.CollectionsApi.Configuration;
namespace LCU.API.Collections.CollectionsApi.Dao
{
public class TemenosConfigurationDao : ITemenosConfigurationDao
{
private readonly ITemenosSessionDao _sessionDao;
private readonly IConfiguration _configurationService;
private readonly TemenosApiWrapperConfiguration _temenosApiWrapperConfiguration;
public TemenosConfigurationDao(ITemenosSessionDao sessionDao, IConfiguration configurationService, TemenosApiWrapperConfiguration temenosApiWrapperConfiguration)
{
_sessionDao = sessionDao;
_configurationService = configurationService;
_temenosApiWrapperConfiguration = temenosApiWrapperConfiguration;
}
public async Task<CollectionsApiLib.Models.TemenosConfiguration> GetAsync()
{
var sessionResult = await _sessionDao.GetSession();
if (sessionResult.Result)
{
var configRequest = new GetLookupDataRequest()
{
UserToken = sessionResult.UserToken,
LookupType = _temenosApiWrapperConfiguration.DefaultLookupType
};
var configResponse = await _configurationService.GetAllLookupsAsync(configRequest);
if (configResponse != null && configResponse.Result)
{
return ParseConfiguration(configResponse.LookupData);
}
Log.Error($"Error getting Configuration from Temenos by {configRequest.LookupType}");
}
throw new ServerErrorException();
}
private CollectionsApiLib.Models.TemenosConfiguration ParseConfiguration(Lookup[] configResponseLookupData)
{
var converted = Enumerable.Select(configResponseLookupData, lookup => new LookupItem()
{
Id = lookup.LookupId ?? 0,
Code = lookup.LookupCode,
Description = lookup.LookupDesc,
Type = lookup.LookupType
}).Distinct().ToList();
return new CollectionsApiLib.Models.TemenosConfiguration()
{
RepoAgents = Enumerable.Where(converted, lookup => lookup.Type == "CUSTOM_REPO_AGENT").ToList(),
RepoTypes = Enumerable.Where(converted, lookup => lookup.Type == "CUSTOM_REPO_TYPE").ToList(), // TODO Is this "REPO_TYPE".
Users = Enumerable.Where(converted, lookup => lookup.Type == "USER").ToList(),
CaseStages = Enumerable.Where(converted, lookup => lookup.Type == "CASE_STAGE").ToList(),
AccountTypes = Enumerable.Where(converted, lookup => lookup.Type == "ACCOUNT_TYPE").ToList(),
CaseTypes = Enumerable.Where(converted, lookup => lookup.Type == "CASE_TYPE").ToList(),
AvailableLookups = Enumerable.Select(configResponseLookupData, lookup => lookup.LookupType).Distinct().ToList()
};
}
}
}
@@ -0,0 +1,36 @@
using Serilog;
using System.Threading.Tasks;
using TemenosSecurity;
namespace LCU.API.Collections.CollectionsApi.Dao
{
public class TemenosSessionDao : ITemenosSessionDao
{
private readonly ISecurity _securityService;
private readonly ITemenosSecurityConfig _securityConfig;
public TemenosSessionDao(ISecurity securityService, ITemenosSecurityConfig securityConfig)
{
_securityService = securityService;
_securityConfig = securityConfig;
}
public async Task<GetSessionResponse> GetSession()
{
var sessionRequest = new GetSessionRequest()
{
UserName = _securityConfig.GetUsername(),
Password = _securityConfig.GetPassword()
};
var response = await _securityService.GetSessionAsync(sessionRequest);
if (response != null && response.Result)
{
return response;
}
Log.Error($"Error getting Getting Temenos Session");
return null;
}
}
}
@@ -0,0 +1,65 @@
using LCU.API.Collections.CollectionsApi.Exceptions;
using Serilog;
using System;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using JsonSerializer = System.Text.Json.JsonSerializer;
namespace LCU.API.Collections.CollectionsApi.Dao
{
public class TrustingHttpClient
{
public static HttpClient GetClient(string endPoint)
{
var handler = new HttpClientHandler
{
SslProtocols = System.Security.Authentication.SslProtocols.Tls12 |
System.Security.Authentication.SslProtocols.Tls11 |
System.Security.Authentication.SslProtocols.Tls,
ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true
};
var httpClient = new HttpClient(handler)
{
Timeout = TimeSpan.FromSeconds(60),
BaseAddress = new Uri(endPoint)
};
return httpClient;
}
public async Task<T> PostAsync<T>(string url, string request)
{
var client = GetClient(url);
var stringContent = new StringContent(request, Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, stringContent);
if (response.IsSuccessStatusCode)
{
try
{
var stringResponse = response.Content.ReadAsStringAsync().Result;
return JsonSerializer.Deserialize<T>(stringResponse, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
}
catch (Exception ex)
{
Log.Error(ex, $"Error Deserializing {typeof(T).Name}");
throw new ServerErrorException();
}
}
if (response.StatusCode == HttpStatusCode.NotFound)
{
return default(T);
}
Log.Error($"Retrieve {typeof(T).Name} Bad Status Code {response.StatusCode}, for {url}");
throw new Exception("Failed to complete request.");
}
}
}
@@ -0,0 +1,11 @@
using System;
namespace LCU.API.Collections.CollectionsApi.Exceptions
{
public class NotFoundException : ApplicationException
{
public NotFoundException(string message) : base(message)
{
}
}
}
@@ -0,0 +1,14 @@
using System;
namespace LCU.API.Collections.CollectionsApi.Exceptions
{
/**
* Do not want to expose database and related exceptions to the controllers / web layer.
* The lower layers log what happened for developers, then return a general error; unless
* a more specific error can be returned in a way to allow the client to act (such as NotFound).
*/
public class ServerErrorException : Exception
{
public ServerErrorException() : base("A server error occured, and a response could not be produced.") { }
}
}
@@ -0,0 +1,35 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="9.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="2.2.0" />
<PackageReference Include="Serilog" Version="2.9.0" />
<PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
<PackageReference Include="Serilog.Sinks.Async" Version="1.4.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
<PackageReference Include="Serilog.Sinks.Seq" Version="4.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0" />
<PackageReference Include="System.Runtime.Caching" Version="4.7.0" />
<PackageReference Include="System.ServiceModel.Duplex" Version="4.10.3" />
<PackageReference Include="System.ServiceModel.Federation" Version="4.10.3" />
<PackageReference Include="System.ServiceModel.Http" Version="4.10.3" />
<PackageReference Include="System.ServiceModel.NetTcp" Version="4.10.3" />
<PackageReference Include="System.ServiceModel.Security" Version="4.10.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LCU.API.Collections.CollectionsApiLib\LCU.API.Collections.CollectionsApiLib.csproj" />
</ItemGroup>
<ItemGroup>
<WCFMetadata Include="Connected Services" />
</ItemGroup>
</Project>
@@ -0,0 +1,49 @@
using System;
using System.Net.Http;
using System.Security.Authentication;
using Serilog;
using Serilog.Core;
using Serilog.Events;
using LCU.Library.Internal.Logging.Models;
namespace LCU.Library.Internal.Logging
{
public class LcuLogging
{
private readonly LoggingConfiguration _loggingConfiguration;
public LcuLogging(LoggingConfiguration loggingConfiguration)
{
_loggingConfiguration = loggingConfiguration;
}
public void UseLcuLogging()
{
var loggingLevelSwitch = new LoggingLevelSwitch { MinimumLevel = LogEventLevel.Verbose };
Log.Logger = new LoggerConfiguration()
.MinimumLevel.ControlledBy(loggingLevelSwitch)
.Enrich.WithProperty("Application", _loggingConfiguration.AppName)
.Enrich.WithProperty(
"Environment", string.IsNullOrWhiteSpace(_loggingConfiguration.EnvironmentName)
? Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")
: _loggingConfiguration.EnvironmentName
)
.Enrich.WithProperty("MachineName", Environment.MachineName)
.WriteTo.Seq(_loggingConfiguration.SeqUrl,
loggingLevelSwitch.MinimumLevel,
1000, null, _loggingConfiguration.SeqKey, null, null, 262144,
loggingLevelSwitch,
new HttpClientHandler
{
SslProtocols = SslProtocols.Tls12 |
SslProtocols.Tls11 |
SslProtocols.Tls,
ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true
})
.WriteTo.Console()
.CreateLogger();
Log.Information($"{_loggingConfiguration.AppName} Starting Up");
}
}
}
@@ -0,0 +1,96 @@
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Serilog;
namespace LCU.Library.Internal.Logging.Middleware
{
public class RequestResponseLoggingMiddleware
{
private readonly RequestDelegate _next;
public RequestResponseLoggingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
var originalBody = context.Response.Body;
try
{
// Read and log request body data
var requestBodyPayload = await ReadRequestBody(context.Request);
RequestDataParser.RequestPayload = requestBodyPayload;
using (var memoryStream = new MemoryStream())
{
context.Response.Body = memoryStream;
// Continue down the Middleware pipeline, eventually returning to this class
await _next(context);
memoryStream.Position = 0;
// Copy the contents of the new memory stream (which contains the response) to the original stream,
// which is then returned to the client.
await memoryStream.CopyToAsync(originalBody);
}
}
finally
{
context.Response.Body = originalBody;
}
}
private async Task<string> ReadRequestBody(HttpRequest request)
{
request.EnableBuffering();
var body = request.Body;
var buffer = new byte[Convert.ToInt32(request.ContentLength)];
await request.Body.ReadAsync(buffer.AsMemory(0, buffer.Length));
var requestBody = Encoding.UTF8.GetString(buffer);
body.Seek(0, SeekOrigin.Begin);
request.Body = body;
return $"{requestBody}";
}
public static class RequestDataParser
{
public static string RequestPayload = "";
public static async void EnrichFromRequest(IDiagnosticContext diagnosticContext, HttpContext httpContext)
{
var request = httpContext.Request;
diagnosticContext.Set("RequestBody", RequestPayload);
var responseBodyPayload = await ReadResponseBody(httpContext.Response);
diagnosticContext.Set("ResponseBody", responseBodyPayload);
diagnosticContext.Set("Host", request.Host);
diagnosticContext.Set("Protocol", request.Protocol);
diagnosticContext.Set("Scheme", request.Scheme);
if (request.QueryString.HasValue)
{
diagnosticContext.Set("QueryString", request.QueryString.Value);
}
diagnosticContext.Set("ContentType", httpContext.Response.ContentType);
var endpoint = httpContext.GetEndpoint();
if (endpoint != null)
{
diagnosticContext.Set("EndpointName", endpoint.DisplayName);
}
}
private static async Task<string> ReadResponseBody(HttpResponse response)
{
response.Body.Position = 0;
var responseBody = await new StreamReader(response.Body).ReadToEndAsync();
return $"{responseBody}";
}
}
}
}
@@ -0,0 +1,23 @@
using System.ComponentModel.DataAnnotations;
namespace LCU.Library.Internal.Logging.Models
{
public class LoggingConfiguration
{
[Required]
public string AppName { get; }
[Required]
public string SeqKey { get; }
[Required]
public string SeqUrl { get; }
public string EnvironmentName { get; }
public LoggingConfiguration(string appName, string seqKey, string seqUrl, string environmentName = "")
{
AppName = appName;
SeqKey = seqKey;
SeqUrl = seqUrl;
EnvironmentName = environmentName;
}
}
}
@@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Serilog;
namespace LCU.Library.Internal.Logging.Performance
{
public class PerformanceMonitor
{
private string _codeLocation { get; set; }
private Guid _performanceMonitorId { get; set; }
private Stopwatch _stopWatch { get; set; }
private const string _nullContextValues = "Context not provided.";
/// <summary>
/// Initializes a new instance of the <see cref="PerformanceMonitor"/> class.
/// </summary>
/// <param name="codeLocation">Location or function in code that is being monitored.</param>
/// <param name="performanceMonitorId">Unique identifier for log(s).</param>
public PerformanceMonitor(string codeLocation, Guid performanceMonitorId)
{
_codeLocation = codeLocation;
_performanceMonitorId = performanceMonitorId;
_stopWatch = Stopwatch.StartNew();
}
/// <summary>
/// Logs the performance of the monitored code.
/// </summary>
/// <param name="dynamicValues">Collection of values visible in log (default = null).</param>
public void LogPerformance(Dictionary<string, string> dynamicValues = null)
{
var elapsedTime = _stopWatch.ElapsedMilliseconds / 1000.0;
var contextValues = dynamicValues != null ? string.Join(", ", dynamicValues.Select(kvp => $"{kvp.Key}=\"{kvp.Value}\"")) : _nullContextValues;
Log.ForContext("MonitorType", "Performance")
.ForContext("CodeLocation", _codeLocation)
.ForContext("PerformanceMonitorId", _performanceMonitorId)
.ForContext("ContextValues", contextValues)
.ForContext("ElapsedSeconds", elapsedTime).Information("PerformanceMonitor-{CodeLocation}-{ElapsedSeconds}", _codeLocation, elapsedTime);
_stopWatch.Stop();
}
}
}
@@ -0,0 +1,150 @@
using System;
using System.Collections.Generic;
using System.Linq;
using AutoMapper;
using TemenosAccount;
namespace LCU.API.Collections.CollectionsApi.Mappers
{
public class AccountMapper
{
private readonly IMapper _mapToCollectionsModel;
private const string FieldTitleOrdered = "Title Ordered Flag Case Lvl";
private const string FieldTitleOrderedDate = "Date Title Ordered Case Lvl";
private const string FieldRedemptionExpireDateIl = "IL Redemption Date Case Lvl";
private const string FieldRedemptionExpireDateWi = "WI Redemption Date Case Lvl";
private const string FieldDateAssigned = "Date Assigned to Agent";
private const string FieldRepoAgentLookup = "Repo Agent Lookup";
private const string FieldRepoType = "Repo Type Case Lvl";
public AccountMapper()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Account1, CollectionsApiLib.Models.TemenosAccount>()
.ForPath(dest => dest.AccountId, opts => opts.MapFrom(src => src.AccountID))
.ForPath(dest => dest.AccountTypeId, opts => opts.MapFrom(src => src.AccountTypeID))
.ForPath(dest => dest.DQAmount, opts => opts.MapFrom(src => src.DQAmount))
.ForPath(dest => dest.Branch, opts => opts.MapFrom(src => src.BranchNumber))
.ForPath(dest => dest.DaysDq, opts => opts.MapFrom(src => src.DaysDQ));
cfg.CreateMap<Case1, CollectionsApiLib.Models.TemenosCase>()
.ForPath(dest => dest.CaseId, opts => opts.MapFrom(src => src.CaseID))
.ForPath(dest => dest.CaseStageId, opts => opts.MapFrom(src => src.CaseStageID))
// Do not map Repo Status here, it is not mapped it is looked up
.ForPath(dest => dest.CaseStatusId, opts => opts.MapFrom(src => src.CaseStatusID))
.ForPath(dest => dest.CaseTypeBasisId, opts => opts.MapFrom(src => src.CaseTypeBasisId))
.ForPath(dest => dest.CaseTypeId, opts => opts.MapFrom(src => src.CaseTypeID));
});
_mapToCollectionsModel = config.CreateMapper();
}
public CollectionsApiLib.Models.TemenosAccount MapToCollectionsAccount(Account1 dto)
{
var account = _mapToCollectionsModel.Map<Account1, CollectionsApiLib.Models.TemenosAccount>(dto);
ConvertCustomCaseFields(dto.Cases, account.Cases);
return account;
}
public static void ConvertCustomCaseFields(Case1[] casesIn,
IReadOnlyCollection<CollectionsApiLib.Models.TemenosCase> casesOut)
{
foreach (var accountCase in casesOut)
{
var temenosCase = casesIn.First(x => x.CaseID == accountCase.CaseId);
ConvertCustomFields(temenosCase, accountCase);
}
}
// TODO there are two copies of this because there are technically two different case types TemenosAccount.Case1 and TemenosCase.Case1
// If you can resolve these types together, you can merge the methods in AccountMapper and CaseMapper.
public static void ConvertCustomFields(Case1 temenosCase, CollectionsApiLib.Models.TemenosCase accountCase)
{
if (temenosCase.Repossession != null)
{
accountCase.DateRepossessed = temenosCase.Repossession.DateRepossessed;
if (temenosCase.Repossession.CustomFields != null && temenosCase.Repossession.CustomFields.Any())
{
foreach (var customField in temenosCase.Repossession.CustomFields)
{
if (string.Equals(customField._Label, FieldDateAssigned))
{
var dateString = customField._Value;
if (!string.IsNullOrWhiteSpace(dateString))
{
accountCase.DateRepoAssigned = DateTime.Parse(dateString);
}
}
if (string.Equals(customField._Label, FieldRepoAgentLookup))
{
accountCase.RepoAgentId = customField._Value;
}
if (string.Equals(customField._Label, FieldTitleOrdered))
{
accountCase.TitleOrdered = string.Equals(customField._Value, "True");
continue;
}
if (string.Equals(customField._Label, FieldTitleOrderedDate))
{
var dateString = customField._Value;
if (!string.IsNullOrWhiteSpace(dateString))
{
accountCase.TitleOrderedDate = DateTime.Parse(dateString);
}
}
}
}
}
if (temenosCase.CustomFields != null && temenosCase.CustomFields.Any())
{
var map = new Dictionary<string, string>();
foreach (var customField in temenosCase.CustomFields)
{
if (map.ContainsKey(customField._Label))
{
continue;
}
if (string.Equals(customField._Label, FieldRedemptionExpireDateIl))
{
var dateString = customField._Value;
if (!string.IsNullOrWhiteSpace(dateString))
{
accountCase.RedemptionExpiredDateIl = DateTime.Parse(dateString);
}
continue;
}
if (string.Equals(customField._Label, FieldRedemptionExpireDateWi))
{
var dateString = customField._Value;
if (!string.IsNullOrWhiteSpace(dateString))
{
accountCase.RedemptionExpiredDateWi = DateTime.Parse(dateString);
}
continue;
}
if (string.Equals(customField._Label, FieldRepoType))
{
accountCase.RepoTypeId = customField._Value;
continue;
}
map.Add(customField._Label, customField._Value);
}
accountCase.CustomFieldMap = map;
}
}
}
}
@@ -0,0 +1,139 @@
using System;
using System.Collections.Generic;
using System.Linq;
using AutoMapper;
using LCU.API.Collections.CollectionsApi.Configuration;
using TemenosCase;
namespace LCU.API.Collections.CollectionsApi.Mappers
{
public class CaseMapper
{
private readonly ICaseStageConfig _caseStageConfig;
private readonly IMapper _mapToCollectionsModel;
private const string FieldTitleOrdered = "Title Ordered Flag Case Lvl";
private const string FieldTitleOrderedDate = "Date Title Ordered Case Lvl";
private const string FieldRedemptionExpireDateIl = "IL Redemption Date Case Lvl";
private const string FieldRedemptionExpireDateWi = "WI Redemption Date Case Lvl";
private const string FieldDateAssigned = "Date Assigned to Agent";
private const string FieldRepoAgentLookup = "Repo Agent Lookup";
private const string FieldRepoType = "Repo Type Case Lvl";
public CaseMapper()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Account1, CollectionsApiLib.Models.TemenosAccount>()
.ForPath(dest => dest.AccountId, opts => opts.MapFrom(src => src.AccountID))
.ForPath(dest => dest.AccountTypeId, opts => opts.MapFrom(src => src.AccountTypeID))
.ForPath(dest => dest.DQAmount, opts => opts.MapFrom(src => src.DQAmount))
.ForPath(dest => dest.DaysDq, opts => opts.MapFrom(src => src.DaysDQ));
cfg.CreateMap<Case1, CollectionsApiLib.Models.TemenosCase>()
.ForPath(dest => dest.CaseId, opts => opts.MapFrom(src => src.CaseID))
.ForPath(dest => dest.CaseStageId, opts => opts.MapFrom(src => src.CaseStageID))
// Don't translate repo status here, it's not "mapped", it's looked up.
.ForPath(dest => dest.CaseStatusId, opts => opts.MapFrom(src => src.CaseStatusID))
.ForPath(dest => dest.CaseTypeBasisId, opts => opts.MapFrom(src => src.CaseTypeBasisId))
.ForPath(dest => dest.CaseTypeId, opts => opts.MapFrom(src => src.CaseTypeID));
});
_mapToCollectionsModel = config.CreateMapper();
}
public CollectionsApiLib.Models.TemenosCase MapToCollectionsCase(Case1 dto)
{
return _mapToCollectionsModel.Map<Case1, CollectionsApiLib.Models.TemenosCase>(dto);
}
public static void ConvertCustomFields(Case1 temenosCase, CollectionsApiLib.Models.TemenosCase accountCase)
{
if (temenosCase.Repossession != null)
{
accountCase.DateRepossessed = temenosCase.Repossession.DateRepossessed;
if (temenosCase.Repossession.CustomFields != null && temenosCase.Repossession.CustomFields.Any())
{
foreach (var customField in temenosCase.Repossession.CustomFields)
{
if (string.Equals(customField._Label, FieldDateAssigned))
{
var dateString = customField._Value;
if (!string.IsNullOrWhiteSpace(dateString))
{
accountCase.DateRepoAssigned = DateTime.Parse(dateString);
}
}
if (string.Equals(customField._Label, FieldRepoAgentLookup))
{
accountCase.RepoAgentId = customField._Value;
}
if (string.Equals(customField._Label, FieldTitleOrdered))
{
accountCase.TitleOrdered = string.Equals(customField._Value, "True");
continue;
}
if (string.Equals(customField._Label, FieldTitleOrderedDate))
{
var dateString = customField._Value;
if (!string.IsNullOrWhiteSpace(dateString))
{
accountCase.TitleOrderedDate = DateTime.Parse(dateString);
}
}
}
}
}
if (temenosCase.CustomFields != null && temenosCase.CustomFields.Any())
{
var map = new Dictionary<string, string>();
foreach (var customField in temenosCase.CustomFields)
{
if (map.ContainsKey(customField._Label))
{
continue;
}
if (string.Equals(customField._Label, FieldRedemptionExpireDateIl))
{
var dateString = customField._Value;
if (!string.IsNullOrWhiteSpace(dateString))
{
accountCase.RedemptionExpiredDateIl = DateTime.Parse(dateString);
}
continue;
}
if (string.Equals(customField._Label, FieldRepoType))
{
accountCase.RepoTypeId = customField._Value;
continue;
}
if (string.Equals(customField._Label, FieldRedemptionExpireDateWi))
{
var dateString = customField._Value;
if (!string.IsNullOrWhiteSpace(dateString))
{
accountCase.RedemptionExpiredDateWi = DateTime.Parse(dateString);
}
continue;
}
map.Add(customField._Label, customField._Value);
}
accountCase.CustomFieldMap = map;
}
}
}
}
@@ -0,0 +1,25 @@
using Microsoft.AspNetCore.Hosting;
using System;
using System.Reflection;
namespace LCU.API.Collections.CollectionsApi.Models
{
public class EnvironmentView : IEnvironmentView
{
public string Application => _env.ApplicationName;
public DateTime CurrentDate => DateTime.Now;
public string BuildVersion => Assembly.GetExecutingAssembly().GetName().Version.ToString();
public DateTime BuildDate { get; }
public string Environment => _env.EnvironmentName;
private readonly IHostingEnvironment _env;
public EnvironmentView(DateTime buildate, IHostingEnvironment env)
{
_env = env;
BuildDate = buildate;
}
}
}
@@ -0,0 +1,13 @@
using System;
namespace LCU.API.Collections.CollectionsApi.Models
{
public interface IEnvironmentView
{
string Application { get; }
DateTime CurrentDate { get; }
string BuildVersion { get; }
DateTime BuildDate { get; }
string Environment { get; }
}
}
@@ -0,0 +1,7 @@
namespace LCU.API.Collections.CollectionsApi.Models.TemenosApiWrapper
{
public class AccountSearchRequest
{
public string AccountAccountNumber { get; set; }
}
}
@@ -0,0 +1,23 @@
namespace LCU.API.Collections.CollectionsApi.Models.TemenosApiWrapper
{
public class AccountSearchResponse
{
public string AccountAccountNumber { get; set; }
public string AccountCreditCardNumber { get; set; }
public string AccountType { get; set; }
public decimal Balance { get; set; }
public int DaysDQ { get; set; }
public decimal DelinquentAmount { get; set; }
public string InternalAccountNumber { get; set; }
public string LoanNumber { get; set; }
public string NextContactDate { get; set; }
public string PersonAccountNumber { get; set; }
public string PersonNumber { get; set; }
public string PrimaryDefaultAddress { get; set; }
public string PrimaryHomePhone { get; set; }
public string PrimaryName { get; set; }
public string PrimaryTIN { get; set; }
public string PrimaryWorkPhone { get; set; }
public string Suffix { get; set; }
}
}
@@ -0,0 +1,44 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using LCU.Library.Internal.Logging;
using LCU.Library.Internal.Logging.Models;
using LCU.API.Collections.CollectionsApi.Configuration;
namespace LCU.API.Collections.CollectionsApi
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureServices((context, services) =>
{
var baseApiConfig = new CollectionsApiConfiguration();
context.Configuration.GetSection("primary").Bind(baseApiConfig);
var loggerConfiguration = new LoggingConfiguration(baseApiConfig.AppName,
baseApiConfig.SeqApiKey,
baseApiConfig.SeqUrl);
var lcuLogging = new LcuLogging(loggerConfiguration);
lcuLogging.UseLcuLogging();
})
.ConfigureAppConfiguration((context, builder) =>
{
builder.AddJsonFile("/app/config/environment-appsettings/appsettings.json", optional: true, reloadOnChange: true);
builder.AddJsonFile("/app/config/workload-appsettings/appsettings.json", optional: true, reloadOnChange: true);
builder.AddJsonFile("/vault/secrets/collections-api-seq-api-key.json", optional: true, reloadOnChange: true);
builder.AddJsonFile("/vault/secrets/collections-api-temenos-user.json", optional: true, reloadOnChange: true);
builder.AddJsonFile("/vault/secrets/collections-api-temenos-password.json", optional: true, reloadOnChange: true);
});
}
}
@@ -0,0 +1,30 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:22532",
"sslPort": 44380
}
},
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"LCU.API.Collections.RepoApi": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}
@@ -0,0 +1,111 @@
using LCU.API.Collections.CollectionsApi.Dao;
using LCU.API.Collections.CollectionsApi.Exceptions;
using LCU.API.Collections.CollectionsApi.Models.TemenosApiWrapper;
using LCU.API.Collections.TemenosApiWrapper.Services;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LCU.API.Collections.CollectionsApi.Services
{
public class AccountService : IAccountService
{
private readonly ITemenosAccountDao _temenosAccountDao;
private readonly ITemenosApiWrapperService _temenosApiWrapperService;
public AccountService(ITemenosAccountDao temenosAccountDao, ITemenosApiWrapperService temenosApiWrapperService)
{
_temenosAccountDao = temenosAccountDao;
_temenosApiWrapperService = temenosApiWrapperService;
}
public async Task<List<AccountSearchResponse>> AccountSearch(string accountNo)
{
try
{
var request = new AccountSearchRequest()
{
AccountAccountNumber = accountNo
};
return await _temenosApiWrapperService.AccountSearch(request);
}
catch (Exception ex)
{
Log.Error(ex, $"Failure retrieving Temenos Api Wrapper Account Search by Account Number: {accountNo}");
throw;
}
}
private string GetAccountIdentifier(List<AccountSearchResponse> accountSearchResponse, string accountNumber)
{
return accountSearchResponse?.FirstOrDefault(s => s.AccountAccountNumber == accountNumber)?.InternalAccountNumber;
}
public async Task<IReadOnlyCollection<CollectionsApiLib.Models.TemenosAccount>> ListByAccountNoAsync(string accountNo)
{
try
{
var listAccountSearchResponse = AccountSearch(accountNo);
var accountIdentifier = GetAccountIdentifier(listAccountSearchResponse.Result, accountNo);
return await _temenosAccountDao.ListByAccountNoAsync(accountNo, accountIdentifier);
}
catch (Exception ex)
{
Log.Error(ex, $"Failure retrieving Temenos Account by account no: {accountNo}");
throw;
}
}
public async Task<IReadOnlyCollection<CollectionsApiLib.Models.TemenosHistory>> GetHistoryByAccountIdAsync(int accountId)
{
try
{
var comments = await _temenosAccountDao.FindCommentsAsync(accountId);
var workflows = await _temenosAccountDao.FindHistoryAsync(accountId);
var result = comments.ToList();
result.AddRange(workflows);
return result.OrderByDescending(history => history.Created).ToList();
}
catch (NotFoundException nfe)
{
Log.Error(nfe, $"History for {accountId} was not found.");
throw;
}
catch (Exception ex)
{
Log.Error(ex, $"Failure retrieving Temenos History by account id: {accountId}");
throw new ServerErrorException();
}
}
public async Task<CollectionsApiLib.Models.TemenosAccount> FindByIdAsync(int id)
{
CollectionsApiLib.Models.TemenosAccount corsLoan;
try
{
corsLoan = await _temenosAccountDao.FindByIdAsync(id);
}
catch (NotFoundException nfe)
{
Log.Error(nfe, $"Temenos account {id} was not found.");
throw;
}
catch (Exception ex)
{
Log.Error(ex, $"Failure retrieving Temenos Account {id}");
throw new ServerErrorException();
}
if (corsLoan == null)
{
throw new NotFoundException($"Account with id {id} not found.");
}
return corsLoan;
}
}
}
@@ -0,0 +1,84 @@
using LCU.API.Collections.CollectionsApi.Dao;
using LCU.API.Collections.CollectionsApi.Exceptions;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LCU.API.Collections.CollectionsApi.Services
{
public class CaseService : ICaseService
{
private readonly ITemenosCaseDao _temenosCaseDao;
public CaseService( ITemenosCaseDao temenosCaseDao)
{
_temenosCaseDao = temenosCaseDao;
}
public async Task<CollectionsApiLib.Models.TemenosCase> GetCaseByIdAsync(int id)
{
CollectionsApiLib.Models.TemenosCase corsLoan;
try
{
corsLoan = await _temenosCaseDao.FindByIdAsync(id);
}
catch (Exception ex)
{
Log.Error(ex, "Failure retrieving Temenos Case", id);
throw new ServerErrorException();
}
if (corsLoan == null)
{
throw new NotFoundException($"Case with id {id} not found.");
}
return corsLoan;
}
public async Task<CollectionsApiLib.Models.TemenosCase> GetCaseByCaseNoAsync(string caseNo)
{
CollectionsApiLib.Models.TemenosCase corsLoan;
try
{
corsLoan = await _temenosCaseDao.FindByCaseNoAsync(caseNo);
}
catch (Exception ex)
{
Log.Error(ex, "Failure retrieving Temenos Case by case no", caseNo);
throw new ServerErrorException();
}
if (corsLoan == null)
{
throw new NotFoundException($"Case with case no {caseNo} not found.");
}
return corsLoan;
}
public async Task<IReadOnlyCollection<CollectionsApiLib.Models.TemenosHistory>> GetHistoryByAccountIdAsync(int caseId)
{
try
{
var comments = await _temenosCaseDao.FindCommentsAsync(caseId);
var result = comments.ToList();
return result.OrderByDescending(history => history.Created).ToList();
}
catch (NotFoundException nfe)
{
Log.Error(nfe, $"History for {caseId} was not found.");
throw;
}
catch (Exception ex)
{
Log.Error(ex, $"Failure retrieving Temenos History by account id: {caseId}");
throw new ServerErrorException();
}
}
}
}
@@ -0,0 +1,31 @@
using LCU.API.Collections.CollectionsApi.Dao;
using LCU.API.Collections.CollectionsApi.Exceptions;
using Serilog;
using System;
using System.Threading.Tasks;
namespace LCU.API.Collections.CollectionsApi.Services
{
public class ConfigurationService : IConfigurationService
{
private readonly ITemenosConfigurationDao _temenosConfigurationDao;
public ConfigurationService(ITemenosConfigurationDao temenosConfigurationDao)
{
_temenosConfigurationDao = temenosConfigurationDao;
}
public async Task<CollectionsApiLib.Models.TemenosConfiguration> GetAsync()
{
try
{
return await _temenosConfigurationDao.GetAsync();
}
catch (Exception ex)
{
Log.Error(ex, $"Failure retrieving Temenos Config");
throw new ServerErrorException();
}
}
}
}
@@ -0,0 +1,12 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace LCU.API.Collections.CollectionsApi.Services
{
public interface IAccountService
{
Task<IReadOnlyCollection<CollectionsApiLib.Models.TemenosAccount>> ListByAccountNoAsync(string accountNo);
Task<CollectionsApiLib.Models.TemenosAccount> FindByIdAsync(int accountId);
Task<IReadOnlyCollection<CollectionsApiLib.Models.TemenosHistory>> GetHistoryByAccountIdAsync(int accountId);
}
}
@@ -0,0 +1,12 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace LCU.API.Collections.CollectionsApi.Services
{
public interface ICaseService
{
Task<CollectionsApiLib.Models.TemenosCase> GetCaseByIdAsync(int id);
Task<CollectionsApiLib.Models.TemenosCase> GetCaseByCaseNoAsync(string caseNo);
Task<IReadOnlyCollection<CollectionsApiLib.Models.TemenosHistory>> GetHistoryByAccountIdAsync(int caseId);
}
}
@@ -0,0 +1,9 @@
using System.Threading.Tasks;
namespace LCU.API.Collections.CollectionsApi.Services
{
public interface IConfigurationService
{
Task<CollectionsApiLib.Models.TemenosConfiguration> GetAsync();
}
}
@@ -0,0 +1,11 @@
using LCU.API.Collections.CollectionsApiLib.Models;
namespace LCU.API.Collections.CollectionsApi.Services
{
public interface ILookupConversionService
{
RepoStatus ConvertRepoStatus(int caseStageId);
RepoType ConvertRepoType(string repoTypeId);
RepoAccountType ConvertRepoAccountType(int responseAccountAccountTypeId);
}
}
@@ -0,0 +1,11 @@
using LCU.API.Collections.CollectionsApi.Models.TemenosApiWrapper;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace LCU.API.Collections.TemenosApiWrapper.Services
{
public interface ITemenosApiWrapperService
{
Task<List<AccountSearchResponse>> AccountSearch(AccountSearchRequest request);
}
}
@@ -0,0 +1,67 @@
using System;
using LCU.API.Collections.CollectionsApi.Configuration;
using LCU.API.Collections.CollectionsApiLib.Models;
namespace LCU.API.Collections.CollectionsApi.Services
{
public class LookupConversionService : ILookupConversionService
{
private readonly CollectionsApiConfiguration _configuration;
public LookupConversionService(CollectionsApiConfiguration configuration)
{
_configuration = configuration;
}
public RepoStatus ConvertRepoStatus(int caseStageId)
{
var stages = _configuration.GetCaseStages();
foreach (var caseStage in stages)
{
if (caseStage.Id == caseStageId)
{
return caseStage.RepoStatus;
}
}
throw new IndexOutOfRangeException($"Found unmapped status in collections API {caseStageId}");
}
public RepoType ConvertRepoType(string repoTypeId)
{
if (string.IsNullOrWhiteSpace(repoTypeId))
{
return RepoType.Unknown;
}
var types = _configuration.GetCaseRepoTypes();
foreach (var repoType in types)
{
if (repoType.Id == repoTypeId)
{
return repoType.RepoType;
}
}
throw new IndexOutOfRangeException($"Found unmapped repo type in collections API {repoTypeId}");
}
public RepoAccountType ConvertRepoAccountType(int accountAccountTypeId)
{
var types = _configuration.GetRepoAccountTypes();
foreach (var accountType in types)
{
if (accountType.Id == accountAccountTypeId)
{
return accountType;
}
}
throw new IndexOutOfRangeException($"Found unmapped repoAccountType in collections API {accountAccountTypeId}");
}
}
}
@@ -0,0 +1,32 @@
using LCU.API.Collections.CollectionsApi.Models.TemenosApiWrapper;
using LCU.API.Collections.TemenosApiWrapper.DataAccess;
using Serilog;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace LCU.API.Collections.TemenosApiWrapper.Services
{
public class TemenosApiWrapperService : ITemenosApiWrapperService
{
private readonly ITemenosApiWrapperDao _temenosApiWrapperDao;
public TemenosApiWrapperService(ITemenosApiWrapperDao temenosApiWrapperDao)
{
_temenosApiWrapperDao = temenosApiWrapperDao;
}
public async Task<List<AccountSearchResponse>> AccountSearch(AccountSearchRequest request)
{
try
{
return await _temenosApiWrapperDao.AccountSearch(request);
}
catch (Exception exception)
{
Log.Error(exception, $"Failure searching account in TemenosApiWrapperService for Account: {request.AccountAccountNumber}");
throw new Exception($"Failure searching account in TemenosApiWrapperService Exception Message: {exception.Message}");
}
}
}
}
@@ -0,0 +1,118 @@
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using IConfiguration = Microsoft.Extensions.Configuration.IConfiguration;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json.Serialization;
using TemenosAccount;
using TemenosCase;
using TemenosConfiguration;
using TemenosSecurity;
using LCU.API.Collections.CollectionsApi.Configuration;
using LCU.API.Collections.CollectionsApi.Dao;
using LCU.API.Collections.CollectionsApi.Services;
using LCU.API.Collections.CollectionsApi.Models;
using LCU.API.Collections.TemenosApiWrapper.DataAccess;
using LCU.API.Collections.TemenosApiWrapper.Services;
namespace LCU.API.Collections.CollectionsApi
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("http://localhost:3000", "https://localhost:5001",
"http://lcu-internal.com", "https://lcu-internal.com", "https://qa-repomanage.lcu-internal.com",
"https://uat-repomanage.lcu-internal.com", "https://repomanage.lcu-internal.com").AllowAnyHeader()
.AllowAnyMethod();
});
});
services.AddHttpClient();
services.AddMvc().AddMvcOptions(option => option.EnableEndpointRouting = false)
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
var baseApiConfig = new CollectionsApiConfiguration();
Configuration.GetSection("primary").Bind(baseApiConfig);
var temenosApiConfig = new TemenosApiWrapperConfiguration();
Configuration.GetSection("TemenosApiWrapperConfiguration").Bind(temenosApiConfig);
services.AddSingleton(temenosApiConfig);
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location);
DateTime assemblyLastModified = fileInfo.LastWriteTime;
services.AddSingleton(baseApiConfig);
services.AddSingleton<ITemenosSecurityConfig>(baseApiConfig);
services.AddScoped<TemenosConfiguration.IConfiguration, ConfigurationClient>();
services.AddScoped<IAccount, AccountClient>();
services.AddScoped<ICase, CaseClient>();
services.AddScoped<ISecurity, SecurityClient>();
services.AddScoped<IEnvironmentView, EnvironmentView>(view => new EnvironmentView(assemblyLastModified, view.GetService<IHostingEnvironment>()));
services.AddScoped<ILookupConversionService, LookupConversionService>();
services.AddScoped<ICaseService, CaseService>();
services.AddScoped<IAccountService, AccountService>();
services.AddScoped<IConfigurationService, ConfigurationService>();
services.AddScoped<ITemenosApiWrapperService, TemenosApiWrapperService>();
services.AddScoped<ITemenosConfigurationDao, TemenosConfigurationDao>();
services.AddScoped<ITemenosAccountDao, TemenosAccountDao>();
services.AddScoped<ITemenosCaseDao, TemenosCaseDao>();
services.AddScoped<ITemenosSessionDao, TemenosSessionDao>();
services.AddScoped<ITemenosApiWrapperDao, TemenosApiWrapperDao>();
// Register the Swagger generator, defining 1 or more Swagger documents
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Collections API", Version = "v1" }); });
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
// specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "Collections API"); });
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseCors(MyAllowSpecificOrigins);
app.UseHttpsRedirection();
app.UseMvcWithDefaultRoute();
app.UseRouting();
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
}
}
}
@@ -0,0 +1,595 @@
{
"AllowedHosts": "*",
"TemenosApiWrapperConfiguration": {
"TemenosApiWrapperUrl": "https://qa-temenos-api-wrapper-api.apps.azure.lcu-internal.com",
"AccountSearch": "/api/AccountSearch",
"DefaultLookupType": "User"
},
"Connections": {
},
"primary": {
"AppName": "Collections API",
"SeqApiKey": "KnA3VLl0fFivNj4kqijM",
"SeqUrl": "https://qa-seq.lcu-internal.com",
"TemenosUrl": "https://lms-test-app-lcu.temenoscloudna.com",
"TemenosUser": "APIAccount",
"TemenosPassword": "Welcome1!",
"TemenosCaseCommentMinDate": -5,
"CaseRepoTypes": [
{
"ID": "6616",
"Description": "Voluntary",
"Code": "Voluntary",
"RepoType": "Voluntary"
},
{
"ID": "6615",
"Description": "Involuntary",
"CodeName": "InVoluntary",
"RepoType": "Involuntary"
},
{
"ID": "2000142",
"Description": "Voluntary Surrender",
"Code": "Vol. Surrender",
"RepoType": "Voluntary"
},
{
"ID": "2000143",
"Description": "Involuntary Repo",
"CodeName": "InVol. Repo",
"RepoType": "Involuntary"
},
{
"ID": "2000144",
"Description": "Skip Request",
"CodeName": "Skip Claim",
"RepoType": "Skip"
},
{
"ID": "2000145",
"Description": "Pre-Skip Request",
"CodeName": "Pre-Skip",
"RepoType": "PreSkip"
}
],
"RepoAccountTypes": [
{
"Id": 1001,
"Description": "Auto Direct",
"Code": "AD"
},
{
"Id": 1002,
"Description": "Auto Indirect",
"Code": "AI"
},
{
"Id": 1003,
"Description": "Auto New",
"Code": "AN"
},
{
"Id": 1004,
"Description": "Auto New Direct",
"Code": "AND"
},
{
"Id": 1005,
"Description": "Auto New Indirect",
"Code": "ANI"
},
{
"Id": 1006,
"Description": "Auto Used",
"Code": "AU"
},
{
"Id": 1007,
"Description": "Auto Used Direct",
"Code": "AUD"
},
{
"Id": 1008,
"Description": "Auto Used Indirect",
"Code": "AUI"
},
{
"Id": 1009,
"Description": "Auto Loans",
"Code": "AUTO"
},
{
"Id": 1010,
"Description": "Business",
"Code": "BUS"
},
{
"Id": 1011,
"Description": "Charge Off",
"Code": "CO"
},
{
"Id": 1012,
"Description": "Commercial",
"Code": "COM"
},
{
"Id": 1013,
"Description": "Credit Card",
"Code": "CREDITCARD"
},
{
"Id": 1014,
"Description": "Deposit/Savings",
"Code": "DEPOSIT"
},
{
"Id": 1015,
"Description": "Home Equity",
"Code": "HOMEEQUITY"
},
{
"Id": 1016,
"Description": "Miscellaneous",
"Code": "MISC"
},
{
"Id": 1017,
"Description": "Mortgage",
"Code": "MORTGAGE"
},
{
"Id": 1018,
"Description": "RV Direct",
"Code": "RVD"
},
{
"Id": 1019,
"Description": "RV Indirect",
"Code": "RVI"
},
{
"Id": 1020,
"Description": "RV New",
"Code": "RVN"
},
{
"Id": 1021,
"Description": "RV New Direct",
"Code": "RVND"
},
{
"Id": 1022,
"Description": "RV New Indirect",
"Code": "RVNI"
},
{
"Id": 1023,
"Description": "RV Used",
"Code": "RVU"
},
{
"Id": 1024,
"Description": "RV Used Direct",
"Code": "RVUD"
},
{
"Id": 1025,
"Description": "RV Used Indirect",
"Code": "RVUI"
},
{
"Id": 1026,
"Description": "Secured",
"Code": "SECURED"
},
{
"Id": 1027,
"Description": "Student",
"Code": "STUDENT"
},
{
"Id": 1028,
"Description": "HSB",
"Code": "HSB"
},
{
"Id": 1029,
"Description": "Auto Used Indirect IL",
"Code": "AUIIL"
},
{
"Id": 1030,
"Description": "Auto New Indirect IL",
"Code": "ANIIL"
},
{
"Id": 1031,
"Description": "Watertown Hospital",
"Code": "WH"
},
{
"Id": 1032,
"Description": "Unsecured",
"Code": "UNSECURED"
},
{
"Id": 1033,
"Description": "Conventional Mortgage",
"Code": "CM"
},
{
"Id": 1034,
"Description": "Lease-Indirect Auto",
"Code": "LEASE"
}
],
"CaseStages": [
{
"ID": "0",
"CodeShort": "-",
"CodeName": "NoStage",
"MiscCode1": "This is for cases with no stage",
"RepoStatus": "UNKNOWN"
},
{
"ID": "49",
"CodeShort": "-",
"CodeName": "Default",
"MiscCode1": "1",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000027",
"CodeShort": "--",
"CodeName": "BK Default",
"MiscCode1": "BK",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000034",
"CodeShort": "---",
"CodeName": "FC Default",
"MiscCode1": "FORECLOSURE",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000042",
"CodeShort": "----",
"CodeName": "Legal Default",
"MiscCode1": "LEGAL",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000045",
"CodeShort": "-----",
"CodeName": "Fraud Default",
"MiscCode1": "FRAUD",
"RepoStatus": "UNKNOWN"
},
{
"ID": "50",
"CodeShort": "Assigned for Repo",
"CodeName": "ASSIGNED",
"MiscCode1": "REPO",
"RepoStatus": "O4R"
},
{
"ID": "2000071",
"CodeShort": "Assigned to Agent",
"CodeName": "AGENT",
"MiscCode1": "REPO",
"RepoStatus": "O4R"
},
{
"ID": "52",
"CodeShort": "At Auction",
"CodeName": "AUCTION",
"MiscCode1": "REPO",
"RepoStatus": "REPO"
},
{
"ID": "2000035",
"CodeShort": "At Foreclosure Attorney",
"CodeName": "FCATTY",
"MiscCode1": "FORECLOSURE",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000033",
"CodeShort": "BK Chapter Converted",
"CodeName": "CHCONVERTED",
"MiscCode1": "BK",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000054",
"CodeShort": "Chapter 11 BK Filed",
"CodeName": "CH11BKRECVD",
"MiscCode1": "BK",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000053",
"CodeShort": "Chapter 12 BK Filed",
"CodeName": "CH12BKRECVD",
"MiscCode1": "BK",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000029",
"CodeShort": "Chapter 13 BK Filed",
"CodeName": "CH13BKRECVD",
"MiscCode1": "BK",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000028",
"CodeShort": "Chapter 7 BK Filed",
"CodeName": "CH7BKRECVD",
"MiscCode1": "BK",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "51",
"CodeShort": "Collateral Repossessed",
"CodeName": "COLLREPOD",
"MiscCode1": "REPO",
"RepoStatus": "REPO"
},
{
"ID": "2000132",
"CodeShort": "Damage Claim",
"CodeName": "DMGCL",
"MiscCode1": "INSURANCE",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000024",
"CodeShort": "Deficiency Balance Established",
"CodeName": "DEFBAL",
"MiscCode1": "REPO",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000129",
"CodeShort": "Disability Claim",
"CodeName": "DISCL",
"MiscCode1": "DISABILITY CLAIMS",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000032",
"CodeShort": "Discharged",
"CodeName": "DISCHARGED",
"MiscCode1": "BK",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000031",
"CodeShort": "Dismissed",
"CodeName": "DISMISSED",
"MiscCode1": "BK",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000041",
"CodeShort": "Foreclosure Cancelled",
"CodeName": "FCCANCEL",
"MiscCode1": "FORECLOSURE",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000036",
"CodeShort": "Foreclosure Prepared for Sale",
"CodeName": "FCPREPFORSALE",
"MiscCode1": "FORECLOSURE",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000023",
"CodeShort": "Foreclosure Proceedings Started",
"CodeName": "FCSTARTED",
"MiscCode1": "FORECLOSURE",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000037",
"CodeShort": "Foreclosure Property Sold",
"CodeName": "FCPROPSOLD",
"MiscCode1": "FORECLOSURE",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000049",
"CodeShort": "Fraud Case Completed",
"CodeName": "COMPLETE",
"MiscCode1": "FRAUD",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000052",
"CodeShort": "Fraud Determined",
"CodeName": "FRDET",
"MiscCode1": "FRAUD",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000046",
"CodeShort": "Fraud Suspected",
"CodeName": "FRDSUS",
"MiscCode1": "FRAUD",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000130",
"CodeShort": "Gap Claims",
"CodeName": "GAPCL",
"MiscCode1": "GAP CLAIMS",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000133",
"CodeShort": "Garnishment",
"CodeName": "GARN",
"MiscCode1": "Legal",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000134",
"CodeShort": "Legal",
"CodeName": "LEGAL",
"MiscCode1": "Legal",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000043",
"CodeShort": "Legal Action Started",
"CodeName": "SLGL",
"MiscCode1": "LEGAL",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000044",
"CodeShort": "Legal Process Completed",
"CodeName": "LGLCOMPLETE",
"MiscCode1": "LEGAL",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000047",
"CodeShort": "No Fraud Determined",
"CodeName": "NOFRAUD",
"MiscCode1": "FRAUD",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000122",
"CodeShort": "Out for Repo",
"CodeName": "O4R",
"MiscCode1": "REPO",
"RepoStatus": "O4R"
},
{
"ID": "2000125",
"CodeShort": "Paid Skip Claim",
"CodeName": "PSKP",
"MiscCode1": "REPO",
"RepoStatus": "PSKP"
},
{
"ID": "2000131",
"CodeShort": "Pending Loan Modification",
"CodeName": "PMOD",
"MiscCode1": "LOAN MODIFICATION",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000030",
"CodeShort": "Plan Received",
"CodeName": "PLANRECVD",
"MiscCode1": "BK",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000051",
"CodeShort": "Proof of Claim Filed",
"CodeName": "POC_FILED",
"MiscCode1": "BK",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000038",
"CodeShort": "REO",
"CodeName": "REO",
"MiscCode1": "FORECLOSURE",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000039",
"CodeShort": "REO Assigned to Realtor",
"CodeName": "REOREALTOR",
"MiscCode1": "FORECLOSURE",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000040",
"CodeShort": "REO Sold",
"CodeName": "REOSOLD",
"MiscCode1": "FORECLOSURE",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000123",
"CodeShort": "Replevin",
"CodeName": "LGLR",
"MiscCode1": "REPO",
"RepoStatus": "UNKNOWN"
},
{
"ID": "2000025",
"CodeShort": "Repo on Hold",
"CodeName": "REHO",
"MiscCode1": "REPO",
"RepoStatus": "REHO"
},
{
"ID": "2000026",
"CodeShort": "Repo Order Cancelled",
"CodeName": "RECA",
"MiscCode1": "REPO",
"RepoStatus": "RECA"
},
{
"ID": "2000050",
"CodeShort": "Repo Redeemed",
"CodeName": "REDEEMED",
"MiscCode1": "REPO",
"RepoStatus": "REDEEMED"
},
{
"ID": "2000126",
"CodeShort": "Repo Referred",
"CodeName": "RR",
"MiscCode1": "REPO",
"RepoStatus": "UNKNOWN"
},
{
"ID": "53",
"CodeShort": "Repo Sold",
"CodeName": "SOLD",
"MiscCode1": "REPO",
"RepoStatus": "SOLD"
},
{
"ID": "2000124",
"CodeShort": "Repossession",
"CodeName": "REPO",
"MiscCode1": "REPO",
"RepoStatus": "REPO"
},
{
"ID": "2000127",
"CodeShort": "Skip Claim",
"CodeName": "SKIP",
"MiscCode1": "REPO",
"RepoStatus": "PSKP"
},
{
"ID": "2000048",
"CodeShort": "Submitted to Law Enforcement",
"CodeName": "LAWENF",
"MiscCode1": "FRAUD",
"RepoStatus": "INELIGIBLE"
},
{
"ID": "2000128",
"CodeShort": "Totalled Vehicles",
"CodeName": "TOTAL",
"MiscCode1": "TOTAL",
"RepoStatus": "UNKNOWN"
}
]
}
}
@@ -0,0 +1,5 @@
{
"version": "1.0",
"defaultProvider": "cdnjs",
"libraries": []
}
@@ -0,0 +1,33 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<Version>1.3.0</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Description>1.11.0 Add Ineligible status</Description>
<PackageReleaseNotes>1.0.0 Initial release as library
1.1.0 Remove CORS and Intellect
1.2.0 Add custom fields for Temenos Account
1.3.0 Add additional fields for retitle, date last paid, and date first delinquent
1.4.0 Add History object
1.5.0 Improve history object
1.6.0 Add Configuration object
1.7.0 Add repossession data
1.8.0 lookup repo type
1.9.0 Use new repo type field
1.9.1 correct skipclaim to skip
1.10.0 Return repo account type
1.11.0 Add Ineligible status</PackageReleaseNotes>
<RepositoryUrl>https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi</RepositoryUrl>
<RepositoryType>Git</RepositoryType>
<AssemblyVersion>1.11.0.0</AssemblyVersion>
<FileVersion>1.11.0.0</FileVersion>
<PackageVersion>1.11.0</PackageVersion>
<Title>Collections API Lib</Title>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0" />
</ItemGroup>
</Project>
@@ -0,0 +1,9 @@
namespace LCU.API.Collections.CollectionsApiLib.Models
{
public enum HistoryType
{
Comment,
Workflow,
Letter
}
}
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace LCU.API.Collections.CollectionsApiLib.Models
{
public class LookupItem
{
public int Id { get; set; } // 5
public string Description { get; set; } // George Frick
public string Code { get; set; } // might be null here
public string Type { get; set; } // "USER"
}
}
@@ -0,0 +1,10 @@
namespace LCU.API.Collections.CollectionsApiLib.Models
{
public class RepoAccountType
{
public int Id { get; set; }
public string Description { get; set; }
public string Code { get; set; }
}
}
@@ -0,0 +1,11 @@
namespace LCU.API.Collections.CollectionsApiLib.Models
{
public class RepoCaseRepoType
{
public string Id { get; set; }
public string Description { get; set; }
public string CodeName { get; set; }
public RepoType RepoType { get; set; }
}
}
@@ -0,0 +1,12 @@
namespace LCU.API.Collections.CollectionsApiLib.Models
{
public class RepoCaseStage
{
public int Id { get; set; }
public string CodeShort { get; set; }
public string CodeName { get; set; }
public string MiscCode1 { get; set; }
public RepoStatus RepoStatus { get; set; }
}
}
@@ -0,0 +1,17 @@
namespace LCU.API.Collections.CollectionsApiLib.Models
{
public enum RepoStatus
{
O4R = 100,
REPO = 200,
RECA = 300,
REHO = 400,
REDEEMED = 500,
PSKP = 600,
SOLD = 700,
NOTACTIVE = 800,
UNKNOWN = 0,
INELIGIBLE = 999
}
}
@@ -0,0 +1,11 @@
namespace LCU.API.Collections.CollectionsApiLib.Models
{
public enum RepoType
{
Unknown,
Involuntary,
Voluntary,
PreSkip,
Skip
}
}
@@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
namespace LCU.API.Collections.CollectionsApiLib.Models
{
public class TemenosAccount
{
public int AccountId { get; set; }
public string AccountIdentifier { get; set; }
public string AccountNumber { get; set; }
public string AccountStatus { get; set; }
public int AccountTypeId { get; set; }
public RepoAccountType AccountType { get; set; }
public bool ActiveFlag { get; set; }
public decimal? AmountLastPaid { get; set; }
public decimal? Balance { get; set; }
public bool BankruptcyFlag { get; set; }
public string Branch { get; set; }
public DateTime? DueDate { get; set; }
public DateTime? FirstPaymentDueDate { get; set; }
public string LoanOfficer { get; set; }
public decimal? OriginalLoanAmount { get; set; }
public DateTime? OriginalLoanDate { get; set; }
public decimal? DQAmount { get; set; }
public int? DaysDq { get; set; }
public string Suffix { get; set; }
public string LinkedAccount { get; set; }
public string ProductType { get; set; }
public string ClosedDate { get; set; }
public string DateLastPaid { get; set; }
public string DateFirstDelinquent { get; set; }
public IReadOnlyCollection<TemenosCase> Cases { get; set; }
public Dictionary<string,string> CustomFieldMap { get; set; }
}
}
@@ -0,0 +1,41 @@

using System;
using System.Collections.Generic;
namespace LCU.API.Collections.CollectionsApiLib.Models
{
public class TemenosCase
{
public int CaseId { get; set; }
public string CaseNumber { get; set; }
public string CaseDescription { get; set; }
public int CaseStageId { get; set; }
public RepoStatus RepoStatus { get; set; }
public int CaseStatusId { get; set; }
public string CaseTitle { get; set; }
public int CaseTypeBasisId { get; set; }
public int CaseTypeId { get; set; }
public DateTime? ClosedDate { get; set; }
public DateTime CreatedDate { get; set; }
public int CreatedUserId { get; set; }
public DateTime? CurrentStageDate { get; set; }
public DateTime? CurrentStatusDate { get; set; }
public DateTime? LastReviewDate { get; set; }
public DateTime? NextReviewDate { get; set; }
public DateTime? Stage1CompletionDate { get; set; }
public DateTime? Stage2CompletionDate { get; set; }
public DateTime? Stage3CompletionDate { get; set; }
public DateTime? Stage4CompletionDate { get; set; }
public DateTime? Stage5CompletionDate { get; set; }
public bool TitleOrdered { get; set; }
public DateTime? TitleOrderedDate { get; set; }
public DateTime? RedemptionExpiredDateIl { get; set; }
public DateTime? RedemptionExpiredDateWi { get; set; }
public Dictionary<string,string> CustomFieldMap { get; set; }
public DateTime? DateRepossessed { get; set; }
public string RepoTypeId { get; set; }
public RepoType? RepoType { get; set; }
public DateTime? DateRepoAssigned { get; set; }
public string RepoAgentId { get; set; }
}
}
@@ -0,0 +1,16 @@
using System.Collections.Generic;
namespace LCU.API.Collections.CollectionsApiLib.Models
{
public class TemenosConfiguration
{
public IReadOnlyCollection<LookupItem> Users { get; set; }
public IReadOnlyCollection<LookupItem> RepoAgents { get; set; }
public IReadOnlyCollection<LookupItem> RepoTypes { get; set; }
public IReadOnlyCollection<LookupItem> CaseStages { get; set; }
public IReadOnlyCollection<LookupItem> AccountTypes { get; set; }
public IReadOnlyCollection<LookupItem> CaseTypes { get; set; }
public IReadOnlyCollection<string> AvailableLookups { get; set; }
}
}
@@ -0,0 +1,11 @@
namespace LCU.API.Collections.CollectionsApiLib.Models
{
public class TemenosHistory
{
public string Name { get; set; }
public string Message { get; set; }
public int UserId { get; set; }
public System.DateTime Created { get; set; }
public HistoryType Type { get; set; }
}
}
@@ -0,0 +1,12 @@
{
"profiles": {
"LCU.API.Collections.CollectionsApiLib": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:59394;http://localhost:59395"
}
}
}
@@ -0,0 +1,134 @@
using System;
using LCU.API.Collections.CollectionsApi.Controllers;
using LCU.API.Collections.CollectionsApi.Exceptions;
using LCU.API.Collections.CollectionsApi.Services;
using Microsoft.AspNetCore.Mvc;
using Moq;
using System.Collections.Generic;
using LCU.API.Collections.CollectionsApiLib.Models;
using Xunit;
namespace LCU.API.Collections.CollectionsApiTests.ControllerTests
{
public class AccountControllerTest
{
private Mock<IAccountService> _mockService;
private AccountController _controller;
public AccountControllerTest()
{
_mockService = new Mock<IAccountService>();
_controller = new AccountController(_mockService.Object);
}
[Fact]
public async void Get_Accounts_By_Id_OK()
{
_mockService.Setup(service => service.FindByIdAsync(It.IsAny<int>())).ReturnsAsync(new CollectionsApiLib.Models.TemenosAccount()
{
AccountId = 12345,
AccountIdentifier = "Identifier"
});
//arrange
//act
var result = await _controller.GetAccountByAccountId(12345);
Assert.NotNull(result);
var okResult = result as OkObjectResult;
// assert
Assert.NotNull(okResult);
Assert.Equal(200, okResult.StatusCode);
var resultAccount = okResult.Value as CollectionsApiLib.Models.TemenosAccount;
Assert.NotNull(resultAccount);
}
[Fact]
public async void Get_Accounts_By_AccountNo_OK()
{
//arrange
_mockService.Setup(service => service.ListByAccountNoAsync(It.IsAny<string>())).ReturnsAsync(
new List<CollectionsApiLib.Models.TemenosAccount>(){
new CollectionsApiLib.Models.TemenosAccount()
{
AccountNumber = "54444143",
AccountId = 12345,
AccountIdentifier = "Identifier"
}
});
//act
var result = await _controller.GetAccountByAccountNo("54444143");
Assert.NotNull(result);
var okResult = result as OkObjectResult;
// assert
Assert.NotNull(okResult);
Assert.Equal(200, okResult.StatusCode);
var resultAccount = okResult.Value as List<CollectionsApiLib.Models.TemenosAccount>;
Assert.NotNull(resultAccount);
}
[Fact]
public async void Get_Accounts_By_Id_400()
{
//arrange
_mockService.Setup(service => service.FindByIdAsync(It.IsAny<int>())).Throws(new NotFoundException("Oops"));
//act
var result = await _controller.GetAccountByAccountId(12345);
Assert.NotNull(result);
var NFResult = result as NotFoundObjectResult;
// assert
Assert.NotNull(NFResult);
Assert.Equal(404, NFResult.StatusCode);
}
[Fact]
public async void Get_Accounts_By_Id_500()
{
//arrange
_mockService.Setup(service => service.FindByIdAsync(It.IsAny<int>())).Throws(new System.Exception("Oops"));
//act
var result = await _controller.GetAccountByAccountId(12345);
Assert.NotNull(result);
var result500 = result as StatusCodeResult;
// assert
Assert.NotNull(result500);
Assert.Equal(500, result500.StatusCode);
}
[Fact]
public async void Get_History_By_Id_OK()
{
//arrange
const int accountId = 12345;
_mockService.Setup(service => service.GetHistoryByAccountIdAsync(accountId)).ReturnsAsync(new List<TemenosHistory>()
{
new TemenosHistory()
{
Created = DateTime.Now,
Message = "controllertest",
Type = HistoryType.Workflow,
UserId = 10
}
});
//act
var result = await _controller.GetHistoryByAccountId(accountId);
Assert.NotNull(result);
var okResult = result as OkObjectResult;
// assert
Assert.NotNull(okResult);
Assert.Equal(200, okResult.StatusCode);
var resultAccount = okResult.Value as IReadOnlyCollection<TemenosHistory>;
Assert.NotNull(resultAccount);
}
}
}
@@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.CollectionsApi.Controllers;
using LCU.API.Collections.CollectionsApi.Services;
using LCU.API.Collections.CollectionsApiLib.Models;
using Microsoft.AspNetCore.Mvc;
using Moq;
using Xunit;
namespace LCU.API.Collections.CollectionsApiTests.ControllerTests
{
public class CaseControllerTest
{
private Mock<ICaseService> _mockService;
private CaseController _controller;
public CaseControllerTest()
{
_mockService = new Mock<ICaseService>();
_controller = new CaseController(_mockService.Object);
}
[Fact]
public async void Get_Case_By_CaseID_OK()
{
//arrange
_mockService.Setup(service => service.GetCaseByIdAsync(It.IsAny<int>())).ReturnsAsync(
new CollectionsApiLib.Models.TemenosCase()
{
CaseId = 1234
});
//act
var result = await _controller.GetCaseByCaseId(1234);
Assert.NotNull(result);
var okResult = result as OkObjectResult;
// assert
Assert.NotNull(okResult);
Assert.Equal(200, okResult.StatusCode);
var resultAccount = okResult.Value as CollectionsApiLib.Models.TemenosCase;
Assert.NotNull(resultAccount);
}
[Fact]
public async void Get_Case_By_CaseNo_OK()
{
//arrange
_mockService.Setup(service => service.GetCaseByCaseNoAsync(It.IsAny<string>())).ReturnsAsync(
new CollectionsApiLib.Models.TemenosCase()
{
CaseId = 1234,
CaseNumber = "123123-123"
});
//act
var result = await _controller.GetCaseByCaseNo("123123-123");
Assert.NotNull(result);
var okResult = result as OkObjectResult;
// assert
Assert.NotNull(okResult);
Assert.Equal(200, okResult.StatusCode);
var resultAccount = okResult.Value as CollectionsApiLib.Models.TemenosCase;
Assert.NotNull(resultAccount);
}
[Fact]
public async void Get_History_By_Id_OK()
{
//arrange
const int caseId = 12345;
_mockService.Setup(service => service.GetHistoryByAccountIdAsync(caseId)).ReturnsAsync(new List<TemenosHistory>()
{
new TemenosHistory()
{
Created = DateTime.Now,
Message = "controllertest",
Type = HistoryType.Workflow,
UserId = 10
}
});
//act
var result = await _controller.GetHistoryByCaseId(caseId);
Assert.NotNull(result);
var okResult = result as OkObjectResult;
// assert
Assert.NotNull(okResult);
Assert.Equal(200, okResult.StatusCode);
var resultAccount = okResult.Value as IReadOnlyCollection<TemenosHistory>;
Assert.NotNull(resultAccount);
}
}
}
@@ -0,0 +1,57 @@
using LCU.API.Collections.CollectionsApi.Controllers;
using LCU.API.Collections.CollectionsApi.Services;
using Microsoft.AspNetCore.Mvc;
using Moq;
using Xunit;
namespace LCU.API.Collections.CollectionsApiTests.ControllerTests
{
public class ConfigurationControllerTest
{
private readonly Mock<IConfigurationService> _mockService;
private readonly ConfigurationController _controller;
public ConfigurationControllerTest()
{
_mockService = new Mock<IConfigurationService>();
_controller = new ConfigurationController(_mockService.Object);
}
[Fact]
public async void Get_Configurations_OK()
{
_mockService.Setup(service => service.GetAsync()).ReturnsAsync(new CollectionsApiLib.Models.TemenosConfiguration());
//arrange
//act
var result = await _controller.Get();
Assert.NotNull(result);
var okResult = result as OkObjectResult;
// assert
Assert.NotNull(okResult);
Assert.Equal(200, okResult.StatusCode);
var resultConfig = okResult.Value as CollectionsApiLib.Models.TemenosConfiguration;
Assert.NotNull(resultConfig);
}
[Fact]
public async void Get_Config_500()
{
//arrange
_mockService.Setup(service => service.GetAsync()).Throws(new System.Exception("Oops"));
//act
var result = await _controller.Get();
Assert.NotNull(result);
var result500 = result as StatusCodeResult;
// assert
Assert.NotNull(result500);
Assert.Equal(500, result500.StatusCode);
}
}
}
@@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App" Version="2.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.1" />
<PackageReference Include="Moq" Version="4.11.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LCU.API.Collections.CollectionsApi\LCU.API.Collections.CollectionsApi.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,161 @@
using System;
using System.Collections.Generic;
using Moq;
using Xunit;
using LCU.API.Collections.CollectionsApi.Services;
using LCU.API.Collections.CollectionsApi.Exceptions;
using System.Threading.Tasks;
using LCU.API.Collections.CollectionsApi.Dao;
using LCU.API.Collections.CollectionsApiLib.Models;
using LCU.API.Collections.TemenosApiWrapper.Services;
using LCU.API.Collections.CollectionsApi.Models.TemenosApiWrapper;
namespace LCU.API.Collections.CollectionsApiTests.ServiceTests
{
public class AccountServiceTest
{
private Mock<ITemenosAccountDao> _mockTemenosAccountDao;
private AccountService _accountService;
private Mock<ITemenosApiWrapperService> _mockTemenosApiWrapperService;
public AccountServiceTest()
{
_mockTemenosAccountDao = new Mock<ITemenosAccountDao>();
_mockTemenosApiWrapperService = new Mock<ITemenosApiWrapperService>();
_accountService = new AccountService(_mockTemenosAccountDao.Object, _mockTemenosApiWrapperService.Object);
}
[Fact]
public async void ListByAccountNo_Ok()
{
//setup
_mockTemenosAccountDao.Setup(dao => dao.ListByAccountNoAsync(It.IsAny<string>(), It.IsAny<string>())).ReturnsAsync(
new List<CollectionsApiLib.Models.TemenosAccount>()
{
new CollectionsApiLib.Models.TemenosAccount()
{
AccountId = 1234,
AccountNumber = "123"
}
});
_mockTemenosApiWrapperService.Setup(service => service.AccountSearch(It.IsAny<AccountSearchRequest>())).ReturnsAsync(
new List<AccountSearchResponse>()
{
new AccountSearchResponse()
{
InternalAccountNumber = "232354254425443",
AccountAccountNumber = "123"
}
});
var result = await _accountService.ListByAccountNoAsync("123");
Assert.NotNull(result);
Assert.Single(result);
}
[Fact]
public async void ListByAccountNoTemenosApiWrapperService_Exception()
{
//setup
_mockTemenosApiWrapperService.Setup(service => service.AccountSearch(It.IsAny<AccountSearchRequest>()))
.Throws(new Exception("Oops"));
var exc = await Assert.ThrowsAsync<AggregateException>(() => _accountService.ListByAccountNoAsync("123"));
Assert.NotNull(exc);
}
[Fact]
public async void ListByAccountNo_Exception()
{
//setup
_mockTemenosAccountDao.Setup(dao => dao.ListByAccountNoAsync(It.IsAny<string>(), It.IsAny<string>()))
.Throws(new Exception("Oops"));
var exc = await Assert.ThrowsAsync<Exception>(() => _accountService.ListByAccountNoAsync("123"));
Assert.NotNull(exc);
}
[Fact]
public async void Get_OK()
{
//setup
_mockTemenosAccountDao.Setup(dao => dao.FindByIdAsync(It.IsAny<int>())).ReturnsAsync(
new CollectionsApiLib.Models.TemenosAccount()
{
AccountId = 1234,
AccountNumber = "123"
}
);
var result = await _accountService.FindByIdAsync(123);
Assert.NotNull(result);
Assert.Equal(1234, result.AccountId);
}
[Fact]
public async void Get_Server_Exception()
{
//setup
_mockTemenosAccountDao.Setup(dao => dao.FindByIdAsync(It.IsAny<int>())).ThrowsAsync(new Exception("Oops"));
var result = await Assert.ThrowsAsync<ServerErrorException>(() => _accountService.FindByIdAsync(123));
Assert.NotNull(result);
}
[Fact]
public async void Get_NotFound()
{
//setup
_mockTemenosAccountDao.Setup(dao => dao.FindByIdAsync(It.IsAny<int>()))
.Returns(Task.FromResult<CollectionsApiLib.Models.TemenosAccount>(null));
var result = await Assert.ThrowsAsync<NotFoundException>(() => _accountService.FindByIdAsync(123));
Assert.NotNull(result);
Assert.Equal("Account with id 123 not found.", result.Message);
}
[Fact]
public async void GetHistory_OK()
{
const int accountId = 111;
//setup
_mockTemenosAccountDao.Setup(dao => dao.FindCommentsAsync(accountId)).ReturnsAsync(
new List<TemenosHistory>()
{
new TemenosHistory()
{
Created = DateTime.Now,
Message = "Comment",
Type = HistoryType.Comment,
UserId = 10
}
}
);
_mockTemenosAccountDao.Setup(dao => dao.FindHistoryAsync(accountId)).ReturnsAsync(
new List<TemenosHistory>()
{
new TemenosHistory()
{
Created = DateTime.Now,
Message = "Workflow",
Type = HistoryType.Workflow,
UserId = 10
}
}
);
var result = await _accountService.GetHistoryByAccountIdAsync(accountId);
Assert.NotNull(result);
Assert.Equal(2, result.Count);
}
}
}
@@ -0,0 +1,132 @@
using System;
using System.Collections.Generic;
using Moq;
using Xunit;
using LCU.API.Collections.CollectionsApi.Services;
using LCU.API.Collections.CollectionsApi.Exceptions;
using System.Threading.Tasks;
using LCU.API.Collections.CollectionsApi.Dao;
using LCU.API.Collections.CollectionsApiLib.Models;
namespace LCU.API.Collections.CollectionsApiTests.ServiceTests
{
public class CaseServiceTest
{
private Mock<ITemenosCaseDao> _mockTemenosCaseDao;
private CaseService _caseService;
public CaseServiceTest()
{
_mockTemenosCaseDao = new Mock<ITemenosCaseDao>();
_caseService = new CaseService( _mockTemenosCaseDao.Object);
}
[Fact]
public async void GetCaseByID_OK()
{
//setup
_mockTemenosCaseDao.Setup(dao => dao.FindByIdAsync(It.IsAny<int>())).ReturnsAsync(
new CollectionsApiLib.Models.TemenosCase()
{
CaseId = 1234,
CaseTitle = "Case"
}
);
var result = await _caseService.GetCaseByIdAsync(1234);
Assert.NotNull(result);
Assert.Equal(1234, result.CaseId);
}
[Fact]
public async void GetCaseByID_Server_Exception()
{
//setup
_mockTemenosCaseDao.Setup(dao => dao.FindByIdAsync(It.IsAny<int>())).ThrowsAsync(new Exception("Oops"));
var result = await Assert.ThrowsAsync<ServerErrorException>(() => _caseService.GetCaseByIdAsync(1234));
Assert.NotNull(result);
}
[Fact]
public async void GetCaseByID_NotFound()
{
//setup
_mockTemenosCaseDao.Setup(dao => dao.FindByIdAsync(It.IsAny<int>())).Returns(Task.FromResult<CollectionsApiLib.Models.TemenosCase>(null));
var result = await Assert.ThrowsAsync<NotFoundException>(() => _caseService.GetCaseByIdAsync(123));
Assert.NotNull(result);
Assert.Equal("Case with id 123 not found.", result.Message);
}
[Fact]
public async void GetCaseByNO_OK()
{
//setup
_mockTemenosCaseDao.Setup(dao => dao.FindByCaseNoAsync(It.IsAny<string>())).ReturnsAsync(
new CollectionsApiLib.Models.TemenosCase()
{
CaseId = 1234,
CaseNumber = "12345",
CaseTitle = "Case"
}
);
var result = await _caseService.GetCaseByCaseNoAsync("1234");
Assert.NotNull(result);
Assert.Equal(1234, result.CaseId);
}
[Fact]
public async void GetCaseByNo_Server_Exception()
{
//setup
_mockTemenosCaseDao.Setup(dao => dao.FindByCaseNoAsync(It.IsAny<string>())).ThrowsAsync(new Exception("Oops"));
var result = await Assert.ThrowsAsync<ServerErrorException>(() => _caseService.GetCaseByCaseNoAsync("12345"));
Assert.NotNull(result);
}
[Fact]
public async void GetCaseByNO_NotFound()
{
//setup
_mockTemenosCaseDao.Setup(dao => dao.FindByCaseNoAsync(It.IsAny<string>())).Returns(Task.FromResult<CollectionsApiLib.Models.TemenosCase>(null));
var result = await Assert.ThrowsAsync<NotFoundException>(() => _caseService.GetCaseByCaseNoAsync("1234"));
Assert.NotNull(result);
Assert.Equal("Case with case no 1234 not found.", result.Message);
}
[Fact]
public async void GetHistory_OK()
{
const int caseId = 111;
//setup
_mockTemenosCaseDao.Setup(dao => dao.FindCommentsAsync(caseId)).ReturnsAsync(
new List<TemenosHistory>()
{
new TemenosHistory()
{
Created = DateTime.Now,
Message = "Comment",
Type = HistoryType.Comment,
UserId = 10
}
}
);
var result = await _caseService.GetHistoryByAccountIdAsync(caseId);
Assert.NotNull(result);
Assert.Equal(1, result.Count);
}
}
}
@@ -0,0 +1,44 @@
using System;
using Moq;
using Xunit;
using LCU.API.Collections.CollectionsApi.Services;
using LCU.API.Collections.CollectionsApi.Exceptions;
using LCU.API.Collections.CollectionsApi.Dao;
namespace LCU.API.Collections.CollectionsApiTests.ServiceTests
{
public class ConfigurationServiceTest
{
private Mock<ITemenosConfigurationDao> _mockTemenosConfigurationDao;
private ConfigurationService _configurationService;
public ConfigurationServiceTest()
{
_mockTemenosConfigurationDao = new Mock<ITemenosConfigurationDao>();
_configurationService = new ConfigurationService(_mockTemenosConfigurationDao.Object);
}
[Fact]
public async void Get_OK()
{
//setup
_mockTemenosConfigurationDao.Setup(dao => dao.GetAsync()).ReturnsAsync(
new CollectionsApiLib.Models.TemenosConfiguration()
);
var result = await _configurationService.GetAsync();
Assert.NotNull(result);
}
[Fact]
public async void Get_Server_Exception()
{
//setup
_mockTemenosConfigurationDao.Setup(dao => dao.GetAsync()).ThrowsAsync(new Exception("Oops"));
var result = await Assert.ThrowsAsync<ServerErrorException>(() => _configurationService.GetAsync());
Assert.NotNull(result);
}
}
}
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- additional settings used during the dotnet test execution step in the azure dev ops pipeline -->
<RunSettings>
<DataCollectionRunSettings>
<DataCollectors>
<DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<Configuration>
<CodeCoverage>
<CompanyNames>
<Exclude>
<CompanyName>.*microsoft.*</CompanyName>
</Exclude>
</CompanyNames>
</CodeCoverage>
</Configuration>
</DataCollector>
</DataCollectors>
</DataCollectionRunSettings>
</RunSettings>
@@ -0,0 +1,132 @@
# Landmark Credit Union Collections Api
This readme outlines the developer process, basic coding style guide and provides guidance and details around the technical approach to the user interface. You should always review and update this document to encompass your changes.
# Getting Started
Before you can work with the code, build it, or deploy it you must setup your development environment. The required environment is .NET Core 2.2, Git, and something to work with C#. This environment code has been wrapped up into a Powershell script that should run on any Windows 10 machine and produce a viable development environment to carry you through this guide. The script is available in the root of this directory as `setup-env.ps1`.
You should start by reviewing and possibly running that script if needed.
## Working With The Code
Code is checked out from the Azure DevOps Repository, which is currently [https://landmarkcu.visualstudio.com/Repo/_git/LCU.API.Collections.CollectionsApi].
Work should be done in a branch from Develop. In the shared folder there is a software development process document that talks about this, you should start there. A brief introduction will be included here.
Start by checking out the repository, and specifically the develop branch. You should be branching off of develop
with your own working branch. When you are complete, you will create a pull request within Azure DevOps.
Before submitting your pull request, review the following:
* Did you commit with a commitizen style message? (see below)
* Did you add all needed unit testing, and ensure all existing tests are passing?
* Make sure you didn't accidentally commit and secrets or passwords.
In order to work and submit code, the project will need to be built and run; you will generally do this from Visual Studio.
## Temenos Maintenance
Many fields from Temenos may require periodic maintenance due to changes in the system. Temenos is a "Low Code" or "No Code"
system; which means that the business can customize their workflows, fields, and enumerations themselves. If the business
adds, removes, or changes something that Collections API or Repo Manager depend on; the systems will require an update.
These fall into a couple of categories: Custom Fields, Field Lookups, and Specific fields. Regardless, when changing
the models; remember to bump the version on the API LIB.
Additionally, the API account password can expire. You will start to get security errors when calling the API. Someone has to
log into the LMS portals and update the password. I have started putting the month in the password for reference. Here are
the portal urls:
* Test => https://lms-test-lcu.temenoscloudna.com/LMS/Session/Login.aspx
* Prod => https://lms-lcu.temenoscloudna.com/LMS/Session/Login.aspx
### Connecting to Temenos API
All of the imported WSDLs may need to be re-imported at some point. The list is at the bottom of this file. Upon an import of any Temenos WSDL you'll
need to update the Reference.cs to load the url base from the config. If you have a better way of doing this, switch it over to that. For now
you update the constructor in the reference file and add an additional configuration builder:
```
// Change constructor to use DI
public ConfigurationClient(ITemenosSecurityConfig config) :
base(ConfigurationClient.GetDefaultBinding(), ConfigurationClient.CreateEndpointAddress(config))
{
this.Endpoint.Name = EndpointConfiguration.BasicHttpBinding_IConfiguration.ToString();
ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
}
// Add This.
private static System.ServiceModel.EndpointAddress CreateEndpointAddress(ITemenosSecurityConfig config)
{
return new System.ServiceModel.EndpointAddress(config.GetUrl() + "/Akcelerant.AccountServicing.Service/Configuration.svc");
}
```
### Specific Field Changes
A specific field may become a custom field, or vice versa. You'll need to find the new field and assign it correctly
to the model. If it is a new field you'll need to add it. These changes will be rare.
### Lookup Field Changes
These changes will be the most likely and involve adding a new value or updating an existing. These values have
an ID, LABEL, and VALUE. Generally they also have to be mapped to something in Repo Manager; you'll want to double
check that. For some of these, we periodically reload them - such as Users and Repo Companies. Whenever there is
a change here, it will range from not affecting the application to requiring logic changes. Here are the common ones:
* Repo Status / Case Stage - you'll need to update the app settings file to make sure you are mapping all case stages
to a "repo status" correctly. Work with the business for this.
* Users - should be refreshed automatically
* Repo Companies - you'll need to make sure the Temenos Repo Company mapping in the app settings is correct
* Repo Type - will rarely change, and is a small set, but you will need to update the app settings
### Custom Field Changes
Since custom fields are looked up by their label; if the business changes a label or moves a custom field to
a different parent object you'll need to rework the code. If the field label changes you need to simply update
the matching string; otherwise you'll need to refactor the code if for example a field goes from case level
to account level. You may need to work on Repo API afterwards depending on the change.
### Suggestion for IDE
* Visual Studio 2017
* Visual Studio Code
* IDEA Rider
# Releases
Releases are handled by anyone on the team with access to Azure DevOps. Generally when a pull request is accepted
to develop, that will be automatically built and deployed to QA.
To get to UAT, develop must be merged into the master branch and push. This will automatically cause the main
branch to be built and the resulting release to be pushed to UAT.
To get to production, have the next phase after UAT Release approved. This will automatically cause the
code to be promoted to production.
When creating releases, it's important not to forget to make a release and update the change notes as
needed. There is information on creating a release below.
## List of Temenos WSDLS
https://lms-test-app-lcu.temenoscloudna.com/Akcelerant.Core.Service/Configuration.svc?WSDL
https://lms-test-app-lcu.temenoscloudna.com/Akcelerant.AccountServicing.Service/Person.svc?WSDL
https://lms-test-app-lcu.temenoscloudna.com/Akcelerant.AccountServicing.Service/Configuration.svc?WSDL
https://lms-test-app-lcu.temenoscloudna.com/Akcelerant.AccountServicing.Service/Case.svc?WSDL
https://lms-test-app-lcu.temenoscloudna.com/Akcelerant.AccountServicing.Service/Ticket.svc?WSDL (Fails)
## Known URLs
TEST Instance: https://lms-test-lcu.temenoscloudna.com/
TEST API: https://lms-test-app-lcu.temenoscloudna.com
PROD Instance: https://lms-LCU.temenoscloudna.com/
PROD API: ???
## Recent Temenos Upgrade Notes (5/19/24)
--WSDL refresh was needed for each of the existing Connected Services (TemenosAccount, TemenosCase, TemenosConfuguration, TemenosSecurity)
Url for WSDL refresh: https://lms-app-lcu.temenoscloudna.com/Akcelerant.AccountServicing.Service/Case.svc?WSDL
To refresh right click on Connected Services and choose Manage Connected Services.
You can edit the url and choose to refresh each of these services, follow default screen prompts.
--API Target Framework was updated from netcore 2.2 to 3.1
--Updated necessary nuget packages for dependency
--Temenos Api Wrapper url and AccountSearch endpoint added to obtain the required InternalAccountIdentifier to access the GetAccountIdRequest
--Temenos Api Wrapper Url is pointing to our current production environment: https://api.lcu-internal.com/temenos-api-wrapper
## Temenos Upgrade Notes (6/5/24)
--Added two new required parameters MinDate and MaxDate to the existing GetComments for Temenos Cases
--Removed GetWorkflows data access request for Temonoes Cases as it appears these workflow comments are returning under GetWorkflows for Temenos Accounts
@@ -0,0 +1,63 @@
parameters:
- name: target_environment
displayName: Target Environment
type: string
default: qa
values:
- qa
- uat
- prd
- name: k8s_namespace
displayName: K8s Namespace to deploy to
type: string
default: landmarkcu
values:
- landmarkcu
variables:
- template: ./config-files/${{ parameters.target_environment }}-pvars.yaml
- name: source_branch_name
value: $[replace(replace(variables['Build.SourceBranch'], 'refs/heads/', ''), '/', '-')]
- name: docker_container_repository_name
value: landmarkcu/lcu.api.internal.collections-collections
resources:
repositories:
- repository: azdo_pipeline_templates
type: git
name: Infrastructure Platform/azdo-pipeline-templates
ref: main
stages:
# DOTNET BUILD AND NUGET PUSH
- template: dotnet-nuget-build-push.yaml@azdo_pipeline_templates
parameters:
azdo_agent_pool: $(pvar_azdo_agent_pool_nuget)
azure_artifacts_feed: 'LCU-Internal'
branches_to_push:
- develop
- main
# DOCKER BUILD AND PUSH
- template: docker-build-push.yaml@azdo_pipeline_templates
parameters:
azdo_agent_pool: $(pvar_azdo_agent_pool)
docker_registry_service_connection: $(pvar_docker_registry_service_connection)
docker_container_repository_name: $(docker_container_repository_name)
dockerfile_path: ./Dockerfile
docker_image_tags: |
build-$(Build.BuildId)
$(source_branch_name)
# K8S DEPLOY
- template: k8s-deploy.yaml@azdo_pipeline_templates
parameters:
dependsOn: CI
condition: or(eq(variables['Build.SourceBranchName'], 'develop'), eq(variables['Build.SourceBranchName'], 'main'))
azdo_agent_pool: $(pvar_azdo_agent_pool)
kubectl_version: $(pvar_kubectl_version)
k8s_service_connection: $(pvar_k8s_service_connection)
k8s_namespace: ${{ parameters.k8s_namespace }}
k8s_kustomization_path: ./kustomize/overlays/${{ parameters.target_environment }}
docker_registry_service_connection: $(pvar_docker_registry_service_connection)
docker_image_to_deploy: $(docker_container_repository_name):build-$(Build.BuildId)
@@ -0,0 +1,10 @@
trigger:
branches:
include:
- '*'
exclude:
- 'main'
- 'develop'
extends:
template: azure-k8s-pipeline.yaml
@@ -0,0 +1,9 @@
trigger:
branches:
include:
- 'main'
extends:
template: azure-k8s-pipeline.yaml
parameters:
target_environment: prd
k8s_namespace: landmarkcu
@@ -0,0 +1,9 @@
trigger:
branches:
include:
- 'develop'
extends:
template: azure-k8s-pipeline.yaml
parameters:
target_environment: qa
k8s_namespace: landmarkcu
@@ -0,0 +1,9 @@
trigger:
branches:
include:
- 'main'
extends:
template: azure-k8s-pipeline.yaml
parameters:
target_environment: uat
k8s_namespace: landmarkcu
@@ -0,0 +1,7 @@
---
variables:
pvar_azdo_agent_pool: vmss-sub-df-lcu-apps-prd-lz-uscz
pvar_docker_registry_service_connection: Docker Registry LMCU
pvar_k8s_service_connection: svcon-sub-df-lcu-apps-prd-aks-k8s-uscz
pvar_kubectl_version: 1.25.9
pvar_azdo_agent_pool_nuget: LCUOnPrem
@@ -0,0 +1,7 @@
---
variables:
pvar_azdo_agent_pool: vmss-sub-df-lcu-apps-qa-lz-uscz
pvar_docker_registry_service_connection: Docker Registry LMCU
pvar_k8s_service_connection: svcon-sub-df-lcu-apps-qa-aks-k8s-uscz
pvar_kubectl_version: 1.25.9
pvar_azdo_agent_pool_nuget: LCUOnPrem
@@ -0,0 +1,7 @@
---
variables:
pvar_azdo_agent_pool: vmss-sub-df-lcu-apps-uat-lz-uscz
pvar_docker_registry_service_connection: Docker Registry LMCU
pvar_k8s_service_connection: svcon-sub-df-lcu-apps-uat-aks-k8s-uscz
pvar_kubectl_version: 1.25.9
pvar_azdo_agent_pool_nuget: LCUOnPrem
@@ -0,0 +1,44 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: collections-api
spec:
replicas: 1
selector:
matchLabels:
app: collections-api
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: collections-api
spec:
volumes: []
containers:
- name: collections-api
env: []
volumeMounts: []
image: collections-api
resources:
limits:
memory: "1536Mi"
cpu: "500m"
ports:
- containerPort: 80
livenessProbe:
initialDelaySeconds: 5
periodSeconds: 5
httpGet:
path: /api/status
port: 80
readinessProbe:
initialDelaySeconds: 5
periodSeconds: 5
httpGet:
path: /api/status
port: 80
@@ -0,0 +1,11 @@
---
apiVersion: v1
kind: Service
metadata:
name: collections-api
spec:
selector:
app: collections-api
ports:
- port: 80
targetPort: 80
@@ -0,0 +1,9 @@
resources:
- Deployment.yaml
- Service.yaml
- virtual-service.yaml
- secrets-provider-class.yaml
images:
- name: collections-api
newName: landmarkcu/lcu.api.internal.collections-collections
@@ -0,0 +1,12 @@
---
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: collections-api-csi-key-vault-secrets-provider
spec:
provider: azure
parameters:
usePodIdentity: "false"
useVMManagedIdentity: "true"
tenantId: 63cd1554-2783-4a86-ae50-b9e6c21c9499
@@ -0,0 +1,19 @@
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: collections-api
spec:
hosts: []
gateways:
- istio-system/ingress-gateway
http:
- name: collections-api
match:
- uri:
prefix: /
route:
- destination:
host: collections-api
port:
number: 80
@@ -0,0 +1,10 @@
apiVersion: kustomize.config.k8s.io/v1alpha1
kind: Component
patches:
- target:
kind: Deployment
path: set_secrets_deployment.yaml
- target:
kind: SecretProviderClass
path: set_secrets_provider.yaml
@@ -0,0 +1,33 @@
- op: add
path: /spec/template/spec/volumes/-
value:
name: collections-api-secrets
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: normal-collections-api-csi-key-vault-secrets-provider
- op: add
path: /spec/template/spec/containers/0/volumeMounts/-
value:
name: collections-api-secrets
mountPath: /vault/secrets/collections-api-seq-api-key.json
readOnly: true
subPath: collections-api-seq-api-key
- op: add
path: /spec/template/spec/containers/0/volumeMounts/-
value:
name: collections-api-secrets
mountPath: /vault/secrets/collections-api-temenos-user.json
readOnly: true
subPath: collections-api-temenos-user
- op: add
path: /spec/template/spec/containers/0/volumeMounts/-
value:
name: collections-api-secrets
mountPath: /vault/secrets/collections-api-temenos-password.json
readOnly: true
subPath: collections-api-temenos-password
@@ -0,0 +1,16 @@
- op: add
path: /spec/parameters/objects
value: |
array:
- |
objectName: collections-api-seq-api-key
objectType: secret
objectVersion: ""
- |
objectName: collections-api-temenos-user
objectType: secret
objectVersion: ""
- |
objectName: collections-api-temenos-password
objectType: secret
objectVersion: ""
@@ -0,0 +1,40 @@
apiVersion: kustomize.config.k8s.io/v1alpha1
kind: Component
#Test istio process
namePrefix: normal-
configMapGenerator:
- name: collections-api-appsettings
files:
- appsettings/appsettings.json
generatorOptions:
disableNameSuffixHash: true
patches:
- target:
kind: Deployment
path: set_appsettings_deployment.yaml
replacements:
- source:
kind: Deployment
fieldPath: metadata.name
targets:
- select:
kind: Deployment
fieldPaths:
- spec.selector.matchLabels.app
- spec.template.metadata.labels.app
- spec.template.spec.containers.*.name
- select:
kind: Service
fieldPaths:
- spec.selector.app
- select:
kind: VirtualService
fieldPaths:
- spec.http.*.route.*.destination.host
- spec.http.*.name

Some files were not shown because too many files have changed in this diff Show More