Skip to content

Commit 8f0cabc

Browse files
committed
hotfix public shares
1 parent c5d9af4 commit 8f0cabc

File tree

8 files changed

+16
-6
lines changed

8 files changed

+16
-6
lines changed

API/Controller/Shares/Links/AddShocker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public sealed partial class ShareLinksController
2424
[ProducesResponseType<OpenShockProblem>(StatusCodes.Status409Conflict, MediaTypeNames.Application.ProblemJson)] // ShockerAlreadyInPublicShare
2525
public async Task<IActionResult> AddShocker([FromRoute] Guid publicShareId, [FromRoute] Guid shockerId)
2626
{
27-
var exists = await _db.PublicShares.AnyAsync(x => x.OwnerId == CurrentUser.Id && x.Id == publicShareId);
27+
var exists = await _db.PublicShares.AnyAsync(x => x.OwnerId == CurrentUser.Id && x.Id == publicShareId && (x.ExpiresAt == null || x.ExpiresAt > DateTime.UtcNow));
2828
if (!exists) return Problem(PublicShareError.PublicShareNotFound);
2929

3030
var ownShocker =

API/Controller/Shares/Links/CreatePublicShare.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Net.Mime;
22
using Microsoft.AspNetCore.Mvc;
33
using OpenShock.API.Models.Requests;
4+
using OpenShock.Common.Errors;
45
using OpenShock.Common.Models;
56
using OpenShock.Common.OpenShockDb;
67

@@ -17,6 +18,12 @@ public sealed partial class ShareLinksController
1718
[ProducesResponseType<LegacyDataResponse<Guid>>(StatusCodes.Status200OK, MediaTypeNames.Application.Json)]
1819
public async Task<IActionResult> CreatePublicShare([FromBody] PublicShareCreate body)
1920
{
21+
// Expiry date in the past is not allowed, but null (no expiry) is allowed
22+
if (body.ExpiresOn <= DateTime.UtcNow)
23+
{
24+
return Problem(PublicShareError.PublicShareExpiryDateInPast);
25+
}
26+
2027
var entity = new PublicShare
2128
{
2229
Id = Guid.CreateVersion7(),

API/Controller/Shares/Links/DeletePublicShare.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public sealed partial class ShareLinksController
2222
public async Task<IActionResult> DeletePublicShare([FromRoute] Guid publicShareId)
2323
{
2424
var result = await _db.PublicShares
25-
.Where(x => x.Id == publicShareId)
25+
.Where(x => x.Id == publicShareId && (x.ExpiresAt == null || x.ExpiresAt > DateTime.UtcNow))
2626
.WhereIsUserOrPrivileged(x => x.Owner, CurrentUser)
2727
.ExecuteDeleteAsync();
2828

API/Controller/Shares/Links/EditShocker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public sealed partial class ShareLinksController
2424
[ProducesResponseType<OpenShockProblem>(StatusCodes.Status404NotFound, MediaTypeNames.Application.ProblemJson)] // PublicShareNotFound, ShockerNotInPublicShare
2525
public async Task<IActionResult> EditShocker([FromRoute] Guid publicShareId, [FromRoute] Guid shockerId, [FromBody] PublicShareEditShocker body)
2626
{
27-
var exists = await _db.PublicShares.AnyAsync(x => x.OwnerId == CurrentUser.Id && x.Id == publicShareId);
27+
var exists = await _db.PublicShares.AnyAsync(x => x.OwnerId == CurrentUser.Id && x.Id == publicShareId && (x.ExpiresAt == null || x.ExpiresAt > DateTime.UtcNow));
2828
if (!exists) return Problem(PublicShareError.PublicShareNotFound);
2929

3030
var shocker =

API/Controller/Shares/Links/List.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public sealed partial class ShareLinksController
1717
public IActionResult List()
1818
{
1919
var ownPublicShares = _db.PublicShares
20-
.Where(x => x.OwnerId == CurrentUser.Id && x.ExpiresAt > DateTime.UtcNow)
20+
.Where(x => x.OwnerId == CurrentUser.Id && (x.ExpiresAt == null || x.ExpiresAt > DateTime.UtcNow))
2121
.Select(x => OwnPublicShareResponse.GetFromEf(x))
2222
.AsAsyncEnumerable();
2323

API/Controller/Shares/Links/PauseShocker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public sealed partial class ShareLinksController
2626
[ProducesResponseType<OpenShockProblem>(StatusCodes.Status404NotFound, MediaTypeNames.Application.ProblemJson)] // PublicShareNotFound, ShockerNotInPublicShare
2727
public async Task<IActionResult> PauseShocker([FromRoute] Guid publicShareId, [FromRoute] Guid shockerId, [FromBody] PauseRequest body)
2828
{
29-
var exists = await _db.PublicShares.AnyAsync(x => x.OwnerId == CurrentUser.Id && x.Id == publicShareId);
29+
var exists = await _db.PublicShares.AnyAsync(x => x.OwnerId == CurrentUser.Id && x.Id == publicShareId && (x.ExpiresAt == null || x.ExpiresAt > DateTime.UtcNow));
3030
if (!exists) return Problem(PublicShareError.PublicShareNotFound);
3131

3232
var shocker =

API/Controller/Shares/Links/RemoveShocker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public sealed partial class ShareLinksController
2424
public async Task<IActionResult> RemoveShocker([FromRoute] Guid publicShareId, [FromRoute] Guid shockerId)
2525
{
2626
var exists = await _db.PublicShares
27-
.Where(x => x.Id == publicShareId)
27+
.Where(x => x.Id == publicShareId && (x.ExpiresAt == null || x.ExpiresAt > DateTime.UtcNow))
2828
.WhereIsUserOrPrivileged(x => x.Owner, CurrentUser)
2929
.AnyAsync();
3030
if (!exists)

Common/Errors/PublicShareError.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,7 @@ public static class PublicShareError
1212

1313
// Remove shocker errors
1414
public static OpenShockProblem ShockerNotInPublicShare => new("ShareLink.ShockerNotInShareLink", "Shocker does not exist in public share", HttpStatusCode.NotFound);
15+
16+
// Create share errors
17+
public static OpenShockProblem PublicShareExpiryDateInPast => new("ShareLink.ExpiryDateInPast", "Expiry date cannot be in the past", HttpStatusCode.BadRequest);
1518
}

0 commit comments

Comments
 (0)