2025-08-08 15:56:37 -04:00
import { Body , Controller , Delete , Get , HttpCode , HttpStatus , Param , Patch , Post , Put , Query } from '@nestjs/common' ;
2025-11-11 17:01:14 -05:00
import { ApiOperation , ApiTags } from '@nestjs/swagger' ;
2024-03-20 23:53:07 +01:00
import {
AddUsersDto ,
AlbumInfoDto ,
AlbumResponseDto ,
2025-08-18 20:42:47 -04:00
AlbumsAddAssetsDto ,
AlbumsAddAssetsResponseDto ,
2024-08-20 07:50:36 -04:00
AlbumStatisticsResponseDto ,
2024-03-20 23:53:07 +01:00
CreateAlbumDto ,
GetAlbumsDto ,
UpdateAlbumDto ,
2024-04-25 06:19:49 +02:00
UpdateAlbumUserDto ,
2024-03-20 23:53:07 +01:00
} from 'src/dtos/album.dto' ;
import { BulkIdResponseDto , BulkIdsDto } from 'src/dtos/asset-ids.response.dto' ;
import { AuthDto } from 'src/dtos/auth.dto' ;
2025-11-11 17:01:14 -05:00
import { ApiTag , Permission } from 'src/enum' ;
2024-05-09 13:58:44 -04:00
import { Auth , Authenticated } from 'src/middleware/auth.guard' ;
2024-03-21 00:07:30 +01:00
import { AlbumService } from 'src/services/album.service' ;
2024-03-20 15:04:03 -05:00
import { ParseMeUUIDPipe , UUIDParamDto } from 'src/validation' ;
2023-03-26 04:46:48 +02:00
2025-11-11 17:01:14 -05:00
@ApiTags ( ApiTag . Albums )
2024-05-22 13:24:57 -04:00
@Controller ( 'albums' )
2023-03-26 04:46:48 +02:00
export class AlbumController {
constructor ( private service : AlbumService ) { }
@Get ( )
2025-07-15 14:50:13 -04:00
@Authenticated ( { permission : Permission.AlbumRead } )
2025-11-11 17:01:14 -05:00
@ApiOperation ( {
summary : 'List all albums' ,
description : 'Retrieve a list of albums available to the authenticated user.' ,
} )
2023-12-09 23:34:12 -05:00
getAllAlbums ( @Auth ( ) auth : AuthDto , @Query ( ) query : GetAlbumsDto ) : Promise < AlbumResponseDto [ ] > {
return this . service . getAll ( auth , query ) ;
2023-05-24 22:10:45 -04:00
}
@Post ( )
2025-07-15 14:50:13 -04:00
@Authenticated ( { permission : Permission.AlbumCreate } )
2025-11-11 17:01:14 -05:00
@ApiOperation ( {
summary : 'Create an album' ,
description : 'Create a new album. The album can also be created with initial users and assets.' ,
} )
2024-03-20 19:32:04 +01:00
createAlbum ( @Auth ( ) auth : AuthDto , @Body ( ) dto : CreateAlbumDto ) : Promise < AlbumResponseDto > {
2023-12-09 23:34:12 -05:00
return this . service . create ( auth , dto ) ;
2023-03-26 04:46:48 +02:00
}
2023-05-25 15:37:19 -04:00
2024-08-20 07:50:36 -04:00
@Get ( 'statistics' )
2025-07-15 14:50:13 -04:00
@Authenticated ( { permission : Permission.AlbumStatistics } )
2025-11-11 17:01:14 -05:00
@ApiOperation ( {
summary : 'Retrieve album statistics' ,
description : 'Returns statistics about the albums available to the authenticated user.' ,
} )
2024-08-20 07:50:36 -04:00
getAlbumStatistics ( @Auth ( ) auth : AuthDto ) : Promise < AlbumStatisticsResponseDto > {
return this . service . getStatistics ( auth ) ;
}
2025-07-15 14:50:13 -04:00
@Authenticated ( { permission : Permission.AlbumRead , sharedLink : true } )
2023-08-01 21:29:14 -04:00
@Get ( ':id' )
2025-11-11 17:01:14 -05:00
@ApiOperation ( {
summary : 'Retrieve an album' ,
description : 'Retrieve information about a specific album by its ID.' ,
} )
2023-11-19 23:16:24 +01:00
getAlbumInfo (
2023-12-09 23:34:12 -05:00
@Auth ( ) auth : AuthDto ,
2023-11-19 23:16:24 +01:00
@Param ( ) { id } : UUIDParamDto ,
@Query ( ) dto : AlbumInfoDto ,
) : Promise < AlbumResponseDto > {
2023-12-09 23:34:12 -05:00
return this . service . get ( auth , id , dto ) ;
2023-08-01 21:29:14 -04:00
}
2023-05-25 15:37:19 -04:00
@Patch ( ':id' )
2025-07-15 14:50:13 -04:00
@Authenticated ( { permission : Permission.AlbumUpdate } )
2025-11-11 17:01:14 -05:00
@ApiOperation ( {
summary : 'Update an album' ,
description :
'Update the information of a specific album by its ID. This endpoint can be used to update the album name, description, sort order, etc. However, it is not used to add or remove assets or users from the album.' ,
} )
2023-11-19 23:16:24 +01:00
updateAlbumInfo (
2023-12-09 23:34:12 -05:00
@Auth ( ) auth : AuthDto ,
2023-11-19 23:16:24 +01:00
@Param ( ) { id } : UUIDParamDto ,
2024-03-20 19:32:04 +01:00
@Body ( ) dto : UpdateAlbumDto ,
2023-11-19 23:16:24 +01:00
) : Promise < AlbumResponseDto > {
2023-12-09 23:34:12 -05:00
return this . service . update ( auth , id , dto ) ;
2023-05-25 15:37:19 -04:00
}
2023-05-26 09:04:09 -04:00
@Delete ( ':id' )
2025-07-15 14:50:13 -04:00
@Authenticated ( { permission : Permission.AlbumDelete } )
2025-08-08 15:56:37 -04:00
@HttpCode ( HttpStatus . NO_CONTENT )
2025-11-11 17:01:14 -05:00
@ApiOperation ( {
summary : 'Delete an album' ,
description :
'Delete a specific album by its ID. Note the album is initially trashed and then immediately scheduled for deletion, but relies on a background job to complete the process.' ,
} )
2023-12-09 23:34:12 -05:00
deleteAlbum ( @Auth ( ) auth : AuthDto , @Param ( ) { id } : UUIDParamDto ) {
return this . service . delete ( auth , id ) ;
2023-05-26 09:04:09 -04:00
}
2023-06-07 10:37:25 -04:00
2023-08-01 21:29:14 -04:00
@Put ( ':id/assets' )
2025-07-25 15:25:23 -04:00
@Authenticated ( { permission : Permission.AlbumAssetCreate , sharedLink : true } )
2025-11-11 17:01:14 -05:00
@ApiOperation ( {
summary : 'Add assets to an album' ,
description : 'Add multiple assets to a specific album by its ID.' ,
} )
2023-08-01 21:29:14 -04:00
addAssetsToAlbum (
2023-12-09 23:34:12 -05:00
@Auth ( ) auth : AuthDto ,
2023-08-01 21:29:14 -04:00
@Param ( ) { id } : UUIDParamDto ,
@Body ( ) dto : BulkIdsDto ,
) : Promise < BulkIdResponseDto [ ] > {
2023-12-09 23:34:12 -05:00
return this . service . addAssets ( auth , id , dto ) ;
2023-08-01 21:29:14 -04:00
}
2025-08-18 20:42:47 -04:00
@Put ( 'assets' )
@Authenticated ( { permission : Permission.AlbumAssetCreate , sharedLink : true } )
2025-11-11 17:01:14 -05:00
@ApiOperation ( {
summary : 'Add assets to albums' ,
description : 'Send a list of asset IDs and album IDs to add each asset to each album.' ,
} )
2025-08-18 20:42:47 -04:00
addAssetsToAlbums ( @Auth ( ) auth : AuthDto , @Body ( ) dto : AlbumsAddAssetsDto ) : Promise < AlbumsAddAssetsResponseDto > {
return this . service . addAssetsToAlbums ( auth , dto ) ;
}
2023-08-01 21:29:14 -04:00
@Delete ( ':id/assets' )
2025-07-25 15:25:23 -04:00
@Authenticated ( { permission : Permission.AlbumAssetDelete } )
2025-11-11 17:01:14 -05:00
@ApiOperation ( {
summary : 'Remove assets from an album' ,
description : 'Remove multiple assets from a specific album by its ID.' ,
} )
2023-08-01 21:29:14 -04:00
removeAssetFromAlbum (
2023-12-09 23:34:12 -05:00
@Auth ( ) auth : AuthDto ,
2023-08-01 21:29:14 -04:00
@Body ( ) dto : BulkIdsDto ,
@Param ( ) { id } : UUIDParamDto ,
) : Promise < BulkIdResponseDto [ ] > {
2023-12-09 23:34:12 -05:00
return this . service . removeAssets ( auth , id , dto ) ;
2023-08-01 21:29:14 -04:00
}
2023-06-07 10:37:25 -04:00
@Put ( ':id/users' )
2025-07-25 15:25:23 -04:00
@Authenticated ( { permission : Permission.AlbumUserCreate } )
2025-11-11 17:01:14 -05:00
@ApiOperation ( {
summary : 'Share album with users' ,
description : 'Share an album with multiple users. Each user can be given a specific role in the album.' ,
} )
2023-08-11 12:00:51 -04:00
addUsersToAlbum (
2023-12-09 23:34:12 -05:00
@Auth ( ) auth : AuthDto ,
2023-08-11 12:00:51 -04:00
@Param ( ) { id } : UUIDParamDto ,
@Body ( ) dto : AddUsersDto ,
) : Promise < AlbumResponseDto > {
2023-12-09 23:34:12 -05:00
return this . service . addUsers ( auth , id , dto ) ;
2023-06-07 10:37:25 -04:00
}
2024-04-25 06:19:49 +02:00
@Put ( ':id/user/:userId' )
2025-07-25 15:25:23 -04:00
@Authenticated ( { permission : Permission.AlbumUserUpdate } )
2025-08-08 15:56:37 -04:00
@HttpCode ( HttpStatus . NO_CONTENT )
2025-11-11 17:01:14 -05:00
@ApiOperation ( {
summary : 'Update user role' ,
description : 'Change the role for a specific user in a specific album.' ,
} )
2024-04-25 06:19:49 +02:00
updateAlbumUser (
@Auth ( ) auth : AuthDto ,
@Param ( ) { id } : UUIDParamDto ,
@Param ( 'userId' , new ParseMeUUIDPipe ( { version : '4' } ) ) userId : string ,
@Body ( ) dto : UpdateAlbumUserDto ,
) : Promise < void > {
return this . service . updateUser ( auth , id , userId , dto ) ;
}
2023-06-07 10:37:25 -04:00
@Delete ( ':id/user/:userId' )
2025-07-25 15:25:23 -04:00
@Authenticated ( { permission : Permission.AlbumUserDelete } )
2025-08-08 15:56:37 -04:00
@HttpCode ( HttpStatus . NO_CONTENT )
2025-11-11 17:01:14 -05:00
@ApiOperation ( {
summary : 'Remove user from album' ,
description : 'Remove a user from an album. Use an ID of "me" to leave a shared album.' ,
} )
2023-06-07 10:37:25 -04:00
removeUserFromAlbum (
2023-12-09 23:34:12 -05:00
@Auth ( ) auth : AuthDto ,
2023-06-07 10:37:25 -04:00
@Param ( ) { id } : UUIDParamDto ,
@Param ( 'userId' , new ParseMeUUIDPipe ( { version : '4' } ) ) userId : string ,
2025-08-08 15:56:37 -04:00
) : Promise < void > {
2023-12-09 23:34:12 -05:00
return this . service . removeUser ( auth , id , userId ) ;
2023-06-07 10:37:25 -04:00
}
2023-03-26 04:46:48 +02:00
}