Skip to content

Commit

Permalink
merged main
Browse files Browse the repository at this point in the history
  • Loading branch information
acn-sbuad committed Jan 30, 2024
2 parents a54cffb + 8864150 commit ff2587f
Show file tree
Hide file tree
Showing 5 changed files with 181 additions and 39 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using Altinn.Notifications.Core.Enums;

namespace Altinn.Notifications.Core.Models.Notification;

/// <summary>
/// Class describing an sns notification and extends the <see cref="INotification{SmsNotificationResultType}"/>
/// </summary>
public class SmsNotification : INotification<SmsNotificationResultType>
{
/// <inheritdoc/>
public Guid Id { get; internal set; }

/// <inheritdoc/>
public Guid OrderId { get; internal set; }

/// <inheritdoc/>
public DateTime RequestedSendTime { get; internal set; }

/// <inheritdoc/>
public NotificationChannel NotificationChannel { get; } = NotificationChannel.Sms;

/// <summary>
/// Get the id of the recipient of the sms notification
/// </summary>
public string? RecipientId { get; internal set; }

/// <summary>
/// Get or sets the mobilenumber of the sms notification
/// </summary>
public string RecipientNumber { get; internal set; } = string.Empty;

/// <inheritdoc/>
public NotificationResult<SmsNotificationResultType> SendResult { get; internal set; } = new(SmsNotificationResultType.New, DateTime.UtcNow);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Altinn.Notifications.Core.Models;
using Altinn.Notifications.Core.Models.Notification;

namespace Altinn.Notifications.Core.Persistence;

Expand All @@ -7,6 +8,11 @@ namespace Altinn.Notifications.Core.Persistence;
/// </summary>
public interface ISmsNotificationRepository
{
/// <summary>
/// Adds a new sms notification to the database
/// </summary>
public Task AddNotification(SmsNotification notification, DateTime expiry);

/// <summary>
/// Retrieves all sms notifications with status 'New'
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
CREATE OR REPLACE PROCEDURE notifications.insertsmsnotification(_orderid uuid,
_alternateid uuid,
_recipientid TEXT,
_mobilenumber TEXT,
_result text,
_resulttime timestamptz,
_expirytime timestamptz
)
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
__orderid BIGINT := (SELECT _id from notifications.orders
where alternateid = _orderid);
BEGIN

INSERT INTO notifications.smsnotifications(_orderid, alternateid, recipientid, mobilenumber, result, resulttime, expirytime)
VALUES (__orderid, _alternateid, _recipientid, _mobilenumber, _result::smsnotificationresulttype, _resulttime, _expirytime);
END;
$BODY$
Original file line number Diff line number Diff line change
@@ -1,60 +1,79 @@
using Altinn.Notifications.Core.Enums;
using Altinn.Notifications.Core.Models;
using Altinn.Notifications.Core.Models.Notification;
using Altinn.Notifications.Core.Persistence;
using Altinn.Notifications.Persistence.Extensions;

using Microsoft.ApplicationInsights;

using Npgsql;
using NpgsqlTypes;

namespace Altinn.Notifications.Persistence.Repository;

namespace Altinn.Notifications.Persistence.Repository
/// <summary>
/// Implementation of sms repository logic
/// </summary>
public class SmsNotificationRepository : ISmsNotificationRepository
{
private readonly NpgsqlDataSource _dataSource;
private readonly TelemetryClient? _telemetryClient;

private const string _insertSmsNotificationSql = "call notifications.insertsmsnotification($1, $2, $3, $4, $5, $6, $7)"; // (__orderid, _alternateid, _recipientid, _mobilenumber, _result, _resulttime, _expirytime)
private const string _getSmsNotificationsSql = "select * from notifications.getsms_statusnew_updatestatus()";

/// <summary>
/// Implementation of sms notification repository logic
/// Initializes a new instance of the <see cref="SmsNotificationRepository"/> class.
/// </summary>
public class SmsNotificationRepository : ISmsNotificationRepository
/// <param name="dataSource">The npgsql data source.</param>
/// <param name="telemetryClient">Telemetry client</param>
public SmsNotificationRepository(NpgsqlDataSource dataSource, TelemetryClient? telemetryClient = null)
{
private readonly NpgsqlDataSource _dataSource;
private readonly TelemetryClient? _telemetryClient;
_dataSource = dataSource;
_telemetryClient = telemetryClient;
}

private const string _getSmsNotificationsSql = "select * from notifications.getsms_statusnew_updatestatus()";
/// <inheritdoc/>
public async Task AddNotification(SmsNotification notification, DateTime expiry)
{
await using NpgsqlCommand pgcom = _dataSource.CreateCommand(_insertSmsNotificationSql);
using TelemetryTracker tracker = new(_telemetryClient, pgcom);

/// <summary>
/// Initializes a new instance of the <see cref="SmsNotificationRepository"/> class.
/// </summary>
/// <param name="dataSource">The npgsql data source.</param>
/// <param name="telemetryClient">Telemetry client</param>
public SmsNotificationRepository(NpgsqlDataSource dataSource, TelemetryClient? telemetryClient = null)
{
_dataSource = dataSource;
_telemetryClient = telemetryClient;
}
pgcom.Parameters.AddWithValue(NpgsqlDbType.Uuid, notification.OrderId);
pgcom.Parameters.AddWithValue(NpgsqlDbType.Uuid, notification.Id);
pgcom.Parameters.AddWithValue(NpgsqlDbType.Text, notification.RecipientId ?? (object)DBNull.Value);
pgcom.Parameters.AddWithValue(NpgsqlDbType.Text, notification.RecipientNumber);
pgcom.Parameters.AddWithValue(NpgsqlDbType.Text, notification.SendResult.Result.ToString());
pgcom.Parameters.AddWithValue(NpgsqlDbType.TimestampTz, notification.SendResult.ResultTime);
pgcom.Parameters.AddWithValue(NpgsqlDbType.TimestampTz, expiry);

/// <inheritdoc/>
public async Task<List<Sms>> GetNewNotifications()
{
List<Sms> searchResult = new();
await using NpgsqlCommand pgcom = _dataSource.CreateCommand(_getSmsNotificationsSql);
using TelemetryTracker tracker = new(_telemetryClient, pgcom);
await pgcom.ExecuteNonQueryAsync();
tracker.Track();
}

/// <inheritdoc/>
public async Task<List<Sms>> GetNewNotifications()
{
List<Sms> searchResult = new();
await using NpgsqlCommand pgcom = _dataSource.CreateCommand(_getSmsNotificationsSql);
using TelemetryTracker tracker = new(_telemetryClient, pgcom);

await using (NpgsqlDataReader reader = await pgcom.ExecuteReaderAsync())
await using (NpgsqlDataReader reader = await pgcom.ExecuteReaderAsync())
{
while (await reader.ReadAsync())
{
while (await reader.ReadAsync())
{
EmailContentType emailContentType = (EmailContentType)Enum.Parse(typeof(EmailContentType), reader.GetValue<string>("contenttype"));

var sms = new Sms(
reader.GetValue<Guid>("alternateid"),
reader.GetValue<string>("sendernumber"),
reader.GetValue<string>("mobilenumber"),
reader.GetValue<string>("body"));

searchResult.Add(sms);
}
}
EmailContentType emailContentType = (EmailContentType)Enum.Parse(typeof(EmailContentType), reader.GetValue<string>("contenttype"));

var sms = new Sms(
reader.GetValue<Guid>("alternateid"),
reader.GetValue<string>("sendernumber"),
reader.GetValue<string>("mobilenumber"),
reader.GetValue<string>("body"));

tracker.Track();
return searchResult;
searchResult.Add(sms);
}
}

tracker.Track();
return searchResult;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
using Altinn.Notifications.Core.Enums;
using Altinn.Notifications.Core.Models.Notification;
using Altinn.Notifications.Core.Models.Orders;
using Altinn.Notifications.Core.Persistence;
using Altinn.Notifications.IntegrationTests.Utils;
using Altinn.Notifications.Persistence.Repository;
using Xunit;

namespace Altinn.Notifications.IntegrationTests.Notifications.Persistence;

public class SmsRepositoryTests : IAsyncLifetime
{
private List<Guid> orderIdsToDelete;

public SmsRepositoryTests()
{
orderIdsToDelete = [];
}

public async Task InitializeAsync()
{
await Task.CompletedTask;
}

public async Task DisposeAsync()
{
string deleteSql = $@"DELETE from notifications.orders o where o.alternateid in ('{string.Join("','", orderIdsToDelete)}')";
await PostgreUtil.RunSql(deleteSql);
}

[Fact]
public async Task Create_SmsNotification()
{
// Arrange
Guid orderId = await PostgreUtil.PopulateDBWithOrderAndReturnId();
orderIdsToDelete.Add(orderId);

// Arrange
SmsNotificationRepository repo = (SmsNotificationRepository)ServiceUtil
.GetServices(new List<Type>() { typeof(ISmsNotificationRepository) })
.First(i => i.GetType() == typeof(SmsNotificationRepository));

Guid notificationId = Guid.NewGuid();
SmsNotification smsNotification = new()
{
Id = notificationId,
OrderId = orderId,
RequestedSendTime = DateTime.UtcNow,
RecipientId = "12345678",
RecipientNumber = "999999999",
};

await repo.AddNotification(smsNotification, DateTime.UtcNow);

// Assert
string sql = $@"SELECT count(1)
FROM notifications.smsnotifications o
WHERE o.alternateid = '{notificationId}'";

int actualCount = await PostgreUtil.RunSqlReturnOutput<int>(sql);

Assert.Equal(1, actualCount);
}
}

0 comments on commit ff2587f

Please sign in to comment.