< Summary

Information
Class: LOCKnet.Data.Repositories.CredentialsRepository
Assembly: LOCKnet.Data
File(s): /home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.Data/Repositories/CredentialsRepository.cs
Line coverage
100%
Covered lines: 97
Uncovered lines: 0
Coverable lines: 97
Total lines: 142
Line coverage: 100%
Branch coverage
85%
Covered branches: 36
Total branches: 42
Branch coverage: 85.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
.ctor(...)100%11100%
Add(...)90%1010100%
GetAll()100%22100%
GetById(...)100%22100%
Update(...)90%1010100%
Remove(...)100%11100%
MapRecord(...)77.77%1818100%

File(s)

/home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.Data/Repositories/CredentialsRepository.cs

#LineLine coverage
 1using LOCKnet.Core.DataAbstractions;
 2using Microsoft.Data.Sqlite;
 3
 4namespace LOCKnet.Data.Repositories;
 5
 6/// <summary>
 7/// SQLite-Implementierung von <see cref="ICredentialRepository"/>.
 8/// </summary>
 9public class CredentialsRepository : RepositoryBase, ICredentialRepository
 10{
 11  /// <summary>Initialisiert eine neue Instanz von <see cref="CredentialsRepository"/>.</summary>
 12  /// <param name="connectionString">Der vollständige SQLite-Connection-String.</param>
 14413  public CredentialsRepository(string connectionString) : base(connectionString) { }
 14
 15  /// <summary>Initialisiert eine neue Instanz von <see cref="CredentialsRepository"/>.</summary>
 16  /// <param name="connectionFactory">Factory fuer Storage-spezifische SQLite-Verbindungen.</param>
 18317  public CredentialsRepository(ISqliteConnectionFactory connectionFactory) : base(connectionFactory) { }
 18
 19  #region ICredentialRepository
 20
 21  /// <inheritdoc/>
 22  public void Add(CredentialRecord credential)
 7323  {
 7324    StoredCredentialGuard.ValidateForPersistence(credential);
 25
 7026    using var conn = GetConnection();
 7027    using var cmd = conn.CreateCommand();
 7028    cmd.CommandText = @"
 7029            INSERT INTO Credentials (Title, Username, EncryptedPassword, EncryptedMetadata, CredentialUuid, SecretFormat
 7030            VALUES ($title, $username, $password, $encryptedMetadata, $credentialUuid, $secretFormatVersion, $metadataFo
 31
 7032    cmd.Parameters.AddWithValue("$title", credential.Title);
 7033    cmd.Parameters.AddWithValue("$username", credential.Username ?? "");
 7034    cmd.Parameters.AddWithValue("$password", credential.EncryptedPassword);
 7035    cmd.Parameters.AddWithValue("$encryptedMetadata", (object?)credential.EncryptedMetadata ?? DBNull.Value);
 7036    cmd.Parameters.AddWithValue("$credentialUuid", credential.CredentialUuid);
 7037    cmd.Parameters.AddWithValue("$secretFormatVersion", credential.SecretFormatVersion);
 7038    cmd.Parameters.AddWithValue("$metadataFormatVersion", credential.MetadataFormatVersion);
 7039    cmd.Parameters.AddWithValue("$url", credential.Url ?? "");
 7040    cmd.Parameters.AddWithValue("$notes", credential.Notes ?? "");
 7041    cmd.Parameters.AddWithValue("$iconKey", (object?)credential.IconKey ?? DBNull.Value);
 7042    cmd.Parameters.AddWithValue("$credentialType", (int)credential.CredentialType);
 43
 7044    cmd.ExecuteNonQuery();
 13845  }
 46
 47  /// <inheritdoc/>
 48  public IReadOnlyList<CredentialRecord> GetAll()
 9049  {
 9050    var list = new List<CredentialRecord>();
 9051    using var conn = GetConnection();
 9052    using var cmd = conn.CreateCommand();
 9053    cmd.CommandText = "SELECT Id, Title, Username, EncryptedPassword, EncryptedMetadata, CredentialUuid, SecretFormatVer
 54
 9055    using var reader = cmd.ExecuteReader();
 14656    while (reader.Read())
 5657      list.Add(MapRecord(reader));
 58
 9059    return list;
 9060  }
 61
 62  /// <inheritdoc/>
 63  public CredentialRecord? GetById(int id)
 1064  {
 1065    using var conn = GetConnection();
 1066    using var cmd = conn.CreateCommand();
 1067    cmd.CommandText = "SELECT Id, Title, Username, EncryptedPassword, EncryptedMetadata, CredentialUuid, SecretFormatVer
 1068    cmd.Parameters.AddWithValue("$id", id);
 69
 1070    using var reader = cmd.ExecuteReader();
 1071    return reader.Read() ? MapRecord(reader) : null;
 1072  }
 73
 74  /// <inheritdoc/>
 75  public void Update(CredentialRecord credential)
 676  {
 677    StoredCredentialGuard.ValidateForPersistence(credential);
 78
 579    using var conn = GetConnection();
 580    using var cmd = conn.CreateCommand();
 581    cmd.CommandText = @"
 582            UPDATE Credentials
 583            SET Title = $title,
 584                Username = $username,
 585                EncryptedPassword = $password,
 586                EncryptedMetadata = $encryptedMetadata,
 587                CredentialUuid = $credentialUuid,
 588                SecretFormatVersion = $secretFormatVersion,
 589                MetadataFormatVersion = $metadataFormatVersion,
 590                URL = $url,
 591                Notes = $notes,
 592                IconKey = $iconKey,
 593                CredentialType = $credentialType,
 594                UpdatedAt = CURRENT_TIMESTAMP
 595            WHERE Id = $id;";
 96
 597    cmd.Parameters.AddWithValue("$id", credential.Id);
 598    cmd.Parameters.AddWithValue("$title", credential.Title);
 599    cmd.Parameters.AddWithValue("$username", credential.Username ?? "");
 5100    cmd.Parameters.AddWithValue("$password", credential.EncryptedPassword);
 5101    cmd.Parameters.AddWithValue("$encryptedMetadata", (object?)credential.EncryptedMetadata ?? DBNull.Value);
 5102    cmd.Parameters.AddWithValue("$credentialUuid", credential.CredentialUuid);
 5103    cmd.Parameters.AddWithValue("$secretFormatVersion", credential.SecretFormatVersion);
 5104    cmd.Parameters.AddWithValue("$metadataFormatVersion", credential.MetadataFormatVersion);
 5105    cmd.Parameters.AddWithValue("$url", credential.Url ?? "");
 5106    cmd.Parameters.AddWithValue("$notes", credential.Notes ?? "");
 5107    cmd.Parameters.AddWithValue("$iconKey", (object?)credential.IconKey ?? DBNull.Value);
 5108    cmd.Parameters.AddWithValue("$credentialType", (int)credential.CredentialType);
 109
 5110    cmd.ExecuteNonQuery();
 10111  }
 112
 113  /// <inheritdoc/>
 114  public void Remove(int id)
 4115  {
 4116    using var conn = GetConnection();
 4117    using var cmd = conn.CreateCommand();
 4118    cmd.CommandText = "DELETE FROM Credentials WHERE Id = $id;";
 4119    cmd.Parameters.AddWithValue("$id", id);
 4120    cmd.ExecuteNonQuery();
 8121  }
 122
 123  #endregion
 124
 64125  private static CredentialRecord MapRecord(SqliteDataReader reader) => new()
 64126  {
 64127    Id = reader.GetInt32(0),
 64128    Title = reader.GetString(1),
 64129    Username = reader.IsDBNull(2) ? null : reader.GetString(2),
 64130    EncryptedPassword = (byte[])reader[3],
 64131    EncryptedMetadata = reader.IsDBNull(4) ? [] : (byte[])reader[4],
 64132    CredentialUuid = reader.IsDBNull(5) ? string.Empty : reader.GetString(5),
 64133    SecretFormatVersion = reader.IsDBNull(6) ? CredentialSecretFormatVersion.Legacy : reader.GetInt32(6),
 64134    MetadataFormatVersion = reader.IsDBNull(7) ? CredentialMetadataFormatVersion.Legacy : reader.GetInt32(7),
 64135    Url = reader.IsDBNull(8) ? null : reader.GetString(8),
 64136    Notes = reader.IsDBNull(9) ? null : reader.GetString(9),
 64137    CreatedAt = reader.GetDateTime(10),
 64138    UpdatedAt = reader.GetDateTime(11),
 64139    IconKey = reader.IsDBNull(12) ? null : reader.GetString(12),
 64140    CredentialType = reader.IsDBNull(13) ? CredentialType.Password : (CredentialType)reader.GetInt32(13),
 64141  };
 142}