Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,8 @@ FodyWeavers.xsd
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace

launch.json
tasks.json
# Local History for Visual Studio Code
.history/

Expand Down
6 changes: 3 additions & 3 deletions AddMigration.bat
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
echo Adding Migration...
@echo off
cd /d "%~dp0/src/SF.PhotosApp.API"
cd /d "%~dp0/src/SF.PhotoPixels.API"
@echo on
dotnet run -- db-patch ..\SF.PhotosApp.Infrastructure\Migrations\%1.sql
dotnet run -- db-patch ..\SF.PhotoPixels.Infrastructure\Migrations\%1.sql
@echo off
cd /d "%~dp0/src/SF.PhotosApp.Infrastructure/Migrations"
cd /d "%~dp0/src/SF.PhotoPixels.Infrastructure/Migrations"
move %1.drop.sql ./Rollback/%1.drop.sql
36 changes: 36 additions & 0 deletions src/SF.PhotoPixels.API/Endpoints/AlbumEndpoints/AddAlbum.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using Ardalis.ApiEndpoints;
using Mediator;
using Microsoft.AspNetCore.Mvc;
using OneOf;
using SF.PhotoPixels.Application;
using SF.PhotoPixels.Application.Commands.Albums;
using Swashbuckle.AspNetCore.Annotations;

namespace SF.PhotoPixels.API.Endpoints.AlbumEndpoints;

public class AddAlbum : EndpointBaseAsync.WithRequest<AddAlbumRequest>.WithActionResult<OneOf<AddAlbumResponse, ValidationError>>
{
private readonly IMediator _mediator;

public AddAlbum(IMediator mediator)
{
_mediator = mediator;
}

[HttpPost("/album/")]
[SwaggerOperation(
Summary = "Add a new album",
Description = "Creates a new album and returns the new album info",
OperationId = "Add_Album",
Tags = new[] { "Album operations" }),
]
public override async Task<ActionResult<OneOf<AddAlbumResponse, ValidationError>>> HandleAsync([FromBody] AddAlbumRequest request, CancellationToken cancellationToken = default)
{
var result = await _mediator.Send(request, cancellationToken);

return result.Match<ActionResult<OneOf<AddAlbumResponse, ValidationError>>>(
response => new OkObjectResult(response),
validationError => new BadRequestObjectResult(validationError)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using Ardalis.ApiEndpoints;
using Mediator;
using Microsoft.AspNetCore.Mvc;
using OneOf;
using OneOf.Types;
using SF.PhotoPixels.Application;
using SF.PhotoPixels.Application.Commands.AlbumObjects;
using Swashbuckle.AspNetCore.Annotations;

namespace SF.PhotoPixels.API.Endpoints.AlbumEndpoints
{
public class AddObjectToAlbum: EndpointBaseAsync
.WithRequest<AddObjectToAlbumRequest>
.WithActionResult<OneOf<Success, ValidationError>>
{
private readonly IMediator _mediator;

public AddObjectToAlbum(IMediator mediator)
{
_mediator = mediator;
}

[HttpPost("/album/{albumId}/objects/")]
[SwaggerOperation(
Summary = "Add object(s) to an album",
Description = "Add object(s) to an album",
OperationId = "Add_Object_To_Album",
Tags = new[] { "Album operations" }),
]
public override async Task<ActionResult<OneOf<Success, ValidationError>>> HandleAsync(AddObjectToAlbumRequest request, CancellationToken cancellationToken = default)
{
var result = await _mediator.Send(request, cancellationToken);

return result.Match<ActionResult<OneOf<Success, ValidationError>>>(
response => new OkObjectResult(response),
validationError => new BadRequestObjectResult(validationError)
);
}
}
}
38 changes: 38 additions & 0 deletions src/SF.PhotoPixels.API/Endpoints/AlbumEndpoints/DeleteAlbum.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using Ardalis.ApiEndpoints;
using Mediator;
using Microsoft.AspNetCore.Mvc;
using OneOf;
using OneOf.Types;
using SF.PhotoPixels.Application;
using SF.PhotoPixels.Application.Commands.Albums;
using Swashbuckle.AspNetCore.Annotations;

namespace SF.PhotoPixels.API.Endpoints.AlbumEndpoints;

public class DeleteAlbum : EndpointBaseAsync
.WithRequest<DeleteAlbumRequest>
.WithActionResult<OneOf<Success, ValidationError>>
{
private readonly IMediator _mediator;

public DeleteAlbum(IMediator mediator)
{
_mediator = mediator;
}

[HttpDelete("/album/{albumId}/")]
[SwaggerOperation(
Summary = "Delete an album.",
Description = "Delete an album, but keep the objects intact. Thy are just no longer part of this album",
Tags = new[] { "Album operations" }),
]
public override async Task<ActionResult<OneOf<Success, ValidationError>>> HandleAsync([FromRoute] DeleteAlbumRequest request, CancellationToken cancellationToken = default)
{
var result = await _mediator.Send(request, cancellationToken);

return result.Match<ActionResult<OneOf<Success, ValidationError>>>(
response => new OkObjectResult(response),
validationError => new BadRequestObjectResult(validationError)
);
}
}
40 changes: 40 additions & 0 deletions src/SF.PhotoPixels.API/Endpoints/AlbumEndpoints/GetAlbumInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using Ardalis.ApiEndpoints;
using Mediator;
using Microsoft.AspNetCore.Mvc;
using OneOf;
using OneOf.Types;
using SF.PhotoPixels.Application.Query.Album;
using Swashbuckle.AspNetCore.Annotations;

namespace SF.PhotoPixels.API.Endpoints.AlbumEndpoints
{
public class GetAlbumInfo: EndpointBaseAsync
.WithRequest<GetAlbumInfoRequest>
.WithActionResult<OneOf<GetAlbumInfoResponse, NotFound>>
{
private readonly IMediator _mediator;

public GetAlbumInfo(IMediator mediator)
{
_mediator = mediator;
}

[HttpGet("/album/{albumId}")]
[SwaggerOperation(
Summary = "Gets album info",
Description = "Gets album info",
OperationId = "Get_Album_Info",
Tags = new[] { "Album operations" }),
]

public override async Task<ActionResult<OneOf<GetAlbumInfoResponse, NotFound>>> HandleAsync([FromRoute] GetAlbumInfoRequest request, CancellationToken cancellationToken = default)
{
var result = await _mediator.Send(request, cancellationToken);

return result.Match<ActionResult<OneOf<GetAlbumInfoResponse, NotFound>>>(
response => new OkObjectResult(response),
NotFound => new NotFoundResult()
);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using Ardalis.ApiEndpoints;
using Mediator;
using Microsoft.AspNetCore.Mvc;
using OneOf;
using SF.PhotoPixels.Application;
using SF.PhotoPixels.Application.Query.Album;
using Swashbuckle.AspNetCore.Annotations;

namespace SF.PhotoPixels.API.Endpoints.AlbumEndpoints;

public class GetAlbumItems : EndpointBaseAsync.WithRequest<GetAlbumItemsRequest>.WithActionResult<OneOf<GetAlbumItemsResponse, ValidationError>>
{
private readonly IMediator _mediator;

public GetAlbumItems(IMediator mediator)
{
_mediator = mediator;
}

[HttpGet("/album/{albumId}/{lastId?}")]
[SwaggerOperation(
Summary = "Get all album items",
Description = "Retrieves a list of all items in a specific album",
OperationId = "Get_Album_Items",
Tags = new[] { "Album operations" }),
]
public override async Task<ActionResult<OneOf<GetAlbumItemsResponse, ValidationError>>> HandleAsync([FromRoute] GetAlbumItemsRequest request, CancellationToken cancellationToken = default)
{
var result = await _mediator.Send(request, cancellationToken);

return result.Match<ActionResult<OneOf<GetAlbumItemsResponse, ValidationError>>>(
response => new OkObjectResult(response),
validationError => new BadRequestObjectResult(validationError)
);
}
}
37 changes: 37 additions & 0 deletions src/SF.PhotoPixels.API/Endpoints/AlbumEndpoints/GetAlbums.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using Ardalis.ApiEndpoints;
using Mediator;
using Microsoft.AspNetCore.Mvc;
using OneOf;
using SF.PhotoPixels.Application;
using SF.PhotoPixels.Application.Query.Album;

using Swashbuckle.AspNetCore.Annotations;

namespace SF.PhotoPixels.API.Endpoints.AlbumEndpoints;

public class GetAlbums : EndpointBaseAsync.WithoutRequest.WithActionResult<OneOf<GetAlbumsResponse, ValidationError>>
{
private readonly IMediator _mediator;

public GetAlbums(IMediator mediator)
{
_mediator = mediator;
}

[HttpGet("/album/")]
[SwaggerOperation(
Summary = "Get all albums",
Description = "Retrieves a list of all albums",
OperationId = "Get_Albums",
Tags = new[] { "Album operations" }),
]
public override async Task<ActionResult<OneOf<GetAlbumsResponse, ValidationError>>> HandleAsync(CancellationToken cancellationToken = default)
{
var result = await _mediator.Send(GetAlbumsRequest.Instance, cancellationToken);

return result.Match<ActionResult<OneOf<GetAlbumsResponse, ValidationError>>>(
response => new OkObjectResult(response),
validationError => new BadRequestObjectResult(validationError)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using Ardalis.ApiEndpoints;
using Mediator;
using Microsoft.AspNetCore.Mvc;
using OneOf;
using OneOf.Types;
using SF.PhotoPixels.Application;
using SF.PhotoPixels.Application.Commands.AlbumObjects;
using Swashbuckle.AspNetCore.Annotations;

namespace SF.PhotoPixels.API.Endpoints.AlbumEndpoints;

public class RemoveObjectsFromAlbum : EndpointBaseAsync
.WithRequest<DeleteAlbumObjectRequest>
.WithActionResult<OneOf<Success, ValidationError>>
{
private readonly IMediator _mediator;

public RemoveObjectsFromAlbum(IMediator mediator)
{
_mediator = mediator;
}

[HttpPost("/albums/{albumId}/objects:bulk-delete")]
[SwaggerOperation(
Summary = "Remove object(s) from album",
Description = "Remove object(s) from albumn. The actual objects remain intact. Just the album relation is removed.",
Tags = new[] { "Album operations" }),
]
public override async Task<ActionResult<OneOf<Success, ValidationError>>> HandleAsync(DeleteAlbumObjectRequest request, CancellationToken cancellationToken = default)
{
var result = await _mediator.Send(request, cancellationToken);

return result.Match<ActionResult<OneOf<Success, ValidationError>>>(
response => new OkObjectResult(response),
validationError => new BadRequestObjectResult(validationError)
);
}
}
37 changes: 37 additions & 0 deletions src/SF.PhotoPixels.API/Endpoints/AlbumEndpoints/UpdateAlbum.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using Ardalis.ApiEndpoints;
using Mediator;
using Microsoft.AspNetCore.Mvc;
using OneOf;
using OneOf.Types;
using SF.PhotoPixels.Application;
using SF.PhotoPixels.Application.Commands.Albums;
using Swashbuckle.AspNetCore.Annotations;

namespace SF.PhotoPixels.API.Endpoints.AlbumEndpoints;

public class UpdateAlbum : EndpointBaseAsync.WithRequest<UpdateAlbumRequest>.WithActionResult<OneOf<Success, ValidationError>>
{
private readonly IMediator _mediator;

public UpdateAlbum(IMediator mediator)
{
_mediator = mediator;
}

[HttpPut("/album/")]
[SwaggerOperation(
Summary = "Update an album",
Description = "Updates an album",
OperationId = "Update_Album",
Tags = new[] { "Album operations" }),
]
public override async Task<ActionResult<OneOf<Success, ValidationError>>> HandleAsync([FromBody] UpdateAlbumRequest request, CancellationToken cancellationToken = default)
{
var result = await _mediator.Send(request, cancellationToken);

return result.Match<ActionResult<OneOf<Success, ValidationError>>>(
response => new OkObjectResult(response),
validationError => new BadRequestObjectResult(validationError)
);
}
}
36 changes: 36 additions & 0 deletions src/SF.PhotoPixels.API/Endpoints/PhotosEndpoints/AddToAlbum.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using Ardalis.ApiEndpoints;
using Mediator;
using Microsoft.AspNetCore.Mvc;
using OneOf;
using OneOf.Types;
using SF.PhotoPixels.Application.Query.PhotoStorage.LoadMedia;
using Swashbuckle.AspNetCore.Annotations;

namespace SF.PhotoPixels.API.Endpoints.PhotosEndpoints;

public class AddToAlbum : EndpointBaseAsync.WithRequest<AddToAlbumRequest>.WithActionResult<OneOf<AddToAlbumResponse, NotFound>>
{
private readonly IMediator _mediator;

public AddToAlbum(IMediator mediator)
{
_mediator = mediator;
}

[HttpGet("object/{objectId}/album/{albumId}")]
[SwaggerOperation(
Summary = "Add item to an album",
Description = "Adds a photo/video to an album",
OperationId = "Add_To_Album",
Tags = new[] { "Album operations" }),
]
public override async Task<ActionResult<OneOf<AddToAlbumResponse, NotFound>>> HandleAsync([FromRoute] AddToAlbumRequest request, CancellationToken cancellationToken = default)
{
var result = await _mediator.Send(request, cancellationToken);

return result.Match<ActionResult<OneOf<AddToAlbumResponse, NotFound>>>(
response => new OkObjectResult(response),
notFound => new NotFoundResult()
);
}
}
Loading
Loading