diff --git a/Api.LinkShortener/Api.LinkShortener/Api.Domain/DatabaseService/IDatabaseService.cs b/Api.LinkShortener/Api.LinkShortener/Api.Domain/DatabaseService/IDatabaseService.cs index e390379..6c3b935 100644 --- a/Api.LinkShortener/Api.LinkShortener/Api.Domain/DatabaseService/IDatabaseService.cs +++ b/Api.LinkShortener/Api.LinkShortener/Api.Domain/DatabaseService/IDatabaseService.cs @@ -1,10 +1,12 @@ using Api.Domain.DatabaseService.Models; +using System.Threading.Tasks; namespace Api.Domain.DatabaseService { public interface IDatabaseService { + string GetFullUrl(long id); int GetLinksCount(); - void WriteLinkInformation(ShortLink link); + Task WriteLinkInformationAsync(ShortLink link); } } \ No newline at end of file diff --git a/Api.LinkShortener/Api.LinkShortener/Api.Domain/DatabaseService/Queries.cs b/Api.LinkShortener/Api.LinkShortener/Api.Domain/DatabaseService/Queries.cs index cab18ff..fcc7a9e 100644 --- a/Api.LinkShortener/Api.LinkShortener/Api.Domain/DatabaseService/Queries.cs +++ b/Api.LinkShortener/Api.LinkShortener/Api.Domain/DatabaseService/Queries.cs @@ -14,8 +14,11 @@ createdDate DATETIME public static string InsertLink = @"INSERT INTO Links (ID, Url, ShortUrl, CreatedDate) - (@Id, @Url, @ShortUrl, date('now'));"; + VALUES (@Id, @Url, @ShortUrl, date('now'));"; public static string RecordsCount = "SELECT COUNT(*) FROM Links;"; + + public static string GetFullLink = + @"SELECT Url FROM Links WHERE Id = @Id;"; } } \ No newline at end of file diff --git a/Api.LinkShortener/Api.LinkShortener/Api.Domain/DatabaseService/SqLiteService.cs b/Api.LinkShortener/Api.LinkShortener/Api.Domain/DatabaseService/SqLiteService.cs index 2aff96a..c500712 100644 --- a/Api.LinkShortener/Api.LinkShortener/Api.Domain/DatabaseService/SqLiteService.cs +++ b/Api.LinkShortener/Api.LinkShortener/Api.Domain/DatabaseService/SqLiteService.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Threading.Tasks; using Api.Domain.DatabaseService.Models; using Dapper; using Microsoft.Data.Sqlite; @@ -13,23 +14,23 @@ public class SqLiteService : IDatabaseService public SqLiteService(IConfiguration configuration) { _configuration = configuration; - + var connectionString = _configuration.GetConnectionString("DefaultConnection"); _connection = new SqliteConnection(connectionString); - + var database = _configuration.GetSection("AppSettings")["DatabaseName"]; if (!File.Exists(database)) { CreateDatabase(); } } - - public void WriteLinkInformation(ShortLink link) + + public async Task WriteLinkInformationAsync(ShortLink link) { using (_connection) { - _connection.ExecuteAsync(Queries.InsertLink, link); - + await _connection.ExecuteAsync(Queries.InsertLink, link); + } } @@ -42,6 +43,15 @@ public int GetLinksCount() } } + public string GetFullUrl(long id) + { + using (_connection) + { + return _connection.ExecuteScalar(Queries.GetFullLink, new { Id = id }); + + } + } + private void CreateDatabase() { using (_connection) diff --git a/Api.LinkShortener/Api.LinkShortener/Api.Domain/LinkShortener/ILinkShortener.cs b/Api.LinkShortener/Api.LinkShortener/Api.Domain/LinkShortener/ILinkShortener.cs index bbfb54f..df7f1c1 100644 --- a/Api.LinkShortener/Api.LinkShortener/Api.Domain/LinkShortener/ILinkShortener.cs +++ b/Api.LinkShortener/Api.LinkShortener/Api.Domain/LinkShortener/ILinkShortener.cs @@ -1,7 +1,10 @@ -namespace Api.Domain.LinkShortener +using System.Threading.Tasks; + +namespace Api.Domain.LinkShortener { public interface ILinkShortener { - string ShortenLink(string url); + string GetFullUrl(string shortUrl); + Task ShortenLink(string url); } } \ No newline at end of file diff --git a/Api.LinkShortener/Api.LinkShortener/Api.Domain/LinkShortener/LinkShortenerService.cs b/Api.LinkShortener/Api.LinkShortener/Api.Domain/LinkShortener/LinkShortenerService.cs index 4c1bc1b..9495279 100644 --- a/Api.LinkShortener/Api.LinkShortener/Api.Domain/LinkShortener/LinkShortenerService.cs +++ b/Api.LinkShortener/Api.LinkShortener/Api.Domain/LinkShortener/LinkShortenerService.cs @@ -2,6 +2,7 @@ using Api.Domain.DatabaseService.Models; using Api.Domain.UrlHasher; using System; +using System.Threading.Tasks; namespace Api.Domain.LinkShortener { @@ -15,7 +16,7 @@ public LinkShortenerService(IDatabaseService database, IUrlBaseEncoder encoder) _encoder = encoder; } - public string ShortenLink(string url) + public async Task ShortenLink(string url) { var linksCount = _database.GetLinksCount(); var id = linksCount + 1; @@ -28,9 +29,18 @@ public string ShortenLink(string url) CreatedDate = DateTime.UtcNow }; - _database.WriteLinkInformation(shorUrl); + await _database.WriteLinkInformationAsync(shorUrl); return encodedCount; } + + public string GetFullUrl(string shortUrl) + { + var decodedId = _encoder.DecodeUrl(shortUrl); + + var fullUrl = _database.GetFullUrl(decodedId); + + return fullUrl; + } } } \ No newline at end of file diff --git a/Api.LinkShortener/Api.LinkShortener/Api.LinkShortener/Controllers/UrlShortenerController.cs b/Api.LinkShortener/Api.LinkShortener/Api.LinkShortener/Controllers/UrlShortenerController.cs index ce39602..412bef3 100644 --- a/Api.LinkShortener/Api.LinkShortener/Api.LinkShortener/Controllers/UrlShortenerController.cs +++ b/Api.LinkShortener/Api.LinkShortener/Api.LinkShortener/Controllers/UrlShortenerController.cs @@ -19,12 +19,20 @@ public UrlShortenerController(ILinkShortener linkShortener) } // POST api/urlShortener [HttpPost] - public string ShortenUrl([FromBody] UrlData url) + public async Task ShortenUrl([FromBody] UrlData url) { - var shortUrl = _linkShortener.ShortenLink(url.Url); + var shortUrl = await _linkShortener.ShortenLink(url.Url); return shortUrl; } + [HttpGet] + [Route("{shortUrl}")] + public string GetFullUrl(string shortUrl) + { + var fullUrl = _linkShortener.GetFullUrl(shortUrl); + return fullUrl; + } + public class UrlData { public string Url { get; set; } diff --git a/Api.LinkShortener/Api.LinkShortener/Api.LinkShortener/database.sqlite b/Api.LinkShortener/Api.LinkShortener/Api.LinkShortener/database.sqlite index cda6f98..d3e8310 100644 Binary files a/Api.LinkShortener/Api.LinkShortener/Api.LinkShortener/database.sqlite and b/Api.LinkShortener/Api.LinkShortener/Api.LinkShortener/database.sqlite differ