aboutsummaryrefslogtreecommitdiffstats
path: root/code
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2022-11-14 04:37:56 +0100
committerivarlovlie <git@ivarlovlie.no>2022-11-14 04:37:56 +0100
commit11be5df857a74fa8ee1c9dcb661a293ed9f09536 (patch)
treee32055c5e2770234193ef7d4e82306746c31f78e /code
parent47004bfcf8ef72556d8227bbce7dd5c06dc73040 (diff)
downloadgreatoffice-11be5df857a74fa8ee1c9dcb661a293ed9f09536.tar.xz
greatoffice-11be5df857a74fa8ee1c9dcb661a293ed9f09536.zip
feat: Remove old time tracker models, routes and entities
Diffstat (limited to 'code')
-rw-r--r--code/api/src/Data/Database/Time/TimeCategory.cs32
-rw-r--r--code/api/src/Data/Database/Time/TimeEntry.cs46
-rw-r--r--code/api/src/Data/Database/Time/TimeLabel.cs32
-rw-r--r--code/api/src/Data/Enums/TimeEntryQueryDuration.cs37
-rw-r--r--code/api/src/Endpoints/Internal/Account/DeleteAccountRoute.cs8
-rw-r--r--code/api/src/Endpoints/Internal/Account/GetArchiveRoute.cs61
-rw-r--r--code/api/src/Endpoints/Internal/Account/UserArchiveDto.cs131
-rw-r--r--code/api/src/Endpoints/V1/Categories/CreateCategoryRoute.cs44
-rw-r--r--code/api/src/Endpoints/V1/Categories/DeleteCategoryRoute.cs38
-rw-r--r--code/api/src/Endpoints/V1/Categories/GetCategoriesRoute.cs33
-rw-r--r--code/api/src/Endpoints/V1/Categories/UpdateCategoryRoute.cs39
-rw-r--r--code/api/src/Endpoints/V1/Entries/CreateEntryRoute.cs67
-rw-r--r--code/api/src/Endpoints/V1/Entries/DeleteEntryRoute.cs33
-rw-r--r--code/api/src/Endpoints/V1/Entries/EntryQueryPayload.cs60
-rw-r--r--code/api/src/Endpoints/V1/Entries/EntryQueryResponse.cs37
-rw-r--r--code/api/src/Endpoints/V1/Entries/EntryQueryRoute.cs186
-rw-r--r--code/api/src/Endpoints/V1/Entries/GetEntryRoute.cs34
-rw-r--r--code/api/src/Endpoints/V1/Entries/TimeQueryDto.cs34
-rw-r--r--code/api/src/Endpoints/V1/Entries/UpdateEntryRoute.cs66
-rw-r--r--code/api/src/Endpoints/V1/Labels/CreateLabelRoute.cs44
-rw-r--r--code/api/src/Endpoints/V1/Labels/DeleteLabelRoute.cs32
-rw-r--r--code/api/src/Endpoints/V1/Labels/GetLabelRoute.cs31
-rw-r--r--code/api/src/Endpoints/V1/Labels/UpdateLabelRoute.cs36
23 files changed, 0 insertions, 1161 deletions
diff --git a/code/api/src/Data/Database/Time/TimeCategory.cs b/code/api/src/Data/Database/Time/TimeCategory.cs
deleted file mode 100644
index c3f013d..0000000
--- a/code/api/src/Data/Database/Time/TimeCategory.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-namespace IOL.GreatOffice.Api.Data.Database;
-
-public class TimeCategory : BaseWithOwner
-{
- public TimeCategory() { }
-
- public TimeCategory(LoggedInUserModel loggedInUserModel) : base(loggedInUserModel) { }
- public string Name { get; set; }
- public string Color { get; set; }
- public TimeCategoryDto AsDto => new(this);
-
- public class TimeCategoryDto
- {
- public TimeCategoryDto() { }
-
- public TimeCategoryDto(TimeCategory sourceEntry = default) {
- if (sourceEntry == default) {
- return;
- }
-
- Id = sourceEntry.Id;
- ModifiedAt = sourceEntry.ModifiedAt;
- Name = sourceEntry.Name;
- Color = sourceEntry.Color;
- }
-
- public Guid Id { get; set; }
- public DateTime? ModifiedAt { get; set; }
- public string Name { get; set; }
- public string Color { get; set; }
- }
-} \ No newline at end of file
diff --git a/code/api/src/Data/Database/Time/TimeEntry.cs b/code/api/src/Data/Database/Time/TimeEntry.cs
deleted file mode 100644
index 0405df2..0000000
--- a/code/api/src/Data/Database/Time/TimeEntry.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-namespace IOL.GreatOffice.Api.Data.Database;
-
-public class TimeEntry : BaseWithOwner
-{
- public TimeEntry() { }
-
- public TimeEntry(LoggedInUserModel loggedInUserModel) : base(loggedInUserModel) { }
- public DateTime Start { get; set; }
- public DateTime Stop { get; set; }
- public string Description { get; set; }
- public ICollection<TimeLabel> Labels { get; set; }
- public TimeCategory Category { get; set; }
- public TimeEntryDto AsDto => new(this);
-
- public class TimeEntryDto
- {
- public TimeEntryDto() { }
-
- public TimeEntryDto(TimeEntry sourceEntry = default) {
- if (sourceEntry == default) {
- return;
- }
-
- Id = sourceEntry.Id;
- ModifiedAt = sourceEntry.ModifiedAt;
- Stop = sourceEntry.Stop;
- Start = sourceEntry.Start;
- Description = sourceEntry.Description;
- if (sourceEntry.Labels != default) {
- Labels = sourceEntry.Labels
- .Select(t => t.AsDto)
- .ToList();
- }
-
- Category = sourceEntry.Category.AsDto;
- }
-
- public Guid? Id { get; set; }
- public DateTime? ModifiedAt { get; set; }
- public DateTime Start { get; set; }
- public DateTime Stop { get; set; }
- public string Description { get; set; }
- public List<TimeLabel.TimeLabelDto> Labels { get; set; }
- public TimeCategory.TimeCategoryDto Category { get; set; }
- }
-} \ No newline at end of file
diff --git a/code/api/src/Data/Database/Time/TimeLabel.cs b/code/api/src/Data/Database/Time/TimeLabel.cs
deleted file mode 100644
index 365161c..0000000
--- a/code/api/src/Data/Database/Time/TimeLabel.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-namespace IOL.GreatOffice.Api.Data.Database;
-
-public class TimeLabel : BaseWithOwner
-{
- public TimeLabel() { }
-
- public TimeLabel(LoggedInUserModel loggedInUserModel) : base(loggedInUserModel) { }
- public string Name { get; set; }
- public string Color { get; set; }
-
- [NotMapped]
- public TimeLabelDto AsDto => new(this);
-
- public class TimeLabelDto
- {
- public TimeLabelDto() { }
-
- public TimeLabelDto(TimeLabel sourceEntry) {
- Id = sourceEntry.Id;
- CreatedAt = sourceEntry.CreatedAt;
- ModifiedAt = sourceEntry.ModifiedAt;
- Name = sourceEntry.Name;
- Color = sourceEntry.Color;
- }
-
- public Guid Id { get; set; }
- public DateTime CreatedAt { get; set; }
- public DateTime? ModifiedAt { get; set; }
- public string Name { get; set; }
- public string Color { get; set; }
- }
-} \ No newline at end of file
diff --git a/code/api/src/Data/Enums/TimeEntryQueryDuration.cs b/code/api/src/Data/Enums/TimeEntryQueryDuration.cs
deleted file mode 100644
index af70ca6..0000000
--- a/code/api/src/Data/Enums/TimeEntryQueryDuration.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-namespace IOL.GreatOffice.Api.Data.Enums;
-
-/// <summary>
-/// Specify a duration filter for time entry queries.
-/// </summary>
-public enum TimeEntryQueryDuration
-{
- /// <summary>
- /// Only query entries created today.
- /// </summary>
- TODAY = 0,
-
- /// <summary>
- /// Only query entries created this week.
- /// </summary>
- THIS_WEEK = 1,
-
- /// <summary>
- /// Only query entries created this month.
- /// </summary>
- THIS_MONTH = 2,
-
- /// <summary>
- /// Only query entries created this year.
- /// </summary>
- THIS_YEAR = 3,
-
- /// <summary>
- /// Only query entries created at a spesific date.
- /// </summary>
- SPECIFIC_DATE = 4,
-
- /// <summary>
- /// Only query entries created between two dates.
- /// </summary>
- DATE_RANGE = 5,
-}
diff --git a/code/api/src/Endpoints/Internal/Account/DeleteAccountRoute.cs b/code/api/src/Endpoints/Internal/Account/DeleteAccountRoute.cs
index 5df1fb6..e5bbb10 100644
--- a/code/api/src/Endpoints/Internal/Account/DeleteAccountRoute.cs
+++ b/code/api/src/Endpoints/Internal/Account/DeleteAccountRoute.cs
@@ -28,17 +28,9 @@ public class DeleteAccountRoute : RouteBaseAsync.WithoutRequest.WithActionResult
return Ok();
}
- var githubMappings = _database.TimeCategories.Where(c => c.UserId == user.Id);
var passwordResets = _database.ForgotPasswordRequests.Where(c => c.UserId == user.Id);
- var entries = _database.TimeEntries.Where(c => c.UserId == user.Id);
- var labels = _database.TimeLabels.Where(c => c.UserId == user.Id);
- var categories = _database.TimeCategories.Where(c => c.UserId == user.Id);
- _database.TimeCategories.RemoveRange(githubMappings);
_database.ForgotPasswordRequests.RemoveRange(passwordResets);
- _database.TimeEntries.RemoveRange(entries);
- _database.TimeLabels.RemoveRange(labels);
- _database.TimeCategories.RemoveRange(categories);
_database.Users.Remove(user);
await _database.SaveChangesAsync(cancellationToken);
diff --git a/code/api/src/Endpoints/Internal/Account/GetArchiveRoute.cs b/code/api/src/Endpoints/Internal/Account/GetArchiveRoute.cs
deleted file mode 100644
index 0d9f817..0000000
--- a/code/api/src/Endpoints/Internal/Account/GetArchiveRoute.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.Internal.Account;
-
-public class GetAccountArchiveRoute : RouteBaseAsync.WithoutRequest.WithActionResult<UserArchiveDto>
-{
- private readonly MainAppDatabase _database;
-
- public GetAccountArchiveRoute(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Get a data archive with the currently logged on user's data.
- /// </summary>
- /// <param name="cancellationToken"></param>
- /// <returns></returns>
- [HttpGet("~/_/account/archive")]
- public override async Task<ActionResult<UserArchiveDto>> HandleAsync(CancellationToken cancellationToken = default) {
- var user = _database.Users.SingleOrDefault(c => c.Id == LoggedInUser.Id);
- if (user == default) {
- await HttpContext.SignOutAsync();
- return Unauthorized();
- }
-
- var entries = _database.TimeEntries
- .AsNoTracking()
- .Include(c => c.Labels)
- .Include(c => c.Category)
- .Where(c => c.UserId == user.Id)
- .ToList();
-
- var jsonOptions = new JsonSerializerOptions {
- WriteIndented = true
- };
-
- var dto = new UserArchiveDto(user);
- dto.Entries.AddRange(entries.Select(entry => new UserArchiveDto.EntryDto {
- CreatedAt = entry.CreatedAt.ToString("yyyy-MM-ddTHH:mm:ssZ"),
- StartDateTime = entry.Start,
- StopDateTime = entry.Stop,
- Description = entry.Description,
- Labels = entry.Labels
- .Select(c => new UserArchiveDto.LabelDto {
- Name = c.Name,
- Color = c.Color
- })
- .ToList(),
- Category = new UserArchiveDto.CategoryDto {
- Name = entry.Category.Name,
- Color = entry.Category.Color
- },
- }));
-
- dto.CountEntries();
-
- var entriesSerialized = JsonSerializer.SerializeToUtf8Bytes(dto, jsonOptions);
-
- return File(entriesSerialized,
- "application/json",
- user.Username + "-time-tracker-archive-" + AppDateTime.UtcNow.ToString("yyyyMMddTHHmmss") + ".json");
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/Internal/Account/UserArchiveDto.cs b/code/api/src/Endpoints/Internal/Account/UserArchiveDto.cs
deleted file mode 100644
index 5d259ab..0000000
--- a/code/api/src/Endpoints/Internal/Account/UserArchiveDto.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-
-namespace IOL.GreatOffice.Api.Endpoints.Internal.Account;
-
-/// <summary>
-/// Represents a user archive as it is provided to users.
-/// </summary>
-public class UserArchiveDto
-{
- /// <inheritdoc cref="UserArchiveDto"/>
- public UserArchiveDto(User user) {
- Meta = new MetaDto {
- GeneratedAt = AppDateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")
- };
- User = new UserDto(user);
- Entries = new List<EntryDto>();
- }
-
- /// <summary>
- /// Metadata for the user archive.
- /// </summary>
- public MetaDto Meta { get; }
-
- /// <summary>
- /// Relevant user data for the archive.
- /// </summary>
- public UserDto User { get; }
-
- /// <summary>
- /// List of entries that the user has created.
- /// </summary>
- public List<EntryDto> Entries { get; }
-
- public void CountEntries() {
- Meta.EntryCount = Entries.Count;
- }
-
- /// <summary>
- /// Represents a time entry in the data archive.
- /// </summary>
- public class EntryDto
- {
- public string CreatedAt { get; init; }
-
- [JsonIgnore]
- public DateTime StartDateTime { get; init; }
-
- /// <summary>
- /// ISO 8601 string of the UTC date the time entry started.
- /// </summary>
- public string Start => StartDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ");
-
- [JsonIgnore]
- public DateTime StopDateTime { get; init; }
-
- /// <summary>
- /// ISO 8601 string of the UTC date the time entry stopped.
- /// </summary>
- public string Stop => StopDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ");
-
- /// <summary>
- /// Total amount of minutes elapsed from start to stop on this time entry.
- /// </summary>
- public double Minutes => StopDateTime.Subtract(StartDateTime).TotalMinutes;
-
- public string Description { get; init; }
-
- /// <summary>
- /// Archive spesific category for this time entry.
- /// </summary>
- public CategoryDto Category { get; init; }
-
- /// <summary>
- /// Archive spesific list of labels for this time entry.
- /// </summary>
- public List<LabelDto> Labels { get; init; }
- }
-
- /// <summary>
- /// Time entry category as it is written to the user archive.
- /// </summary>
- public class CategoryDto
- {
- public string Name { get; init; }
- public string Color { get; init; }
- }
-
- /// <summary>
- /// Time entry label as it is written to the user archive.
- /// </summary>
- public class LabelDto
- {
- public string Name { get; init; }
- public string Color { get; init; }
- }
-
-
- /// <summary>
- /// Represents the user who this archive's data is based on.
- /// </summary>
- public class UserDto
- {
- /// <inheritdoc cref="UserDto"/>
- public UserDto(User user) {
- Username = user.Username;
- CreatedAt = user.CreatedAt;
- }
-
- /// <summary>
- /// UTC date this user was created.
- /// </summary>
- public DateTime CreatedAt { get; }
-
- public string Username { get; }
- }
-
- /// <summary>
- /// Represents the meta object which contains metdata for this archive.
- /// </summary>
- public class MetaDto
- {
- /// <summary>
- /// ISO 8601 UTC date string for when this archive was created.
- /// </summary>
- public string GeneratedAt { get; init; }
-
- /// <summary>
- /// Amount of entries in the archive.
- /// </summary>
- public int EntryCount { get; set; }
- }
-}
diff --git a/code/api/src/Endpoints/V1/Categories/CreateCategoryRoute.cs b/code/api/src/Endpoints/V1/Categories/CreateCategoryRoute.cs
deleted file mode 100644
index 0471637..0000000
--- a/code/api/src/Endpoints/V1/Categories/CreateCategoryRoute.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Categories;
-
-public class CreateCategoryRoute : RouteBaseSync.WithRequest<TimeCategory.TimeCategoryDto>.WithActionResult<TimeCategory.TimeCategoryDto>
-{
- private readonly MainAppDatabase _database;
-
- public CreateCategoryRoute(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Create a new time entry category.
- /// </summary>
- /// <param name="categoryTimeCategoryDto"></param>
- /// <returns></returns>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_CREATE)]
- [HttpPost("~/v{version:apiVersion}/categories/create")]
- [ProducesResponseType(200, Type = typeof(TimeCategory.TimeCategoryDto))]
- public override ActionResult<TimeCategory.TimeCategoryDto> Handle(TimeCategory.TimeCategoryDto categoryTimeCategoryDto) {
- var duplicate = _database.TimeCategories
- .Where(c => c.UserId == LoggedInUser.Id)
- .Any(c => c.Name.Trim() == categoryTimeCategoryDto.Name.Trim());
- if (duplicate) {
- var category = _database.TimeCategories
- .Where(c => c.UserId == LoggedInUser.Id)
- .SingleOrDefault(c => c.Name.Trim() == categoryTimeCategoryDto.Name.Trim());
- if (category != default) {
- return Ok(category.AsDto);
- }
- }
-
- var newCategory = new TimeCategory(LoggedInUser) {
- Name = categoryTimeCategoryDto.Name.Trim(),
- Color = categoryTimeCategoryDto.Color
- };
- newCategory.SetOwnerIds(LoggedInUser.Id);
-
- _database.TimeCategories.Add(newCategory);
- _database.SaveChanges();
- categoryTimeCategoryDto.Id = newCategory.Id;
- return Ok(categoryTimeCategoryDto);
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/V1/Categories/DeleteCategoryRoute.cs b/code/api/src/Endpoints/V1/Categories/DeleteCategoryRoute.cs
deleted file mode 100644
index 582ec7d..0000000
--- a/code/api/src/Endpoints/V1/Categories/DeleteCategoryRoute.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Categories;
-
-public class DeleteCategoryRoute : RouteBaseSync.WithRequest<Guid>.WithActionResult
-{
- private readonly MainAppDatabase _database;
-
- public DeleteCategoryRoute(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Delete a time entry category.
- /// </summary>
- /// <param name="id"></param>
- /// <returns></returns>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_DELETE)]
- [HttpDelete("~/v{version:apiVersion}/categories/{id:guid}/delete")]
- [ProducesResponseType(200)]
- [ProducesResponseType(404)]
- public override ActionResult Handle(Guid id) {
- var category = _database.TimeCategories
- .Where(c => c.UserId == LoggedInUser.Id)
- .SingleOrDefault(c => c.Id == id);
-
- if (category == default) {
- return NotFound();
- }
-
- var entries = _database.TimeEntries
- .Include(c => c.Category)
- .Where(c => c.Category.Id == category.Id);
- _database.TimeEntries.RemoveRange(entries);
- _database.TimeCategories.Remove(category);
- _database.SaveChanges();
- return Ok();
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/V1/Categories/GetCategoriesRoute.cs b/code/api/src/Endpoints/V1/Categories/GetCategoriesRoute.cs
deleted file mode 100644
index 937f8e3..0000000
--- a/code/api/src/Endpoints/V1/Categories/GetCategoriesRoute.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Categories;
-
-public class GetCategoriesRoute : RouteBaseSync.WithoutRequest.WithActionResult<List<TimeCategory.TimeCategoryDto>>
-{
- private readonly MainAppDatabase _database;
-
- public GetCategoriesRoute(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Get a minimal list of time entry categories.
- /// </summary>
- /// <returns></returns>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [ProducesResponseType(200, Type = typeof(List<TimeCategory.TimeCategoryDto>))]
- [ProducesResponseType(204)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_READ)]
- [HttpGet("~/v{version:apiVersion}/categories")]
- public override ActionResult<List<TimeCategory.TimeCategoryDto>> Handle() {
- var categories = _database.TimeCategories
- .Where(c => c.UserId == LoggedInUser.Id)
- .OrderByDescending(c => c.CreatedAt)
- .Select(c => c.AsDto)
- .ToList();
-
- if (categories.Count == 0) {
- return NoContent();
- }
-
- return Ok(categories);
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/V1/Categories/UpdateCategoryRoute.cs b/code/api/src/Endpoints/V1/Categories/UpdateCategoryRoute.cs
deleted file mode 100644
index 096132d..0000000
--- a/code/api/src/Endpoints/V1/Categories/UpdateCategoryRoute.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Categories;
-
-public class UpdateCategoryRoute : RouteBaseSync.WithRequest<TimeCategory.TimeCategoryDto>.WithActionResult
-{
- private readonly MainAppDatabase _database;
-
- public UpdateCategoryRoute(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Update a time entry category.
- /// </summary>
- /// <param name="categoryTimeCategoryDto"></param>
- /// <returns></returns>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_UPDATE)]
- [HttpPost("~/v{version:apiVersion}/categories/update")]
- [ProducesResponseType(200)]
- [ProducesResponseType(404)]
- [ProducesResponseType(403)]
- public override ActionResult Handle(TimeCategory.TimeCategoryDto categoryTimeCategoryDto) {
- var category = _database.TimeCategories
- .Where(c => c.UserId == LoggedInUser.Id)
- .SingleOrDefault(c => c.Id == categoryTimeCategoryDto.Id);
- if (category == default) {
- return NotFound();
- }
-
- if (LoggedInUser.Id != category.UserId) {
- return Forbid();
- }
-
- category.Name = categoryTimeCategoryDto.Name;
- category.Color = categoryTimeCategoryDto.Color;
- _database.SaveChanges();
- return Ok();
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/V1/Entries/CreateEntryRoute.cs b/code/api/src/Endpoints/V1/Entries/CreateEntryRoute.cs
deleted file mode 100644
index 45d8f32..0000000
--- a/code/api/src/Endpoints/V1/Entries/CreateEntryRoute.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Entries;
-
-public class CreateEntryRoute : RouteBaseSync.WithRequest<TimeEntry.TimeEntryDto>.WithActionResult<TimeEntry.TimeEntryDto>
-{
- private readonly MainAppDatabase _database;
-
- public CreateEntryRoute(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Create a time entry.
- /// </summary>
- /// <param name="timeEntryTimeEntryDto"></param>
- /// <returns></returns>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_CREATE)]
- [ProducesResponseType(200)]
- [ProducesResponseType(400, Type = typeof(KnownProblemModel))]
- [ProducesResponseType(404, Type = typeof(KnownProblemModel))]
- [HttpPost("~/v{version:apiVersion}/entries/create")]
- public override ActionResult<TimeEntry.TimeEntryDto> Handle(TimeEntry.TimeEntryDto timeEntryTimeEntryDto) {
- if (timeEntryTimeEntryDto.Stop == default) {
- return BadRequest(new KnownProblemModel("Invalid form", "A stop date is required"));
- }
-
- if (timeEntryTimeEntryDto.Start == default) {
- return BadRequest(new KnownProblemModel("Invalid form", "A start date is required"));
- }
-
- if (timeEntryTimeEntryDto.Category == default) {
- return BadRequest(new KnownProblemModel("Invalid form", "A category is required"));
- }
-
- var category = _database.TimeCategories
- .Where(c => c.UserId == LoggedInUser.Id)
- .SingleOrDefault(c => c.Id == timeEntryTimeEntryDto.Category.Id);
-
- if (category == default) {
- return NotFound(new KnownProblemModel("Not found", $"Could not find category {timeEntryTimeEntryDto.Category.Name}"));
- }
-
- var entry = new TimeEntry(LoggedInUser) {
- Category = category,
- Start = timeEntryTimeEntryDto.Start.ToUniversalTime(),
- Stop = timeEntryTimeEntryDto.Stop.ToUniversalTime(),
- Description = timeEntryTimeEntryDto.Description,
- };
- entry.SetOwnerIds(LoggedInUser.Id);
-
- if (timeEntryTimeEntryDto.Labels?.Count > 0) {
- var labels = _database.TimeLabels
- .Where(c => c.UserId == LoggedInUser.Id)
- .Where(c => timeEntryTimeEntryDto.Labels.Select(p => p.Id).Contains(c.Id))
- .ToList();
- if (labels.Count != timeEntryTimeEntryDto.Labels.Count) {
- return NotFound(new KnownProblemModel("Not found", "Could not find all of the specified labels"));
- }
-
- entry.Labels = labels;
- }
-
- _database.TimeEntries.Add(entry);
- _database.SaveChanges();
- return Ok(entry.AsDto);
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/V1/Entries/DeleteEntryRoute.cs b/code/api/src/Endpoints/V1/Entries/DeleteEntryRoute.cs
deleted file mode 100644
index c488ed5..0000000
--- a/code/api/src/Endpoints/V1/Entries/DeleteEntryRoute.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Entries;
-
-public class DeleteEntryRoute : RouteBaseSync.WithRequest<Guid>.WithActionResult
-{
- private readonly MainAppDatabase _database;
-
- public DeleteEntryRoute(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Delete a time entry.
- /// </summary>
- /// <param name="id"></param>
- /// <returns></returns>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_DELETE)]
- [HttpDelete("~/v{version:apiVersion}/entries/{id:guid}/delete")]
- [ProducesResponseType(404)]
- [ProducesResponseType(200)]
- public override ActionResult Handle(Guid id) {
- var entry = _database.TimeEntries
- .Where(c => c.UserId == LoggedInUser.Id)
- .SingleOrDefault(c => c.Id == id);
- if (entry == default) {
- return NotFound();
- }
-
- _database.TimeEntries.Remove(entry);
- _database.SaveChanges();
- return Ok();
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/V1/Entries/EntryQueryPayload.cs b/code/api/src/Endpoints/V1/Entries/EntryQueryPayload.cs
deleted file mode 100644
index 763ac8b..0000000
--- a/code/api/src/Endpoints/V1/Entries/EntryQueryPayload.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Entries;
-
-/// <summary>
-/// Query model for querying time entries.
-/// </summary>
-public class EntryQueryPayload
-{
- /// <summary>
- /// Duration to filter with.
- /// </summary>
- public TimeEntryQueryDuration Duration { get; set; }
-
- /// <summary>
- /// List of categories to filter with.
- /// </summary>
- public List<TimeCategory.TimeCategoryDto> Categories { get; set; }
-
- /// <summary>
- /// List of labels to filter with.
- /// </summary>
- public List<TimeLabel.TimeLabelDto> Labels { get; set; }
-
- /// <summary>
- /// Date range to filter with, only respected if Duration is set to TimeEntryQueryDuration.DATE_RANGE.
- /// </summary>
- /// <see cref="TimeEntryQueryDuration"/>
- public QueryDateRange DateRange { get; set; }
-
- /// <summary>
- /// Spesific date to filter with, only respected if Duration is set to TimeEntryQueryDuration.SPECIFIC_DATE.
- /// </summary>
- /// <see cref="TimeEntryQueryDuration"/>
- public DateTime SpecificDate { get; set; }
-
- /// <summary>
- /// Optional page number to show, goes well with PageSize.
- /// </summary>
- public int Page { get; set; }
-
- /// <summary>
- /// Optional page size to show, goes well with Page.
- /// </summary>
- public int PageSize { get; set; }
-
- /// <summary>
- /// Represents a date range.
- /// </summary>
- public class QueryDateRange
- {
- /// <summary>
- /// Range start
- /// </summary>
- public DateTime From { get; set; }
-
- /// <summary>
- /// Range end
- /// </summary>
- public DateTime To { get; set; }
- }
-}
diff --git a/code/api/src/Endpoints/V1/Entries/EntryQueryResponse.cs b/code/api/src/Endpoints/V1/Entries/EntryQueryResponse.cs
deleted file mode 100644
index b1b07a3..0000000
--- a/code/api/src/Endpoints/V1/Entries/EntryQueryResponse.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Entries;
-
-/// <summary>
-/// Response given for a successful query.
-/// </summary>
-public class EntryQueryResponse
-{
- /// <inheritdoc cref="EntryQueryResponse"/>
- public EntryQueryResponse() {
- Results = new List<TimeEntry.TimeEntryDto>();
- }
-
- /// <summary>
- /// List of entries.
- /// </summary>
- public List<TimeEntry.TimeEntryDto> Results { get; set; }
-
- /// <summary>
- /// Current page.
- /// </summary>
- public int Page { get; set; }
-
- /// <summary>
- /// Current page size (amount of entries).
- /// </summary>
- public int PageSize { get; set; }
-
- /// <summary>
- /// Total amount of entries in query.
- /// </summary>
- public int TotalSize { get; set; }
-
- /// <summary>
- /// Total amount of page(s) in query.
- /// </summary>
- public int TotalPageCount { get; set; }
-}
diff --git a/code/api/src/Endpoints/V1/Entries/EntryQueryRoute.cs b/code/api/src/Endpoints/V1/Entries/EntryQueryRoute.cs
deleted file mode 100644
index 03a64d2..0000000
--- a/code/api/src/Endpoints/V1/Entries/EntryQueryRoute.cs
+++ /dev/null
@@ -1,186 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Entries;
-
-public class EntryQueryRoute : RouteBaseSync.WithRequest<EntryQueryPayload>.WithActionResult<EntryQueryResponse>
-{
- private readonly ILogger<EntryQueryRoute> _logger;
- private readonly MainAppDatabase _database;
-
- public EntryQueryRoute(ILogger<EntryQueryRoute> logger, MainAppDatabase database) {
- _logger = logger;
- _database = database;
- }
-
- /// <summary>
- /// Get a list of entries based on a given query.
- /// </summary>
- /// <param name="entryQuery"></param>
- /// <returns></returns>
- /// <exception cref="ArgumentOutOfRangeException"></exception>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_READ)]
- [HttpPost("~/v{version:apiVersion}/entries/query")]
- [ProducesResponseType(204)]
- [ProducesResponseType(400, Type = typeof(KnownProblemModel))]
- [ProducesResponseType(200, Type = typeof(EntryQueryResponse))]
- public override ActionResult<EntryQueryResponse> Handle(EntryQueryPayload entryQuery) {
- var result = new TimeQueryDto();
-
- Request.Headers.TryGetValue(AppHeaders.BROWSER_TIME_ZONE, out var timeZoneHeader);
- var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneHeader.ToString().HasValue() ? timeZoneHeader.ToString() : "UTC");
- var offsetInHours = tz.BaseUtcOffset.Hours;
-
- // this is fine as long as the client is not connecting from Australia: Lord Howe Island
- // according to https://en.wikipedia.org/wiki/Daylight_saving_time_by_country
- if (tz.IsDaylightSavingTime(AppDateTime.UtcNow)) {
- offsetInHours++;
- }
-
- _logger.LogInformation("Request time zone (" + tz.Id + ") offset is: " + offsetInHours + " hours");
- var requestDateTime = TimeZoneInfo.ConvertTimeFromUtc(AppDateTime.UtcNow, tz);
- _logger.LogInformation("Querying data with date time: " + requestDateTime.ToString("u"));
-
- var skipCount = 0;
- if (entryQuery.Page > 1) {
- skipCount = entryQuery.PageSize * entryQuery.Page;
- }
-
- result.Page = entryQuery.Page;
- result.PageSize = entryQuery.PageSize;
-
- var baseQuery = _database.TimeEntries
- .AsNoTracking()
- .Include(c => c.Category)
- .Include(c => c.Labels)
- .Where(c => c.UserId == LoggedInUser.Id)
- .ConditionalWhere(entryQuery.Categories?.Any() ?? false, c => entryQuery.Categories.Any(p => p.Id == c.Category.Id))
- .ConditionalWhere(entryQuery.Labels?.Any() ?? false, c => c.Labels.Any(l => entryQuery.Labels.Any(p => p.Id == l.Id)))
- .OrderByDescending(c => c.Start);
-
- switch (entryQuery.Duration) {
- case TimeEntryQueryDuration.TODAY:
- var baseTodaysEntries = baseQuery
- .Where(c => DateTime.Compare(c.Start.AddHours(offsetInHours).Date, AppDateTime.UtcNow.Date) == 0);
- var baseTodaysEntriesCount = baseTodaysEntries.Count();
-
- if (baseTodaysEntriesCount == 0) {
- return NoContent();
- }
-
- result.TotalSize = baseTodaysEntriesCount;
- result.TotalPageCount = Convert.ToInt32(Math.Round((double) baseTodaysEntriesCount / entryQuery.PageSize));
-
- var pagedTodaysEntries = baseTodaysEntries.Skip(skipCount).Take(entryQuery.PageSize);
-
- result.Results.AddRange(pagedTodaysEntries.Select(c => c.AsDto));
- break;
- case TimeEntryQueryDuration.THIS_WEEK:
- var lastMonday = AppDateTime.UtcNow.StartOfWeek(DayOfWeek.Monday);
-
- var baseEntriesThisWeek = baseQuery
- .Where(c => c.Start.AddHours(offsetInHours).Date >= lastMonday.Date && c.Start.AddHours(offsetInHours).Date <= AppDateTime.UtcNow.Date);
-
- var baseEntriesThisWeekCount = baseEntriesThisWeek.Count();
-
- if (baseEntriesThisWeekCount == 0) {
- return NoContent();
- }
-
- result.TotalSize = baseEntriesThisWeekCount;
- result.TotalPageCount = Convert.ToInt32(Math.Round((double) baseEntriesThisWeekCount / entryQuery.PageSize));
-
- var pagedEntriesThisWeek = baseEntriesThisWeek.Skip(skipCount).Take(entryQuery.PageSize);
-
- result.Results.AddRange(pagedEntriesThisWeek.Select(c => c.AsDto));
- break;
- case TimeEntryQueryDuration.THIS_MONTH:
- var baseEntriesThisMonth = baseQuery
- .Where(c => c.Start.AddHours(offsetInHours).Month == AppDateTime.UtcNow.Month
- && c.Start.AddHours(offsetInHours).Year == AppDateTime.UtcNow.Year);
- var baseEntriesThisMonthCount = baseEntriesThisMonth.Count();
- if (baseEntriesThisMonthCount == 0) {
- return NoContent();
- }
-
- result.TotalSize = baseEntriesThisMonthCount;
- result.TotalPageCount = Convert.ToInt32(Math.Round((double) baseEntriesThisMonthCount / entryQuery.PageSize));
-
- var pagedEntriesThisMonth = baseEntriesThisMonth.Skip(skipCount).Take(entryQuery.PageSize);
-
- result.Results.AddRange(pagedEntriesThisMonth.Select(c => c.AsDto));
- break;
- case TimeEntryQueryDuration.THIS_YEAR:
- var baseEntriesThisYear = baseQuery
- .Where(c => c.Start.AddHours(offsetInHours).Year == AppDateTime.UtcNow.Year);
-
- var baseEntriesThisYearCount = baseEntriesThisYear.Count();
- if (baseEntriesThisYearCount == 0) {
- return NoContent();
- }
-
- result.TotalSize = baseEntriesThisYearCount;
- result.TotalPageCount = Convert.ToInt32(Math.Round((double) baseEntriesThisYearCount / entryQuery.PageSize));
-
- var pagedEntriesThisYear = baseEntriesThisYear.Skip(skipCount).Take(entryQuery.PageSize);
-
- result.Results.AddRange(pagedEntriesThisYear.Select(c => c.AsDto));
- break;
- case TimeEntryQueryDuration.SPECIFIC_DATE:
- var date = DateTime.SpecifyKind(entryQuery.SpecificDate, DateTimeKind.Utc);
- var baseEntriesOnThisDate = baseQuery.Where(c => c.Start.AddHours(offsetInHours).Date == date.Date);
- var baseEntriesOnThisDateCount = baseEntriesOnThisDate.Count();
-
- if (baseEntriesOnThisDateCount == 0) {
- return NoContent();
- }
-
- result.TotalSize = baseEntriesOnThisDateCount;
- result.TotalPageCount = Convert.ToInt32(Math.Round((double) baseEntriesOnThisDateCount / entryQuery.PageSize));
-
- var pagedEntriesOnThisDate = baseEntriesOnThisDate.Skip(skipCount).Take(entryQuery.PageSize);
-
- result.Results.AddRange(pagedEntriesOnThisDate.Select(c => c.AsDto));
- break;
- case TimeEntryQueryDuration.DATE_RANGE:
- if (entryQuery.DateRange.From == default) {
- return BadRequest(new KnownProblemModel("Invalid query", "From date cannot be empty"));
- }
-
- var fromDate = DateTime.SpecifyKind(entryQuery.DateRange.From, DateTimeKind.Utc);
-
- if (entryQuery.DateRange.To == default) {
- return BadRequest(new KnownProblemModel("Invalid query", "To date cannot be empty"));
- }
-
- var toDate = DateTime.SpecifyKind(entryQuery.DateRange.To, DateTimeKind.Utc);
-
- if (DateTime.Compare(fromDate, toDate) > 0) {
- return BadRequest(new KnownProblemModel("Invalid query", "To date cannot be less than From date"));
- }
-
- var baseDateRangeEntries = baseQuery
- .Where(c => c.Start.AddHours(offsetInHours).Date > fromDate && c.Start.AddHours(offsetInHours).Date <= toDate);
-
- var baseDateRangeEntriesCount = baseDateRangeEntries.Count();
- if (baseDateRangeEntriesCount == 0) {
- return NoContent();
- }
-
- result.TotalSize = baseDateRangeEntriesCount;
- result.TotalPageCount = Convert.ToInt32(Math.Round((double) baseDateRangeEntriesCount / entryQuery.PageSize));
-
- var pagedDateRangeEntries = baseDateRangeEntries.Skip(skipCount).Take(entryQuery.PageSize);
-
- result.Results.AddRange(pagedDateRangeEntries.Select(c => c.AsDto));
- break;
- default:
- throw new ArgumentOutOfRangeException(nameof(entryQuery), "Unknown duration for query");
- }
-
- if (result.Results.Any() && result.Page == 0) {
- result.Page = 1;
- result.TotalPageCount = 1;
- }
-
- return Ok(result);
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/V1/Entries/GetEntryRoute.cs b/code/api/src/Endpoints/V1/Entries/GetEntryRoute.cs
deleted file mode 100644
index 6e064c7..0000000
--- a/code/api/src/Endpoints/V1/Entries/GetEntryRoute.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Entries;
-
-public class GetEntryRoute : RouteBaseSync.WithRequest<Guid>.WithActionResult<TimeEntry.TimeEntryDto>
-{
- private readonly MainAppDatabase _database;
-
- public GetEntryRoute(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Get a spesific time entry.
- /// </summary>
- /// <param name="id"></param>
- /// <returns></returns>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_READ)]
- [HttpGet("~/v{version:apiVersion}/entries/{id:guid}")]
- [ProducesResponseType(404)]
- [ProducesResponseType(200, Type = typeof(TimeEntry.TimeEntryDto))]
- public override ActionResult<TimeEntry.TimeEntryDto> Handle(Guid id) {
- var entry = _database.TimeEntries
- .Where(c => c.UserId == LoggedInUser.Id)
- .Include(c => c.Category)
- .Include(c => c.Labels)
- .SingleOrDefault(c => c.Id == id);
-
- if (entry == default) {
- return NotFound();
- }
-
- return Ok(entry);
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/V1/Entries/TimeQueryDto.cs b/code/api/src/Endpoints/V1/Entries/TimeQueryDto.cs
deleted file mode 100644
index 6c199d8..0000000
--- a/code/api/src/Endpoints/V1/Entries/TimeQueryDto.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-
-namespace IOL.GreatOffice.Api.Endpoints.V1.Entries;
-
-public class TimeQueryDto
-{
- public TimeQueryDto() {
- Results = new List<TimeEntry.TimeEntryDto>();
- }
-
- /// <summary>
- /// List of entries.
- /// </summary>
- public List<TimeEntry.TimeEntryDto> Results { get; set; }
-
- /// <summary>
- /// Curren page.
- /// </summary>
- public int Page { get; set; }
-
- /// <summary>
- /// Maximum count of entries in a page.
- /// </summary>
- public int PageSize { get; set; }
-
- /// <summary>
- /// Total count of entries.
- /// </summary>
- public int TotalSize { get; set; }
-
- /// <summary>
- /// Total count of pages.
- /// </summary>
- public int TotalPageCount { get; set; }
-}
diff --git a/code/api/src/Endpoints/V1/Entries/UpdateEntryRoute.cs b/code/api/src/Endpoints/V1/Entries/UpdateEntryRoute.cs
deleted file mode 100644
index 2254214..0000000
--- a/code/api/src/Endpoints/V1/Entries/UpdateEntryRoute.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Entries;
-
-public class UpdateEntryRoute : RouteBaseSync.WithRequest<TimeEntry.TimeEntryDto>.WithActionResult<TimeEntry.TimeEntryDto>
-{
- private readonly MainAppDatabase _database;
-
- public UpdateEntryRoute(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Update a time entry.
- /// </summary>
- /// <param name="timeEntryTimeEntryDto"></param>
- /// <returns></returns>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_UPDATE)]
- [HttpPost("~/v{version:apiVersion}/entries/update")]
- [ProducesResponseType(404, Type = typeof(KnownProblemModel))]
- [ProducesResponseType(200, Type = typeof(TimeEntry.TimeEntryDto))]
- public override ActionResult<TimeEntry.TimeEntryDto> Handle(TimeEntry.TimeEntryDto timeEntryTimeEntryDto) {
- var entry = _database.TimeEntries
- .Where(c => c.UserId == LoggedInUser.Id)
- .Include(c => c.Labels)
- .SingleOrDefault(c => c.Id == timeEntryTimeEntryDto.Id);
-
- if (entry == default) {
- return NotFound();
- }
-
- var category = _database.TimeCategories
- .Where(c => c.UserId == LoggedInUser.Id)
- .SingleOrDefault(c => c.Id == timeEntryTimeEntryDto.Category.Id);
- if (category == default) {
- return NotFound(new KnownProblemModel("Not found", $"Could not find category {timeEntryTimeEntryDto.Category.Name}"));
- }
-
- entry.Start = timeEntryTimeEntryDto.Start.ToUniversalTime();
- entry.Stop = timeEntryTimeEntryDto.Stop.ToUniversalTime();
- entry.Description = timeEntryTimeEntryDto.Description;
- entry.Category = category;
-
- if (timeEntryTimeEntryDto.Labels?.Count > 0) {
- var labels = new List<TimeLabel>();
-
- foreach (var labelDto in timeEntryTimeEntryDto.Labels) {
- var label = _database.TimeLabels
- .Where(c => c.UserId == LoggedInUser.Id)
- .SingleOrDefault(c => c.Id == labelDto.Id);
-
- if (label == default) {
- continue;
- }
-
- labels.Add(label);
- }
-
- entry.Labels = labels;
- } else {
- entry.Labels = default;
- }
-
- _database.SaveChanges();
- return Ok(entry.AsDto);
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/V1/Labels/CreateLabelRoute.cs b/code/api/src/Endpoints/V1/Labels/CreateLabelRoute.cs
deleted file mode 100644
index d6106aa..0000000
--- a/code/api/src/Endpoints/V1/Labels/CreateLabelRoute.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Labels;
-
-public class CreateLabelRoute : RouteBaseSync.WithRequest<TimeLabel.TimeLabelDto>.WithActionResult<TimeLabel.TimeLabelDto>
-{
- private readonly MainAppDatabase _database;
-
- public CreateLabelRoute(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Create a time entry label.
- /// </summary>
- /// <param name="labelTimeLabelDto"></param>
- /// <returns></returns>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_CREATE)]
- [HttpPost("~/v{version:apiVersion}/labels/create")]
- public override ActionResult<TimeLabel.TimeLabelDto> Handle(TimeLabel.TimeLabelDto labelTimeLabelDto) {
- var duplicate = _database.TimeLabels
- .Where(c => c.UserId == LoggedInUser.Id)
- .Any(c => c.Name.Trim() == labelTimeLabelDto.Name.Trim());
- if (duplicate) {
- var label = _database.TimeLabels
- .Where(c => c.UserId == LoggedInUser.Id)
- .SingleOrDefault(c => c.Name.Trim() == labelTimeLabelDto.Name.Trim());
-
- if (label != default) {
- return Ok(label.AsDto);
- }
- }
-
- var newLabel = new TimeLabel(LoggedInUser) {
- Name = labelTimeLabelDto.Name.Trim(),
- Color = labelTimeLabelDto.Color
- };
- newLabel.SetOwnerIds(LoggedInUser.Id);
-
- _database.TimeLabels.Add(newLabel);
- _database.SaveChanges();
- labelTimeLabelDto.Id = newLabel.Id;
- return Ok(labelTimeLabelDto);
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/V1/Labels/DeleteLabelRoute.cs b/code/api/src/Endpoints/V1/Labels/DeleteLabelRoute.cs
deleted file mode 100644
index 1baf4ef..0000000
--- a/code/api/src/Endpoints/V1/Labels/DeleteLabelRoute.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Labels;
-
-public class DeleteLabelEndpoint : RouteBaseSync.WithRequest<Guid>.WithActionResult
-{
- private readonly MainAppDatabase _database;
-
- public DeleteLabelEndpoint(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Delete a time entry label.
- /// </summary>
- /// <param name="id"></param>
- /// <returns></returns>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_DELETE)]
- [HttpDelete("~/v{version:apiVersion}/labels/{id:guid}/delete")]
- public override ActionResult Handle(Guid id) {
- var label = _database.TimeLabels
- .Where(c => c.UserId == LoggedInUser.Id)
- .SingleOrDefault(c => c.Id == id);
-
- if (label == default) {
- return NotFound();
- }
-
- _database.TimeLabels.Remove(label);
- _database.SaveChanges();
- return Ok();
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/V1/Labels/GetLabelRoute.cs b/code/api/src/Endpoints/V1/Labels/GetLabelRoute.cs
deleted file mode 100644
index 09d453b..0000000
--- a/code/api/src/Endpoints/V1/Labels/GetLabelRoute.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Labels;
-
-public class GetEndpoint : RouteBaseSync.WithoutRequest.WithActionResult<List<TimeLabel.TimeLabelDto>>
-{
- private readonly MainAppDatabase _database;
-
- public GetEndpoint(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Get a minimal list of time entry labels.
- /// </summary>
- /// <returns></returns>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_READ)]
- [HttpGet("~/v{version:apiVersion}/labels")]
- public override ActionResult<List<TimeLabel.TimeLabelDto>> Handle() {
- var labels = _database.TimeLabels
- .Where(c => c.UserId == LoggedInUser.Id)
- .OrderByDescending(c => c.CreatedAt)
- .Select(c => c.AsDto)
- .ToList();
-
- if (labels.Count == 0) {
- return NoContent();
- }
-
- return Ok(labels);
- }
-} \ No newline at end of file
diff --git a/code/api/src/Endpoints/V1/Labels/UpdateLabelRoute.cs b/code/api/src/Endpoints/V1/Labels/UpdateLabelRoute.cs
deleted file mode 100644
index 9857b7d..0000000
--- a/code/api/src/Endpoints/V1/Labels/UpdateLabelRoute.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-namespace IOL.GreatOffice.Api.Endpoints.V1.Labels;
-
-public class UpdateLabelEndpoint : RouteBaseSync.WithRequest<TimeLabel.TimeLabelDto>.WithActionResult
-{
- private readonly MainAppDatabase _database;
-
- public UpdateLabelEndpoint(MainAppDatabase database) {
- _database = database;
- }
-
- /// <summary>
- /// Update a time entry label.
- /// </summary>
- /// <param name="labelTimeLabelDto"></param>
- /// <returns></returns>
- [ApiVersion(ApiSpecV1.VERSION_STRING)]
- [BasicAuthentication(AppConstants.TOKEN_ALLOW_UPDATE)]
- [HttpPost("~/v{version:apiVersion}/labels/update")]
- public override ActionResult Handle(TimeLabel.TimeLabelDto labelTimeLabelDto) {
- var label = _database.TimeLabels
- .Where(c => c.UserId == LoggedInUser.Id)
- .SingleOrDefault(c => c.Id == labelTimeLabelDto.Id);
- if (label == default) {
- return NotFound();
- }
-
- if (LoggedInUser.Id != label.UserId) {
- return Forbid();
- }
-
- label.Name = labelTimeLabelDto.Name;
- label.Color = labelTimeLabelDto.Color;
- _database.SaveChanges();
- return Ok();
- }
-} \ No newline at end of file