148ed696b2
This commit introduces Swagger API documentation for all endpoints in the application. - Installs and . - Configures Swagger in to generate and serve API documentation at . - Adds JSDoc-style Swagger annotations to all routes in and the directory (, , , , , ). - Defines a cookie-based security scheme for authenticated routes. This allows for interactive API documentation and testing via the endpoint.
187 lines
4.2 KiB
JavaScript
187 lines
4.2 KiB
JavaScript
var express = require('express')
|
|
var router = express.Router()
|
|
|
|
const DB = require("../mongoDB.js");
|
|
const Song = require("../def/songs.js");
|
|
|
|
DB.getDB.then((DB)=>{
|
|
|
|
const getUserId = function(req){
|
|
const user_sid = req.cookies.user_sid || req.query.user_sid || req.body.user_sid;
|
|
return DB.ObjectID(user_sid);
|
|
}
|
|
|
|
const getProfileId = (req)=>{
|
|
return DB.ObjectID(req.cookies.profile_id || req.query.profile_id || req.body.profile_id);
|
|
}
|
|
|
|
/**
|
|
* @swagger
|
|
* tags:
|
|
* name: Songs
|
|
* description: Song management
|
|
*/
|
|
|
|
/**
|
|
* @swagger
|
|
* /songs:
|
|
* get:
|
|
* summary: Get all songs
|
|
* tags: [Songs]
|
|
* security:
|
|
* - cookieAuth: []
|
|
* responses:
|
|
* 200:
|
|
* description: OK
|
|
*/
|
|
router.get("/", async (req, res) => {
|
|
let profileId = req.params.id;
|
|
let songs = await DB.getSongs();
|
|
return res.json({
|
|
status: "ok",
|
|
songs
|
|
});
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /songs:
|
|
* post:
|
|
* summary: Create a new song
|
|
* tags: [Songs]
|
|
* security:
|
|
* - cookieAuth: []
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* responses:
|
|
* 200:
|
|
* description: OK
|
|
*/
|
|
router.post("/", async (req, res) => {
|
|
let post = {
|
|
userid: getUserId(req),
|
|
...req.body
|
|
}
|
|
let postObj = new Song(post);
|
|
let dbr = await DB.newSong(postObj);
|
|
song = postObj.toObj();
|
|
song._id = dbr.insertedId;
|
|
return res.json({
|
|
status: "ok",
|
|
...song
|
|
})
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /songs/{id}:
|
|
* get:
|
|
* summary: Get a specific song by ID
|
|
* tags: [Songs]
|
|
* security:
|
|
* - cookieAuth: []
|
|
* parameters:
|
|
* - in: path
|
|
* name: id
|
|
* required: true
|
|
* schema:
|
|
* type: string
|
|
* responses:
|
|
* 200:
|
|
* description: OK
|
|
*/
|
|
router.get("/:id", async (req, res) => {
|
|
let profileId = req.params.id;
|
|
let profile = await DB.getProfile(profileId);
|
|
return res.json({
|
|
status: "ok",
|
|
... profile
|
|
});
|
|
});
|
|
|
|
async function songBelongsToUser(songId, userid){
|
|
// TODO: Verify ownserhip
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @swagger
|
|
* /songs/{id}:
|
|
* delete:
|
|
* summary: Delete a song
|
|
* tags: [Songs]
|
|
* security:
|
|
* - cookieAuth: []
|
|
* parameters:
|
|
* - in: path
|
|
* name: id
|
|
* required: true
|
|
* schema:
|
|
* type: string
|
|
* responses:
|
|
* 200:
|
|
* description: OK
|
|
*/
|
|
router.delete("/:id", async (req, res) => {
|
|
const userid = getUserId(req);
|
|
const songId = req.params.id;
|
|
if(!await songBelongsToUser(songId, userid))
|
|
return res.json({
|
|
status: "This profile is not yours."
|
|
});
|
|
await DB.removeSong(songId);
|
|
return res.json({
|
|
status: "ok"
|
|
});
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /songs/{id}:
|
|
* post:
|
|
* summary: Update a song
|
|
* tags: [Songs]
|
|
* security:
|
|
* - cookieAuth: []
|
|
* parameters:
|
|
* - in: path
|
|
* name: id
|
|
* required: true
|
|
* schema:
|
|
* type: string
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* content:
|
|
* type: string
|
|
* responses:
|
|
* 200:
|
|
* description: OK
|
|
*/
|
|
router.post("/:id", async (req, res) => {
|
|
const userid = getUserId(req);
|
|
const songId = req.params.id;
|
|
const song = await DB.getSong(songId);
|
|
const newContent = req.body.content;
|
|
console.log("Updating song", newContent)
|
|
if(!await songBelongsToUser(songId, userid))
|
|
return res.json({
|
|
status: "This post is not yours."
|
|
});
|
|
await DB.updateSongContent(songId, newContent, song.content);
|
|
return res.json({
|
|
status: "ok"
|
|
});
|
|
});
|
|
|
|
});
|
|
|
|
module.exports = router |