Cloudsound is a full stack application that allows users to connect through music. Users can create their own music links by uploading their own music and song urls. Each song can be commented on allowing users to connect!
- Node
- Express
- React
- Redux
- Sequelize
- Install npm packages in frontend/backend folders
- Make .env file
- Migrate and seed with sequelize
- npm start
Some code I wrote to render the music saved to the back end!
All endpoints that require a current user to be logged in.
-
Request: endpoints that require authentication
-
Error Response: Require authentication
-
Status Code: 401
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Authentication required", "statusCode": 401 }
-
All endpoints that require authentication and the current user does not have the correct role(s) or permission(s).
-
Request: endpoints that require proper authorization
-
Error Response: Require proper authorization
-
Status Code: 403
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Forbidden", "statusCode": 403 }
-
Returns the information about the current user that is logged in.
-
Require Authentication: true
-
Request
- Method: GET
- URL: /api/users/:userId
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "firstName": "John", "lastName": "Smith", "email": "[email protected]", "username": "JohnSmith" }
-
Logs in a current user with valid credentials and returns the current user's information.
-
Require Authentication: false
-
Request
-
Method: POST
-
URL: /api/login
-
Headers:
- Content-Type: application/json
-
Body:
{ "credential": "[email protected]", "password": "secret password" }
-
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "firstName": "John", "lastName": "Smith", "email": "[email protected]", "username": "JohnSmith", "token": "" }
-
-
Error Response: Invalid credentials
-
Status Code: 401
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Invalid credentials", "statusCode": 401 }
-
-
Error response: Body validation errors
-
Status Code: 400
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Validation error", "statusCode": 400, "errors": { "credential": "Email or username is required", "password": "Password is required" } }
-
Creates a new user, logs them in as the current user, and returns the current user's information.
-
Require Authentication: false
-
Request
-
Method: POST
-
URL: /api/users
-
Headers:
- Content-Type: application/json
-
Body:
{ "firstName": "John", "lastName": "Smith", "username": "JohnSmith", "email": "[email protected]", "password": "secret password" }
-
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "firstName": "John", "lastName": "Smith", "username": "JohnSmith", "email": "[email protected]", "token": "" }
-
-
Error response: User already exists with the specified email
-
Status Code: 403
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "User already exists", "statusCode": 403, "errors": { "email": "User with that email already exists" } }
-
-
Error response: User already exists with the specified username
-
Status Code: 403
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "User already exists", "statusCode": 403, "errors": { "username": "User with that username already exists" } }
-
-
Error response: Body validation errors
-
Status Code: 400
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Validation error", "statusCode": 400, "errors": { "email": "Invalid email", "username": "Username is required", "firstName": "First Name is required", "lastName": "Last Name is required" } }
-
Returns all the songs.
-
Require Authentication: false
-
Request
- Method: GET
- URL: /api/songs
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "Songs": [ { "id": 1, "userId": 1, "albumId": 1, "title": "Yesterday", "description": "A song about the past.", "url": "audio url", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" } ] }
-
Returns all the songs created by the current user.
-
Require Authentication: true
-
Request
- Method: GET
- URL: /api/user/:userId/songs
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "Songs": [ { "id": 1, "userId": 1, "albumId": 1, "title": "Yesterday", "description": "A song about the past.", "url": "audio url", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" } ] }
-
Returns all the songs created by the specified artist.
-
Require Authentication: false
-
Request
- Method: GET
- URL: /api/artist/:artistId/songs
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "Songs": [ { "id": 1, "userId": 1, "albumId": 1, "title": "Yesterday", "description": "A song about the past.", "url": "audio url", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" } ] }
-
-
Error response: Couldn't find an Artist with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Artist couldn't be found", "statusCode": 404 }
-
Returns the details of a song specified by its id.
-
Require Authentication: false
-
Request
- Method: GET
- URL: /api/songs/:songId
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "userId": 1, "albumId": 1, "title": "Yesterday", "description": "A song about the past.", "url": "audio url", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url", "Artist": { "id": 1, "username": "JohnSmith", "previewImage": "image url" }, "Album": { "id": 1, "title": "Time", "previewImage": "image url" } }
-
-
Error response: Couldn't find a Song with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Song couldn't be found", "statusCode": 404 }
-
Creates and returns a new song with or without an album.
-
Require Authentication: true
-
Request
-
Method: POST
-
URL: /api/songs
-
Headers:
- Content-Type: application/json
-
Body without an album:
{ "title": "Yesterday", "description": "A song about the past.", "url": "audio url", "imageUrl": "image url", "albumId": null }
-
Body with an album:
{ "title": "Tomorrow", "description": "A song about the future.", "url": "audio url", "imageUrl": "image url", "albumId": 1 }
-
-
Successful Response
-
Status Code: 201
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "userId": 1, "albumId": null, "title": "Yesterday", "description": "A song about the past.", "url": "audio url", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" }
-
-
Error Response: Body validation error
-
Status Code: 400
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Validation Error", "statusCode": 400, "errors": { "title": "Song title is required", "url": "Audio is required" } }
-
-
Error response: Couldn't find an Album with the specified albumId if albumId is not null
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Album couldn't be found", "statusCode": 404 }
-
Updates and returns an existing song.
-
Require Authentication: true
-
Require proper authorization: Song must belong to the current user
-
Request
-
Method: PUT
-
URL: /api/songs/:songId
-
Headers:
- Content-Type: application/json
-
Body:
{ "title": "Yesterday", "description": "A song about the past.", "url": "audio url", "imageUrl": "image url", "albumId": null }
-
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "userId": 1, "albumId": null, "title": "Yesterday", "description": "A song about the past.", "url": "audio url", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-20 20:00:00", "previewImage": "image url" }
-
-
Error Response: Body validation error
-
Status Code: 400
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Validation Error", "statusCode": 400, "errors": { "title": "Song title is required", "url": "Audio is required" } }
-
-
Error response: Couldn't find a Song with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Song couldn't be found", "statusCode": 404 }
-
Deletes an existing song.
-
Require Authentication: true
-
Require proper authorization: Song must belong to the current user
-
Request
- Method: DELETE
- URL: /api/songs/:songId
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Successfully deleted", "statusCode": 200 }
-
-
Error response: Couldn't find a Song with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Song couldn't be found", "statusCode": 404 }
-
Returns all the playlists created by the specified artist.
-
Require Authentication: false
-
Request
- Method: GET
- URL: /api/artists/:artistId/playlists
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "Playlists": [ { "id": 1, "userId": 1, "name": "Current Favorites", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" } ] }
-
-
Error response: Couldn't find an Artist with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Artist couldn't be found", "statusCode": 404 }
-
Creates and returns a new playlist.
-
Require Authentication: true
-
Request
-
Method: POST
-
URL: /api/playlists
-
Headers:
- Content-Type: application/json
-
Body:
{ "name": "Current Favorites", "imageUrl": "image url" }
-
-
Successful Response
-
Status Code: 201
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "userId": 1, "name": "Current Favorites", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" }
-
-
Error Response: Body validation error
-
Status Code: 400
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Validation Error", "statusCode": 400, "errors": { "name": "Playlist name is required" } }
-
Add a song to a playlist specified by the playlist's id.
-
Require Authentication: true
-
Require proper authorization: Playlist must belong to the current user
-
Request
-
Method: PUT
-
URL: /api/playlists/:playlistId/songs
-
Headers:
- Content-Type: application/json
-
Body:
{ "songId": 1 }
-
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "playlistId": 1, "songId": 1 }
-
-
Error response: Couldn't find a Playlist with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Playlist couldn't be found", "statusCode": 404 }
-
-
Error response: Couldn't find a Song with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Song couldn't be found", "statusCode": 404 }
-
Returns the details of a playlist specified by its id.
-
Require Authentication: false
-
Request
- Method: GET
- URL: /api/playlists/:playlistId
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "userId": 1, "name": "Current Favorites", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url", "Songs": [ { "id": 1, "userId": 1, "albumId": 1, "title": "Yesterday", "description": "A song about the past.", "url": "audio url", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" } ] }
-
-
Error response: Couldn't find a Playlist with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Playlist couldn't be found", "statusCode": 404 }
-
Updates and returns an existing playlist.
-
Require Authentication: true
-
Require proper authorization: Playlist must belong to the current user
-
Request
-
Method: PUT
-
URL: /api/playlists/:playlistId
-
Headers:
- Content-Type: application/json
-
Body:
{ "name": "Current Favorites", "imageUrl": "image url" }
-
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "userId": 1, "name": "Current Favorites", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-20 20:00:00", "previewImage": "image url" }
-
-
Error Response: Body validation error
-
Status Code: 400
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Validation Error", "statusCode": 400, "errors": { "name": "Playlist name is required" } }
-
-
Error response: Couldn't find a Playlist with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Playlist couldn't be found", "statusCode": 404 }
-
Deletes an existing playlist.
-
Require Authentication: true
-
Require proper authorization: Playlist must belong to the current user
-
Request
- Method: DELETE
- URL: /api/playlists/:playlistId
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Successfully deleted", "statusCode": 200 }
-
-
Error response: Couldn't find a Playlist with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Playlist couldn't be found", "statusCode": 404 }
-
Returns all the playlists created by the current user.
-
Require Authentication: true
-
Request
- Method: GET
- URL: /api/playlists/myplaylist
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "Playlists": [ { "id": 1, "userId": 1, "name": "Current Favorites", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" } ] }
-
Returns all the comments that belong to a song specified by id.
-
Require Authentication: false
-
Request
- Method: GET
- URL: /api/songs/:songId/comments
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "Comments": [ { "id": 1, "userId": 1, "songId": 1, "body": "I love this song!", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "User": { "id": 1, "username": "JohnSmith" } } ] }
-
-
Error response: Couldn't find a Song with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Song couldn't be found", "statusCode": 404 }
-
Create and return a new comment for a song specified by id.
-
Require Authentication: true
-
Request
-
Method: POST
-
URL: /api/songs/:songId/comments
-
Headers:
- Content-Type: application/json
-
Body:
{ "body": "I love this song!" }
-
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "userId": 1, "songId": 1, "body": "I love this song!", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36" }
-
-
Error Response: Body validation errors
-
Status Code: 400
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Validation error", "statusCode": 400, "errors": { "body": "Comment body text is required" } }
-
-
Error response: Couldn't find a Song with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Song couldn't be found", "statusCode": 404 }
-
Update and return an existing comment.
-
Require Authentication: true
-
Require proper authorization: Comment must belong to the current user
-
Request
-
Method: PUT
-
URL: /api/comments/:commentId
-
Headers:
- Content-Type: application/json
-
Body:
{ "body": "I love this song!" }
-
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "userId": 1, "songId": 1, "body": "I love this song!", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-20 20:00:00" }
-
-
Error Response: Body validation errors
-
Status Code: 400
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Validation error", "statusCode": 400, "errors": { "body": "Comment body text is required" } }
-
-
Error response: Couldn't find a Comment with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Comment couldn't be found", "statusCode": 404 }
-
Delete an existing comment.
-
Require Authentication: true
-
Require proper authorization: Comment must belong to the current user
-
Request
- Method: DELETE
- URL: /api/comments/:commentId
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Successfully deleted", "statusCode": 200 }
-
-
Error response: Couldn't find a Comment with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Comment couldn't be found", "statusCode": 404 }
-
Returns all the Albums.
-
Require Authentication: false
-
Request
- Method: GET
- URL: /api/albums
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "Albums": [ { "id": 1, "userId": 1, "title": "Time", "description": "An album about time.", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" } ] }
-
Returns all the Albums created by the current user.
-
Require Authentication: true
-
Request
- Method: GET
- URL: /api/albums/myalbums
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "Albums": [ { "id": 1, "userId": 1, "title": "Time", "description": "An album about time.", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" } ] }
-
Returns all the albums created by the specified artist.
-
Require Authentication: false
-
Request
- Method: GET
- URL: /api/artist/:artistId/albums
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "Albums": [ { "id": 1, "userId": 1, "title": "Time", "description": "An album about time.", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" } ] }
-
-
Error response: Couldn't find an Artist with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Artist couldn't be found", "statusCode": 404 }
-
Returns the details of an album specified by its id.
-
Require Authentication: false
-
Request
- Method:
- URL: /api/albums/:albumId
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "userId": 1, "title": "Time", "description": "An album about time.", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url", "Artist": { "id": 1, "username": "JohnSmith", "previewImage": "image url" }, "Songs": [ { "id": 1, "userId": 1, "albumId": 1, "title": "Tomorrow", "description": "A song about the future.", "url": "audio url", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" } ] }
-
-
Error response: Couldn't find an Album with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Album couldn't be found", "statusCode": 404 }
-
Creates and returns a new album.
-
Require Authentication: true
-
Request
-
Method: POST
-
URL: /api/albums
-
Headers:
- Content-Type: application/json
-
Body:
{ "title": "Time", "description": "An album about time.", "imageUrl": "image url" }
-
-
Successful Response
-
Status Code: 201
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "userId": 1, "title": "Time", "description": "An album about time.", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" }
-
-
Error Response: Body validation error
-
Status Code: 400
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Validation Error", "statusCode": 400, "errors": { "title": "Album title is required" } }
-
Updates and returns an existing album.
-
Require Authentication: true
-
Require proper authorization: Album must belong to the current user
-
Request
-
Method: PUT
-
URL: /api/albums/:albumId
-
Headers:
- Content-Type: application/json
-
Body:
{ "title": "Time", "description": "An album about time.", "imageUrl": "image url" }
-
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "userId": 1, "title": "Time", "description": "An album about time.", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-20 20:00:00", "previewImage": "image url" }
-
-
Error Response: Body validation error
-
Status Code: 400
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Validation Error", "statusCode": 400, "errors": { "title": "Album title is required" } }
-
-
Error response: Couldn't find an Album with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Album couldn't be found", "statusCode": 404 }
-
Deletes an existing album.
-
Require Authentication: true
-
Require proper authorization: Album must belong to the current user
-
Request
- Method: DELETE
- URL: /api/albums/:albumId
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Successfully deleted", "statusCode": 200 }
-
-
Error response: Couldn't find an Album with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Album couldn't be found", "statusCode": 404 }
-
Returns the details of an artist specified by their id.
-
Require Authentication: false
-
Request
- Method: GET
- URL: /api/artists/:artistId
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "id": 1, "username": "JohnSmith", "totalSongs": 10, "totalAlbums": 2, "previewImage": "image url" }
-
-
Error response: Couldn't find an Artists with the specified id
-
Status Code: 404
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Artist couldn't be found", "statusCode": 404 }
-
Return songs filtered by query parameters.
-
Require Authentication: false
-
Request
- Method: GET
- URL: /api/songs
- Query Parameters
- page: integer, minimum: 0, maximum: 10, default: 0
- size: integer, minimum: 0, maximum: 20, default: 20
- title: string, optional
- createdAt: string, optional
- Body: none
-
Successful Response
-
Status Code: 200
-
Headers:
- Content-Type: application/json
-
Body:
{ "Songs": [ { "id": 1, "userId": 1, "albumId": 1, "title": "Yesterday", "description": "A song about the past.", "url": "audio url", "createdAt": "2021-11-19 20:39:36", "updatedAt": "2021-11-19 20:39:36", "previewImage": "image url" } ], "page": 2, "size": 25 }
-
-
Error Response: Query parameter validation errors
-
Status Code: 400
-
Headers:
- Content-Type: application/json
-
Body:
{ "message": "Validation Error", "statusCode": 400, "errors": { "page": "Page must be greater than or equal to 0", "size": "Size must be greater than or equal to 0", "createdAt": "CreatedAt is invalid" } }
-