Refactoring, database structure changed

This commit is contained in:
2025-03-03 00:56:32 +01:00
Unverified
parent d3805ef3db
commit c603c41c0b
913 changed files with 21764 additions and 32775 deletions

View File

@@ -0,0 +1,193 @@
using Ardalis.Result;
using Ardalis.Result.AspNetCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using WatchIt.Database.Model.Media;
using WatchIt.DTO.Models.Controllers.Accounts.Account;
using WatchIt.DTO.Models.Controllers.Accounts.AccountBackgroundPicture;
using WatchIt.DTO.Models.Controllers.Accounts.AccountEmail;
using WatchIt.DTO.Models.Controllers.Accounts.AccountLogout;
using WatchIt.DTO.Models.Controllers.Accounts.AccountPassword;
using WatchIt.DTO.Models.Controllers.Accounts.AccountProfileInfo;
using WatchIt.DTO.Models.Controllers.Accounts.AccountUsername;
using WatchIt.DTO.Models.Controllers.Media.Medium.Query;
using WatchIt.DTO.Models.Controllers.Media.Medium.Response;
using WatchIt.DTO.Models.Controllers.People.Person;
using WatchIt.DTO.Models.Controllers.People.Person.Query;
using WatchIt.DTO.Models.Controllers.Photos.Photo;
using WatchIt.DTO.Models.Generics.Image;
using WatchIt.DTO.Query;
using WatchIt.WebAPI.BusinessLogic.Accounts;
namespace WatchIt.WebAPI.Controllers;
[ApiController]
[Route("accounts")]
public class AccountsController(IAccountsBusinessLogic accountsBusinessLogic) : ControllerBase
{
#region Main
[HttpGet]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<AccountResponse>>> GetAccounts([FromQuery]AccountFilterQuery filterQuery, [FromQuery]OrderQuery orderQuery, [FromQuery]PagingQuery pagingQuery, [FromQuery(Name = "include_profile_pictures")]bool includeProfilePictures = false) =>
await accountsBusinessLogic.GetAccounts(filterQuery, orderQuery, pagingQuery, includeProfilePictures);
[HttpGet("{id:long}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<AccountResponse>> GetAccount([FromRoute(Name = "id")] long id, [FromQuery(Name = "include_profile_pictures")]bool includeProfilePictures = false) =>
await accountsBusinessLogic.GetAccount(id, includeProfilePictures);
[HttpPost]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<AccountResponse>> PostAccount([FromBody]AccountRequest body) =>
await accountsBusinessLogic.PostAccount(body);
#endregion
#region Profile picture
[HttpGet("{id:long}/profile_picture")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<ImageResponse>> GetAccountProfilePicture([FromRoute(Name = "id")] long id) =>
await accountsBusinessLogic.GetAccountProfilePicture(id);
[HttpPut("profile_picture")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result<ImageResponse>> PutAccountProfilePicture([FromBody] ImageRequest body) =>
await accountsBusinessLogic.PutAccountProfilePicture(body);
[HttpDelete("profile_picture")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> DeleteAccountProfilePicture() =>
await accountsBusinessLogic.DeleteAccountProfilePicture();
#endregion
#region Background picture
[HttpGet("{id:long}/background_picture")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<PhotoResponse>> GetAccountBackgroundPicture([FromRoute(Name = "id")] long id) =>
await accountsBusinessLogic.GetAccountBackgroundPicture(id);
[HttpPut("background_picture")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result<PhotoResponse>> PutAccountBackgroundPicture([FromBody] AccountBackgroundPictureRequest body) =>
await accountsBusinessLogic.PutAccountBackgroundPicture(body);
[HttpDelete("background_picture")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> DeleteAccountBackgroundPicture() =>
await accountsBusinessLogic.DeleteAccountBackgroundPicture();
#endregion
#region Profile edit
[HttpPatch("profile_info")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> PatchAccountProfileInfo([FromBody] AccountProfileInfoRequest body) =>
await accountsBusinessLogic.PatchAccountProfileInfo(body);
[HttpPatch("username")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> PatchAccountUsername([FromBody] AccountUsernameRequest body) =>
await accountsBusinessLogic.PatchAccountUsername(body);
[HttpPatch("email")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> PatchAccountEmail([FromBody] AccountEmailRequest body) =>
await accountsBusinessLogic.PatchAccountEmail(body);
[HttpPatch("password")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> PatchAccountPassword([FromBody] AccountPasswordRequest body) =>
await accountsBusinessLogic.PatchAccountPassword(body);
#endregion
#region Log out
[HttpDelete("logout")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result> Logout([FromBody]AccountLogoutRequest body) =>
await accountsBusinessLogic.Logout(body);
[HttpDelete("logout_all")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> LogoutAll() =>
await accountsBusinessLogic.LogoutAll();
#endregion
#region Follows
[HttpGet("{id:long}/follows")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<AccountResponse>>> GetAccountFollows([FromRoute(Name = "id")] long id, [FromQuery] AccountFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery) =>
await accountsBusinessLogic.GetAccountFollows(id, filterQuery, orderQuery, pagingQuery);
[HttpGet("{id:long}/followers")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<AccountResponse>>> GetAccountFollowers([FromRoute(Name = "id")] long id, [FromQuery] AccountFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery) =>
await accountsBusinessLogic.GetAccountFollowers(id, filterQuery, orderQuery, pagingQuery);
[HttpPost("follows/{followed_account_id:long}")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> PostAccountFollow([FromRoute(Name = "followed_account_id")] long followedAccountId) =>
await accountsBusinessLogic.PostAccountFollow(followedAccountId);
[HttpDelete("follows/{followed_account_id:long}")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> DeleteAccountFollow([FromRoute(Name = "followed_account_id")] long followedAccountId) =>
await accountsBusinessLogic.DeleteAccountFollow(followedAccountId);
#endregion
#region Ratings
[HttpGet("{id:long}/media")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<MediumUserRatedResponse>>> GetAccountRatedMedia([FromRoute(Name = "id")] long id, [FromQuery]MediumFilterQuery filterQuery, [FromQuery]MediumUserRatedFilterQuery<Medium> userRatedFilterQuery, [FromQuery]OrderQuery orderQuery, [FromQuery]PagingQuery pagingQuery, [FromQuery(Name = "include_pictures")]bool includePictures = false) =>
await accountsBusinessLogic.GetAccountRatedMedia(id, filterQuery, userRatedFilterQuery, orderQuery, pagingQuery, includePictures);
[HttpGet("{id:long}/media/movies")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<MediumMovieUserRatedResponse>>> GetAccountRatedMediaMovies([FromRoute(Name = "id")] long id, [FromQuery]MediumMovieFilterQuery filterQuery, [FromQuery]MediumUserRatedFilterQuery<MediumMovie> userRatedFilterQuery, [FromQuery]OrderQuery orderQuery, [FromQuery]PagingQuery pagingQuery, [FromQuery(Name = "include_pictures")]bool includePictures = false) =>
await accountsBusinessLogic.GetAccountRatedMediaMovies(id, filterQuery, userRatedFilterQuery, orderQuery, pagingQuery, includePictures);
[HttpGet("{id:long}/media/series")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<MediumSeriesUserRatedResponse>>> GetAccountRatedMediaSeries([FromRoute(Name = "id")] long id, [FromQuery]MediumSeriesFilterQuery filterQuery, [FromQuery]MediumUserRatedFilterQuery<MediumSeries> userRatedFilterQuery, [FromQuery]OrderQuery orderQuery, [FromQuery]PagingQuery pagingQuery, [FromQuery(Name = "include_pictures")]bool includePictures = false) =>
await accountsBusinessLogic.GetAccountRatedMediaSeries(id, filterQuery, userRatedFilterQuery, orderQuery, pagingQuery, includePictures);
[HttpGet("{id:long}/people")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<PersonUserRatedResponse>>> GetAccountRatedPeople([FromRoute(Name = "id")] long id, [FromQuery]PersonFilterQuery filterQuery, [FromQuery]PersonUserRatedFilterQuery userRatedFilterQuery, [FromQuery]OrderQuery orderQuery, [FromQuery]PagingQuery pagingQuery, [FromQuery(Name = "include_pictures")]bool includePictures = false) =>
await accountsBusinessLogic.GetAccountRatedPeople(id, filterQuery, userRatedFilterQuery, orderQuery, pagingQuery, includePictures);
#endregion
}

View File

@@ -0,0 +1,24 @@
using Ardalis.Result;
using Ardalis.Result.AspNetCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using WatchIt.DTO.Models.Controllers.Accounts.Account;
using WatchIt.DTO.Models.Controllers.Authentication;
using WatchIt.WebAPI.BusinessLogic.Authentication;
namespace WatchIt.WebAPI.Controllers;
[ApiController]
[Route("authentication")]
public class AuthenticationController(IAuthenticationBusinessLogic authenticationBusinessLogic) : ControllerBase
{
[HttpPost("authenticate")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<AuthenticationResponse>> Authenticate([FromBody]AuthenticationRequest body) => await authenticationBusinessLogic.Authenticate(body);
[HttpPost("authenticate_refresh")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<AuthenticationResponse>> AuthenticateRefresh([FromBody]AuthenticationRefreshRequest body) => await authenticationBusinessLogic.AuthenticateRefresh(body);
}

View File

@@ -0,0 +1,39 @@
using Ardalis.Result;
using Ardalis.Result.AspNetCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using WatchIt.DTO.Models.Controllers.Genders.Gender;
using WatchIt.DTO.Query;
using WatchIt.WebAPI.BusinessLogic.Genders;
using WatchIt.WebAPI.Constants;
namespace WatchIt.WebAPI.Controllers;
[ApiController]
[Route("genders")]
public class GendersController(IGendersBusinessLogic gendersBusinessLogic) : ControllerBase
{
[HttpGet]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<GenderResponse>>> GetGenders([FromQuery] GenderFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery) =>
await gendersBusinessLogic.GetGenders(filterQuery, orderQuery, pagingQuery);
[HttpGet("{id}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<GenderResponse>> GetGender([FromRoute(Name = "id")] short id) =>
await gendersBusinessLogic.GetGender(id);
[HttpPost]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<GenderResponse>> PostGender([FromBody] GenderRequest body) =>
await gendersBusinessLogic.PostGender(body);
[HttpDelete("{id}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> DeleteGender([FromRoute(Name = "id")] short id) =>
await gendersBusinessLogic.DeleteGender(id);
}

View File

@@ -0,0 +1,39 @@
using Ardalis.Result;
using Ardalis.Result.AspNetCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using WatchIt.DTO.Models.Controllers.Genres.Genre;
using WatchIt.DTO.Query;
using WatchIt.WebAPI.BusinessLogic.Genres;
using WatchIt.WebAPI.Constants;
namespace WatchIt.WebAPI.Controllers;
[ApiController]
[Route("genres")]
public class GenresController(IGenresBusinessLogic genresBusinessLogic) : ControllerBase
{
[HttpGet]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<GenreResponse>>> GetGenres([FromQuery] GenreFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery) =>
await genresBusinessLogic.GetGenres(filterQuery, orderQuery, pagingQuery);
[HttpGet("{id}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<GenreResponse>> GetGenre([FromRoute(Name = "id")] short id) =>
await genresBusinessLogic.GetGenre(id);
[HttpPost]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<GenreResponse>> PostGenre([FromBody] GenreRequest body) =>
await genresBusinessLogic.PostGenre(body);
[HttpDelete("{id}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> DeleteGenre([FromRoute(Name = "id")] short id) =>
await genresBusinessLogic.DeleteGenre(id);
}

View File

@@ -0,0 +1,184 @@
using Ardalis.Result;
using Ardalis.Result.AspNetCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using WatchIt.DTO.Models.Controllers.Genres.Genre;
using WatchIt.DTO.Models.Controllers.Media.Medium.Query;
using WatchIt.DTO.Models.Controllers.Media.Medium.Request;
using WatchIt.DTO.Models.Controllers.Media.Medium.Response;
using WatchIt.DTO.Models.Controllers.Photos.Photo;
using WatchIt.DTO.Models.Controllers.Roles.Role.Response;
using WatchIt.DTO.Models.Generics.Image;
using WatchIt.DTO.Models.Generics.Rating;
using WatchIt.DTO.Query;
using WatchIt.WebAPI.BusinessLogic.Media;
using WatchIt.WebAPI.Constants;
namespace WatchIt.WebAPI.Controllers;
[ApiController]
[Route("media")]
public class MediaController(IMediaBusinessLogic mediaBusinessLogic) : ControllerBase
{
#region Main
[HttpGet]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<MediumResponse>>> GetMedia([FromQuery] MediumFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery, [FromQuery(Name = "include_pictures")]bool includePictures = false) =>
await mediaBusinessLogic.GetMedia(filterQuery, orderQuery, pagingQuery, includePictures);
[HttpGet("{id:long}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<MediumResponse>> GetMedium([FromRoute(Name = "id")] long id, [FromQuery(Name = "include_pictures")]bool includePictures = false) =>
await mediaBusinessLogic.GetMedium(id, includePictures);
[HttpGet("movies")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<MediumMovieResponse>>> GetMediumMovies([FromQuery] MediumMovieFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery, [FromQuery(Name = "include_pictures")]bool includePictures = false) =>
await mediaBusinessLogic.GetMediumMovies(filterQuery, orderQuery, pagingQuery, includePictures);
[HttpGet("movies/{id:long}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<MediumMovieResponse>> GetMediumMovie([FromRoute(Name = "id")] long id, [FromQuery(Name = "include_pictures")]bool includePictures = false) =>
await mediaBusinessLogic.GetMediumMovie(id, includePictures);
[HttpGet("series")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<MediumSeriesResponse>>> GetMediumSeries([FromQuery] MediumSeriesFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery, [FromQuery(Name = "include_pictures")]bool includePictures = false) =>
await mediaBusinessLogic.GetMediumSeries(filterQuery, orderQuery, pagingQuery, includePictures);
[HttpGet("series/{id:long}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<MediumSeriesResponse>> GetMediumSeries([FromRoute(Name = "id")] long id, [FromQuery(Name = "include_pictures")]bool includePictures = false) =>
await mediaBusinessLogic.GetMediumSeries(id, includePictures);
[HttpPost("movies")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<MediumMovieResponse>> PostMediumMovie([FromBody] MediumMovieRequest body) =>
await mediaBusinessLogic.PostMediumMovie(body);
[HttpPost("series")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<MediumSeriesResponse>> PostMediumSeries([FromBody] MediumSeriesRequest body) =>
await mediaBusinessLogic.PostMediumSeries(body);
[HttpPut("movies/{id:long}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<MediumMovieResponse>> PutMediumMovie([FromRoute(Name = "id")] long id, [FromBody] MediumMovieRequest body) =>
await mediaBusinessLogic.PutMediumMovie(id, body);
[HttpPut("series/{id:long}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<MediumSeriesResponse>> PutMediumSeries([FromRoute(Name = "id")] long id, [FromBody] MediumSeriesRequest body) =>
await mediaBusinessLogic.PutMediumSeries(id, body);
[HttpDelete("{id:long}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> DeleteMedium([FromRoute(Name = "id")] long id) =>
await mediaBusinessLogic.DeleteMedium(id);
#endregion
#region Genres
[HttpGet("{id:long}/genres")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<GenreResponse>>> GetMediumGenres([FromRoute(Name = "id")] long id, [FromQuery] GenreFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery) =>
await mediaBusinessLogic.GetMediumGenres(id, filterQuery, orderQuery, pagingQuery);
[HttpPost("{id:long}/genres/{genre_id}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> PostMediumGenre([FromRoute(Name = "id")] long id, [FromRoute(Name = "genre_id")] short genreId) =>
await mediaBusinessLogic.PostMediumGenre(id, genreId);
[HttpDelete("{id:long}/genres/{genre_id}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> DeleteMediumGenre([FromRoute(Name = "id")] long id, [FromRoute(Name = "genre_id")] short genreId) =>
await mediaBusinessLogic.DeleteMediumGenre(id, genreId);
#endregion
#region Rating
[HttpGet("{id:long}/rating")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<RatingOverallResponse>> GetMediumRating([FromRoute(Name = "id")] long id) =>
await mediaBusinessLogic.GetMediumRating(id);
[HttpGet("{id:long}/rating/{account_id:long}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<RatingUserResponse>> GetMediumUserRating([FromRoute(Name = "id")] long id, [FromRoute(Name = "account_id")] long accountId) =>
await mediaBusinessLogic.GetMediumUserRating(id, accountId);
[HttpPut("{id:long}/rating")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> PutMediumRating([FromRoute(Name = "id")] long id, [FromBody] RatingRequest body) =>
await mediaBusinessLogic.PutMediumRating(id, body);
[HttpDelete("{id:long}/rating")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> DeleteMediumRating([FromRoute(Name = "id")] long id) =>
await mediaBusinessLogic.DeleteMediumRating(id);
#endregion
#region View Count
[HttpPut("{id:long}/view_count")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result> PutMediumViewCount([FromRoute(Name = "id")] long id) =>
await mediaBusinessLogic.PutMediumViewCount(id);
#endregion
#region Picture
[HttpGet("{id:long}/picture")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<ImageResponse>> GetMediumPicture([FromRoute(Name = "id")] long id) =>
await mediaBusinessLogic.GetMediumPicture(id);
[HttpPut("{id:long}/picture")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<ImageResponse>> PutMediumPicture([FromRoute(Name = "id")] long id, [FromBody] ImageRequest body) =>
await mediaBusinessLogic.PutMediumPicture(id, body);
[HttpDelete("{id:long}/picture")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> DeleteMediumPicture([FromRoute(Name = "id")] long id) =>
await mediaBusinessLogic.DeleteMediumPicture(id);
#endregion
#region Photos
[HttpGet("{id:long}/photos/background")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<PhotoResponse?>> GetMediumBackgroundPhoto([FromRoute(Name = "id")] long id) =>
await mediaBusinessLogic.GetMediumPhotoBackground(id);
#endregion
}

View File

@@ -0,0 +1,100 @@
using Ardalis.Result;
using Ardalis.Result.AspNetCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using WatchIt.DTO.Models.Controllers.People.Person;
using WatchIt.DTO.Models.Controllers.People.Person.Query;
using WatchIt.DTO.Models.Generics.Image;
using WatchIt.DTO.Models.Generics.Rating;
using WatchIt.DTO.Query;
using WatchIt.WebAPI.BusinessLogic.People;
using WatchIt.WebAPI.Constants;
namespace WatchIt.WebAPI.Controllers;
[ApiController]
[Route("people")]
public class PeopleController(IPeopleBusinessLogic peopleBusinessLogic) : ControllerBase
{
#region Main
[HttpGet]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<PersonResponse>>> GetPeople([FromQuery] PersonFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery, [FromQuery(Name = "include_pictures")]bool includePictures = false) =>
await peopleBusinessLogic.GetPeople(filterQuery, orderQuery, pagingQuery, includePictures);
[HttpGet("{id:long}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<PersonResponse>> GetPerson([FromRoute(Name = "id")] long id, [FromQuery(Name = "include_pictures")]bool includePictures = false) =>
await peopleBusinessLogic.GetPerson(id, includePictures);
[HttpPost]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<PersonResponse>> PostPerson([FromBody] PersonRequest body) =>
await peopleBusinessLogic.PostPerson(body);
[HttpPut("{id:long}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<PersonResponse>> PutPerson([FromRoute(Name = "id")] long id, [FromBody] PersonRequest body) =>
await peopleBusinessLogic.PutPerson(id, body);
[HttpDelete("{id:long}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> DeletePerson([FromRoute(Name = "id")] long id) =>
await peopleBusinessLogic.DeletePerson(id);
#endregion
#region Rating
[HttpGet("{id:long}/rating")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<RatingOverallResponse>> GetPersonRating([FromRoute(Name = "id")] long id) =>
await peopleBusinessLogic.GetPersonRating(id);
[HttpGet("{id:long}/rating/{account_id:long}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<RatingUserOverallResponse>> GetPersonUserRating([FromRoute(Name = "id")] long id, [FromRoute(Name = "account_id")] long accountId) =>
await peopleBusinessLogic.GetPersonUserRating(id, accountId);
#endregion
#region View Count
[HttpPut("{id:long}/view_count")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result> PutPeopleViewCount([FromRoute(Name = "id")] long id) =>
await peopleBusinessLogic.PutPeopleViewCount(id);
#endregion
#region Picture
[HttpGet("{id:long}/picture")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<ImageResponse>> GetPersonPicture([FromRoute(Name = "id")] long id) =>
await peopleBusinessLogic.GetPersonPicture(id);
[HttpPut("{id:long}/picture")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<ImageResponse>> PutPersonPicture([FromRoute(Name = "id")] long id, [FromBody] ImageRequest body) =>
await peopleBusinessLogic.PutPersonPicture(id, body);
[HttpDelete("{id:long}/picture")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> DeletePersonPicture([FromRoute(Name = "id")] long id) =>
await peopleBusinessLogic.DeletePersonPicture(id);
#endregion
}

View File

@@ -0,0 +1,72 @@
using Ardalis.Result;
using Ardalis.Result.AspNetCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using WatchIt.DTO.Models.Controllers.Photos.Photo;
using WatchIt.DTO.Models.Controllers.Photos.PhotoBackground;
using WatchIt.DTO.Query;
using WatchIt.WebAPI.BusinessLogic.Photos;
using WatchIt.WebAPI.Constants;
namespace WatchIt.WebAPI.Controllers;
[ApiController]
[Route("photos")]
public class PhotosController(IPhotosBusinessLogic photosBusinessLogic) : ControllerBase
{
#region Main
[HttpGet("{id:guid}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<PhotoResponse>> GetPhoto([FromRoute(Name = "id")] Guid id) =>
await photosBusinessLogic.GetPhoto(id);
[HttpGet]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<PhotoResponse>>> GetPhotos([FromQuery] PhotoFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery) =>
await photosBusinessLogic.GetPhotos(filterQuery, orderQuery, pagingQuery);
[HttpPost]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<PhotoResponse>> PostPhoto([FromBody] PhotoRequest body) =>
await photosBusinessLogic.PostPhoto(body);
[HttpPut("{id:guid}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<PhotoResponse>> PutPhoto([FromRoute(Name = "id")] Guid id, [FromBody] PhotoRequest body) =>
await photosBusinessLogic.PutPhoto(id, body);
[HttpDelete("{id:guid}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> DeletePhoto([FromRoute(Name = "id")] Guid id) =>
await photosBusinessLogic.DeletePhoto(id);
#endregion
#region Background
[HttpGet("background")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<PhotoResponse>> GetPhotoBackground() =>
await photosBusinessLogic.GetPhotoBackground();
[HttpPut("{photo_id:guid}/background")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<PhotoBackgroundResponse>> PutPhotoBackground([FromRoute(Name = "photo_id")] Guid photoId, [FromBody] PhotoBackgroundRequest body) =>
await photosBusinessLogic.PutPhotoBackground(photoId, body);
[HttpDelete("{photo_id:guid}/background")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> DeletePhotoBackground([FromRoute(Name = "photo_id")] Guid photoId) =>
await photosBusinessLogic.DeletePhotoBackground(photoId);
#endregion
}

View File

@@ -0,0 +1,162 @@
using Ardalis.Result;
using Ardalis.Result.AspNetCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using WatchIt.DTO.Models.Controllers.Roles.Role.Query;
using WatchIt.DTO.Models.Controllers.Roles.Role.Request;
using WatchIt.DTO.Models.Controllers.Roles.Role.Response;
using WatchIt.DTO.Models.Controllers.Roles.RoleActorType;
using WatchIt.DTO.Models.Controllers.Roles.RoleCreatorType;
using WatchIt.DTO.Models.Generics.Rating;
using WatchIt.DTO.Query;
using WatchIt.WebAPI.BusinessLogic.Roles;
using WatchIt.WebAPI.Constants;
namespace WatchIt.WebAPI.Controllers;
[ApiController]
[Route("roles")]
public class RolesController(IRolesBusinessLogic rolesBusinessLogic) : ControllerBase
{
#region Main - CRUD
[HttpGet("actors")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<RoleActorResponse>>> GetRoleActors([FromQuery] RoleActorFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery) =>
await rolesBusinessLogic.GetRoleActors(filterQuery, orderQuery, pagingQuery);
[HttpGet("actors/{id:guid}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<RoleActorResponse>> GetRoleActor([FromRoute] Guid id) =>
await rolesBusinessLogic.GetRoleActor(id);
[HttpGet("creators")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<RoleCreatorResponse>>> GetRoleCreators([FromQuery] RoleCreatorFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery) =>
await rolesBusinessLogic.GetRoleCreators(filterQuery, orderQuery, pagingQuery);
[HttpGet("creators/{id:guid}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<RoleCreatorResponse>> GetRoleCreator([FromRoute] Guid id) =>
await rolesBusinessLogic.GetRoleCreator(id);
[HttpPost("actors")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<RoleActorResponse>> PostRoleActor([FromBody] RoleActorRequest body) =>
await rolesBusinessLogic.PostRoleActor(body);
[HttpPost("creators")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<RoleCreatorResponse>> PostRoleCreator([FromBody] RoleCreatorRequest body) =>
await rolesBusinessLogic.PostRoleCreator(body);
[HttpPut("actors/{id:guid}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<RoleActorResponse>> PutRoleActor([FromRoute] Guid id, [FromBody] RoleActorRequest body) =>
await rolesBusinessLogic.PutRoleActor(id, body);
[HttpPut("creators/{id:guid}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<RoleCreatorResponse>> PutRoleCreator([FromRoute] Guid id, [FromBody] RoleCreatorRequest body) =>
await rolesBusinessLogic.PutRoleCreator(id, body);
[HttpDelete("{id:guid}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> DeleteRole([FromRoute] Guid id) =>
await rolesBusinessLogic.DeleteRole(id);
#endregion
#region Main - Rating
[HttpGet("{id:guid}/rating")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<RatingOverallResponse>> GetRoleRating([FromRoute] Guid id) =>
await rolesBusinessLogic.GetRoleRating(id);
[HttpGet("{id:guid}/rating/{account_id:long}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<RatingUserResponse>> GetRoleUserRating([FromRoute] Guid id, [FromRoute(Name = "account_id")] long accountId) =>
await rolesBusinessLogic.GetRoleUserRating(id, accountId);
[HttpPut("{id:guid}/rating")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> PutRoleRating([FromRoute] Guid id, [FromBody] RatingRequest body) =>
await rolesBusinessLogic.PutRoleRating(id, body);
[HttpDelete("{id:guid}/rating")]
[Authorize]
[TranslateResultToActionResult]
public async Task<Result> DeleteRoleRating([FromRoute] Guid id) =>
await rolesBusinessLogic.DeleteRoleRating(id);
#endregion
#region ActorTypes
[HttpGet("actors/types")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<RoleActorTypeResponse>>> GetRoleActorTypes([FromQuery] RoleActorTypeFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery) =>
await rolesBusinessLogic.GetRoleActorTypes(filterQuery, orderQuery, pagingQuery);
[HttpGet("actors/types/{role_actor_type_id}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<RoleActorTypeResponse>> GetRoleActorType([FromRoute(Name = "role_actor_type_id")] short roleActorTypeId) =>
await rolesBusinessLogic.GetRoleActorType(roleActorTypeId);
[HttpPost("actors/types")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<RoleActorTypeResponse>> PostRoleActorType([FromBody] RoleActorTypeRequest body) =>
await rolesBusinessLogic.PostRoleActorType(body);
[HttpDelete("actors/types/{role_actor_type_id}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> DeleteRoleActorType([FromRoute(Name = "role_actor_type_id")] short roleActorTypeId) =>
await rolesBusinessLogic.DeleteRoleActorType(roleActorTypeId);
#endregion
#region CreatorTypes
[HttpGet("creators/types")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<IEnumerable<RoleCreatorTypeResponse>>> GetRoleCreatorTypes([FromQuery] RoleCreatorTypeFilterQuery filterQuery, [FromQuery] OrderQuery orderQuery, [FromQuery] PagingQuery pagingQuery) =>
await rolesBusinessLogic.GetRoleCreatorTypes(filterQuery, orderQuery, pagingQuery);
[HttpGet("creators/types/{role_creator_type_id}")]
[AllowAnonymous]
[TranslateResultToActionResult]
public async Task<Result<RoleCreatorTypeResponse>> GetRoleCreatorType([FromRoute(Name = "role_creator_type_id")] short roleCreatorTypeId) =>
await rolesBusinessLogic.GetRoleCreatorType(roleCreatorTypeId);
[HttpPost("creators/types")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result<RoleCreatorTypeResponse>> PostRoleCreatorType([FromBody] RoleCreatorTypeRequest body) =>
await rolesBusinessLogic.PostRoleCreatorType(body);
[HttpDelete("creators/types/{role_creator_type_id}")]
[Authorize(Policy = Policies.Admin)]
[TranslateResultToActionResult]
public async Task<Result> DeleteRoleCreatorType([FromRoute(Name = "role_creator_type_id")] short roleCreatorTypeId) =>
await rolesBusinessLogic.DeleteRoleCreatorType(roleCreatorTypeId);
#endregion
}