namespace LaaProduction.Personalization.Repositories { using LaaPackages.SqlClient; using LaaProduction.Personalization.Models; using LaaProduction.Personalization.Repositories.Interfaces; using System; using System.Collections.Generic; public class SoftwareRepository : ISoftwareRepository { private readonly SqlConnection sqlConnection; public SoftwareRepository(SqlConnection sqlConnection) => this.sqlConnection = sqlConnection; public void AddVersion(Int16 softwareId, String assemblyName, Int32 majorV, Int32 minorV, Int32 buildV, DateTime validUntil, String description) => this.sqlConnection .CreateCommand($@" INSERT INTO [VersionSoftwareAccess] ( [AppID] , [SoftwareAccess_Program] , [SoftwareAccess_MajorVersion] , [SoftwareAccess_MinorVersion] , [SoftwareAccess_BuildVersion] , [SoftwareAccess_VaildTo] , [SoftwareAccess_Desc]) VALUES (@{nameof(softwareId)} , @{nameof(assemblyName)} , @{nameof(majorV)} , @{nameof(minorV)} , @{nameof(buildV)} , @{nameof(validUntil)} , @{nameof(description)})") .SetParameter(nameof(softwareId), softwareId) .SetParameter(nameof(assemblyName), assemblyName) .SetParameter(nameof(majorV), majorV) .SetParameter(nameof(minorV), minorV) .SetParameter(nameof(buildV), buildV) .SetParameter(nameof(validUntil), validUntil) .SetParameter(nameof(description), description) .ExecuteNonQuery(); public Int16 AppId(String software) => this.sqlConnection .CreateCommand($@" SELECT [AppID] FROM [VersionSoftwareAccess] WHERE [SoftwareAccess_Program] = @{nameof(software)}") .SetParameter(nameof(software), software) .FirstOrDefault(x => x.GetValue(0)); public void Delete(Int32 versionId) => this.sqlConnection .CreateCommand($@" DELETE FROM [VersionSoftwareAccess] WHERE [SoftwareAccess_ID] = @{nameof(versionId)}") .SetParameter(nameof(versionId), versionId) .ExecuteNonQuery(); public SoftwareDetails Details(Int32 versionId) => this.sqlConnection .CreateCommand($@" SELECT [AppID] , [SoftwareAccess_Program] , [SoftwareAccess_MajorVersion] , [SoftwareAccess_MinorVersion] , [SoftwareAccess_BuildVersion] , [SoftwareAccess_ID] , [SoftwareAccess_VaildTo] , [SoftwareAccess_Desc] FROM [VersionSoftwareAccess] WHERE [SoftwareAccess_ID] = @{nameof(versionId)}") .SetParameter(nameof(versionId), versionId) .FirstOrDefault(x => new SoftwareDetails { SoftwareId = x.GetValue(0), AssemblyName = x.GetValue(1), VersionNr = $"{x.GetValue(2)}.{x.GetValue(3)}.{x.GetValue(4)}", VersionId = x.GetValue(5), ValidUntil = $"{x.GetValue(6):yyyy-MM-dd}", Description = x.GetValue(7), }); public void EditVersion(Int32 versionId, DateTime? validUntil, String description) => this.sqlConnection .CreateCommand($@" UPDATE [VersionSoftwareAccess] SET [SoftwareAccess_VaildTo] = @{nameof(validUntil)} , [SoftwareAccess_Desc] = @{nameof(description)} WHERE [SoftwareAccess_ID] = @{nameof(versionId)}") .SetParameter(nameof(versionId), versionId) .SetParameter(nameof(validUntil), validUntil) .SetParameter(nameof(description), description) .ExecuteNonQuery(); public IEnumerable Functions(Int16 softwareId) => this.sqlConnection .CreateCommand($@" SELECT [AppId] , [Id] , [Function] FROM [SoftwareFunctions] WHERE [AppId] = @{nameof(softwareId)}") .SetParameter(nameof(softwareId), softwareId) .ExecuteReader(x => new SoftwareFunction { SoftwareId = x.GetValue(0), FunctionId = x.GetValue(1), Function = x.GetValue(2) }); public IEnumerable GetSoftwareFunctions(String token) => this.sqlConnection .CreateCommand($@" SELECT [SF].[Function] FROM [MitarbeiterTokens] AS [MT] JOIN [SoftwareFunctions] AS [SF] ON [SF].[AppId] = [MT].[AppId] WHERE [MT].[Token] = @{nameof(token)}") .SetParameter(nameof(token), token) .ExecuteReader(x => x.GetValue(0)); public Int16 Insert(String assembly, Int32 major, Int32 minor, Int32 build) => this.sqlConnection .CreateCommand($@" INSERT INTO [VersionSoftwareAccess] ( [SoftwareAccess_Program] , [SoftwareAccess_MajorVersion] , [SoftwareAccess_MinorVersion] , [SoftwareAccess_BuildVersion] , [SoftwareAccess_VaildTo] , [SoftwareAccess_Desc] , [AppID]) OUTPUT [inserted].[AppId] VALUES (@{nameof(assembly)} , @{nameof(major)} , @{nameof(minor)} , @{nameof(build)} , GETDATE() , 'Automatically created on first use.' , (SELECT MAX([AppId]) + 1 FROM [VersionSoftwareAccess]))") .SetParameter(nameof(assembly), assembly) .SetParameter(nameof(major), major) .SetParameter(nameof(minor), minor) .SetParameter(nameof(build), build) .ExecuteScalar(x => x.GetValue(0)); public IEnumerable List() => this.sqlConnection .CreateCommand($@" SELECT [Software].[SoftwareId] , [Software].[AssemblyName] , [Software].[MajorV] , [Software].[MinorV] , [Software].[Build] , [Software].[VersionId] , [Software].[ValidUntil] , [Software].[Description] FROM (SELECT [AppID] AS [SoftwareId] , [SoftwareAccess_Program] AS [AssemblyName] , [SoftwareAccess_MajorVersion] AS [MajorV] , [SoftwareAccess_MinorVersion] AS [MinorV] , [SoftwareAccess_BuildVersion] AS [Build] , [SoftwareAccess_ID] AS [VersionId] , [SoftwareAccess_VaildTo] AS [ValidUntil] , [SoftwareAccess_Desc] AS [Description] , ROW_NUMBER() OVER (PARTITION BY [AppID] ORDER BY [SoftwareAccess_VaildTo] DESC) AS [RowNumber] FROM [VersionSoftwareAccess]) AS [Software] WHERE [Software].[RowNumber] <= 1 ORDER BY [Software].[AssemblyName]") .ExecuteReader(x => new SoftwareItem { SoftwareId = x.GetValue(0), AssemblyName = x.GetValue(1), CurrentVersion = $"{x.GetValue(2)}.{x.GetValue(3)}.{x.GetValue(4)}", VersionId = x.GetValue(5), ValidUntil = $"{x.GetValue(6):yyyy-MM-dd}", Description = x.GetValue(7), }); public Int16 SoftwareId(String assembly) => this.sqlConnection .CreateCommand($@" SELECT [AppId] FROM [VersionSoftwareAccess] WHERE [SoftwareAccess_Program] = @{nameof(assembly)}") .SetParameter(nameof(assembly), assembly) .FirstOrDefault(x => x.GetValue(0)); public IEnumerable Versions(Int16 softwareId) => this.sqlConnection .CreateCommand($@" SELECT [AppId] , [SoftwareAccess_Program] , [SoftwareAccess_ID] , [SoftwareAccess_MajorVersion] , [SoftwareAccess_MinorVersion] , [SoftwareAccess_BuildVersion] , [SoftwareAccess_VaildTo] , [SoftwareAccess_Desc] FROM [VersionSoftwareAccess] WHERE [AppId] = @{nameof(softwareId)}") .SetParameter(nameof(softwareId), softwareId) .ExecuteReader(x => new SoftwareVersion { SoftwareId = x.GetValue(0), AssemblyName = x.GetValue(1), VersionId = x.GetValue(2), VersionNr = $"{x.GetValue(3)}.{x.GetValue(4)}.{x.GetValue(5)}", ValidUntil = $"{x.GetValue(6):yyyy-MM-dd}", Description = x.GetValue(7), }); } }