From f3520ea27a91b549df1022b8dc2573f9d10f14b8 Mon Sep 17 00:00:00 2001 From: kyrea Date: Sun, 4 Feb 2024 22:21:06 +0530 Subject: [PATCH 1/3] Update existing model for Waifu entity with additional fields and documentation --- src/controllers/v4/images/waifu.js | 4 +- src/models/schemas/Waifu.js | 204 ++++++++++++++++++++++++----- 2 files changed, 176 insertions(+), 32 deletions(-) diff --git a/src/controllers/v4/images/waifu.js b/src/controllers/v4/images/waifu.js index fdb4af2..b62014c 100644 --- a/src/controllers/v4/images/waifu.js +++ b/src/controllers/v4/images/waifu.js @@ -39,12 +39,12 @@ const getWaifu = async (req, res, next) => { if (name) { const sanitizedName = _.escapeRegExp(name.trim()); - filter['names.en'] = { $regex: new RegExp(sanitizedName, 'i') }; // Case-insensitive regex match for English name + filter['name.full'] = { $regex: new RegExp(sanitizedName, 'i') }; // Case-insensitive regex match for English name } if (anime) { const sanitizedAnime = _.escapeRegExp(anime.trim()); - filter['from.name'] = { $regex: new RegExp(sanitizedAnime, 'i') }; // Case-insensitive regex match for anime name + filter['media.nodes[0].title.userPreferred'] = { $regex: new RegExp(sanitizedAnime, 'i') }; // Case-insensitive regex match for anime name } /** diff --git a/src/models/schemas/Waifu.js b/src/models/schemas/Waifu.js index e0dc531..3fc8528 100644 --- a/src/models/schemas/Waifu.js +++ b/src/models/schemas/Waifu.js @@ -8,75 +8,219 @@ const { Schema, model } = mongoose; * @class WaifuSchema */ const WaifuSchema = new Schema({ + /** + * The unique identifier for the Waifu. + * @type {Number} + */ _id: { type: Number, required: true }, - names: { + + /** + * The name details of the Waifu. + * @type {Object} + */ + name: { /** - * The English name of the waifu. + * The first name of the Waifu. * @type {String} */ - en: { type: String, required: true }, + first: { type: String, required: true }, /** - * The Japanese name of the waifu. + * The middle name of the Waifu. * @type {String} */ - jp: { type: String }, + middle: String, /** - * Alternative name or alias of the waifu. + * The last name of the Waifu. * @type {String} */ - alt: { type: String }, - }, - from: { + last: { type: String, required: true }, + /** - * The name of the source or origin of the waifu. + * The full name of the Waifu. * @type {String} */ - name: { type: String }, + full: { type: String, required: true }, /** - * The type or category of the source from which the waifu originates. + * The native name of the Waifu. * @type {String} */ - type: { type: String }, + native: String, + + /** + * The user-preferred name of the Waifu. + * @type {String} + */ + userPreferred: { type: String, required: true }, }, + /** - * Array of image URLs associated with the waifu. - * @type {Array} + * The image URL associated with the Waifu. + * @type {Object} */ - images: [String], - - statistics: { + image: { /** - * The number of favorites received by the waifu. - * @type {Number} + * The URL for the large image. + * @type {String} */ - fav: { type: Number }, + large: String, + medium: String, + }, + /** + * The number of favorites for the Waifu. + * @type {Number} + */ + favourites: { type: Number, required: true }, + + /** + * The URL of the Waifu's profile. + * @type {String} + */ + siteUrl: { type: String, required: true }, + + /** + * The description of the Waifu. + * @type {String} + */ + description: { type: String, required: true }, + + /** + * The age range of the Waifu. + * @type {String} + */ + age: String, + + /** + * The gender of the Waifu. + * @type {String} + */ + gender: { type: String, required: true }, + + /** + * The blood type of the Waifu. + * @type {String} + */ + bloodType: String, + + /** + * The date of birth of the Waifu. + * @type {Object} + */ + dateOfBirth: { /** - * The number of times the waifu is loved. + * The year of birth. * @type {Number} */ - love: { type: Number }, + year: Number, /** - * The number of times the waifu is disliked or hated. + * The month of birth. * @type {Number} */ - hate: { type: Number }, + month: Number, /** - * The number of upvotes received by the waifu. + * The day of birth. * @type {Number} */ - upvote: { type: Number }, + day: Number, + }, + /** + * The media information associated with the Waifu. + * @type {Object} + */ + media: { /** - * The number of downvotes received by the waifu. - * @type {Number} + * The list of media nodes. + * @type {Array} */ - downvote: { type: Number }, + nodes: [ + { + /** + * The unique identifier for the media. + * @type {Number} + */ + id: { type: Number, required: true }, + + /** + * The unique identifier for the media on MyAnimeList. + * @type {Number} + */ + idMal: { type: Number, required: true }, + + /** + * The cover image URL for the media (medium size). + * @type {Object} + */ + coverImage: { + medium: { type: String, required: true }, + }, + + /** + * The banner image URL for the media. + * @type {String} + */ + bannerImage: String, + + /** + * The title information for the media. + * @type {Object} + */ + title: { + /** + * The romaji title of the media. + * @type {String} + */ + romaji: { type: String, required: true }, + + /** + * The English title of the media. + * @type {String} + */ + english: { type: String, required: true }, + + /** + * The native title of the media. + * @type {String} + */ + native: { type: String, required: true }, + + /** + * The user-preferred title of the media. + * @type {String} + */ + userPreferred: { type: String, required: true }, + }, + + /** + * The list of synonyms for the media title. + * @type {Array} + */ + synonyms: [String], + + /** + * The popularity rank of the media. + * @type {Number} + */ + popularity: Number, + + /** + * The type of the media (e.g., ANIME, MANGA). + * @type {String} + */ + type: { type: String, required: true }, + + /** + * The format of the media (e.g., TV, MOVIE). + * @type {String} + */ + format: { type: String, required: true }, + }, + ], }, }); From dc7f2ddba8223a0f3a9024a4140efbf48eef59e1 Mon Sep 17 00:00:00 2001 From: kyrea Date: Sun, 4 Feb 2024 22:31:57 +0530 Subject: [PATCH 2/3] Added Husbando Route --- src/controllers/v4/images/husbando.js | 78 ++++++++ src/models/schemas/Husbando.js | 248 ++++++++++++++++++++++++++ src/routes/v4/images/husbando.js | 103 +++++++++++ src/routes/v4/index.js | 16 ++ 4 files changed, 445 insertions(+) create mode 100644 src/controllers/v4/images/husbando.js create mode 100644 src/models/schemas/Husbando.js create mode 100644 src/routes/v4/images/husbando.js diff --git a/src/controllers/v4/images/husbando.js b/src/controllers/v4/images/husbando.js new file mode 100644 index 0000000..b771035 --- /dev/null +++ b/src/controllers/v4/images/husbando.js @@ -0,0 +1,78 @@ +import _ from 'lodash'; +import createError from 'http-errors'; +import Husbandos from '../../../models/schemas/Husbando.js'; +import Stats from '../../../models/schemas/Stat.js'; + +/** + * Retrieves a random husbando and updates system statistics. + * + * @function + * @param {Object} req - Express request object. + * @param {Object} res - Express response object. + * @param {Function} next - Express next middleware function. + * + * @throws {Error} If there is an error during husbando retrieval or database update. + * + * @returns {Object} JSON object containing the random husbando. + * @example + * // Example usage in Express route handler + * getHusbando(req, res, next); + */ +const getHusbando = async (req, res, next) => { + try { + /** + * Extracts character name and anime parameters from the request query. + * @type {Object} + */ + const { name, anime } = req.query; + + /** + * Holds the filter object based on the optional character name and anime name parameters. + * @type {Object} + */ + const filter = {}; + + /** + * Adds conditions to the filter object based on request parameters. + * @type {Object} + */ + if (name) { + const sanitizedName = _.escapeRegExp(name.trim()); + filter['name.full'] = { $regex: new RegExp(sanitizedName, 'i') }; // Case-insensitive regex match for the English name + } + + if (anime) { + const sanitizedAnime = _.escapeRegExp(anime.trim()); + filter['media.nodes[0].title.userPreferred'] = { $regex: new RegExp(sanitizedAnime, 'i') }; // Case-insensitive regex match for anime name + } + + /** + * Holds the result of the random husbando retrieval. + * @type {Object} + */ + const [result] = await Husbandos.aggregate([ + { $match: filter }, // Apply filter conditions (if any) + { $sample: { size: 1 } }, + { $project: { __v: 0 } }, + ]); + + // If no husbando is found, return a 404 error + if (!result) { + return next(createError(404, 'Could not find any matching husbando')); + } + + res.status(200).json(result); + + // Update system statistics for husbandos + await Stats.findOneAndUpdate({ _id: 'systemstats' }, { $inc: { husbandos: 1 } }); + } catch (error) { + /** + * Update system statistics for failed requests. + * @type {Object} + */ + await Stats.findOneAndUpdate({ _id: 'systemstats' }, { $inc: { failed_requests: 1 } }); + next(error); + } +}; + +export default getHusbando; diff --git a/src/models/schemas/Husbando.js b/src/models/schemas/Husbando.js new file mode 100644 index 0000000..4b6ae9d --- /dev/null +++ b/src/models/schemas/Husbando.js @@ -0,0 +1,248 @@ +import mongoose from 'mongoose'; + +const { Schema, model } = mongoose; + +/** + * Represents the schema for the Husbando model. + * @class HusbandoSchema + */ +const HusbandoSchema = new Schema({ + /** + * The unique identifier for the husbando. + * @type {Number} + */ + _id: { type: Number, required: true }, + + /** + * The name details of the husbando. + * @type {Object} + */ + name: { + /** + * The first name of the husbando. + * @type {String} + */ + first: { type: String, required: true }, + + /** + * The middle name of the husbando. + * @type {String} + */ + middle: String, + + /** + * The last name of the husbando. + * @type {String} + */ + last: { type: String, required: true }, + + /** + * The full name of the husbando. + * @type {String} + */ + full: { type: String, required: true }, + + /** + * The native name of the husbando. + * @type {String} + */ + native: String, + + /** + * The user-preferred name of the husbando. + * @type {String} + */ + userPreferred: { type: String, required: true }, + + /** + * Alternative names for the husbando. + * @type {Array} + */ + alternative: [String], + + /** + * Alternative spoiler names for the husbando. + * @type {Array} + */ + alternativeSpoiler: [String], + }, + + /** + * The image URL associated with the husbando. + * @type {Object} + */ + image: { + /** + * The URL for the large image of the husbando. + * @type {String} + */ + large: String, + medium: String, + }, + + /** + * The number of favorites for the husbando. + * @type {Number} + */ + favourites: { type: Number, required: true }, + + /** + * The URL of the AniList page for the husbando. + * @type {String} + */ + siteUrl: { type: String, required: true }, + + /** + * The description of the husbando. + * @type {String} + */ + description: { type: String, required: true }, + + /** + * The age of the husbando. + * @type {String} + */ + age: String, + + /** + * The gender of the husbando. + * @type {String} + */ + gender: { type: String, required: true }, + + /** + * The blood type of the husbando. + * @type {String} + */ + bloodType: String, + + /** + * The date of birth of the husbando. + * @type {Object} + */ + dateOfBirth: { + /** + * The year of birth for the husbando. + * @type {Number} + */ + year: Number, + + /** + * The month of birth for the husbando. + * @type {Number} + */ + month: Number, + + /** + * The day of birth for the husbando. + * @type {Number} + */ + day: Number, + }, + + /** + * The media details associated with the husbando. + * @type {Object} + */ + media: { + /** + * An array of nodes containing information about various media related to the husbando. + * @type {Array} + */ + nodes: [ + { + /** + * The unique identifier for the media. + * @type {Number} + */ + id: { type: Number, required: true }, + + /** + * The unique identifier for the media on MyAnimeList. + * @type {Number} + */ + idMal: { type: Number, required: true }, + + /** + * The cover image details for the media. + * @type {Object} + */ + coverImage: { + /** + * The URL for the medium-sized cover image of the media. + * @type {String} + */ + medium: { type: String, required: true }, + }, + + /** + * The banner image URL for the media. + * @type {String} + */ + bannerImage: String, + + /** + * The title details for the media. + * @type {Object} + */ + title: { + /** + * The romaji title of the media. + * @type {String} + */ + romaji: { type: String, required: true }, + + /** + * The English title of the media. + * @type {String} + */ + english: { type: String, required: true }, + + /** + * The native title of the media. + * @type {String} + */ + native: { type: String, required: true }, + + /** + * The user-preferred title of the media. + * @type {String} + */ + userPreferred: { type: String, required: true }, + }, + + /** + * Synonyms for the media. + * @type {Array} + */ + synonyms: [String], + + /** + * The popularity score for the media. + * @type {Number} + */ + popularity: Number, + + /** + * The type of the media. + * @type {String} + */ + type: { type: String, required: true }, + + /** + * The format of the media. + * @type {String} + */ + format: { type: String, required: true }, + }, + ], + }, +}); + +/** + * Represents the model for the Husbando. + * @class Husbando + */ +const Husbando = model('Husbando', HusbandoSchema); + +export default Husbando; diff --git a/src/routes/v4/images/husbando.js b/src/routes/v4/images/husbando.js new file mode 100644 index 0000000..026177a --- /dev/null +++ b/src/routes/v4/images/husbando.js @@ -0,0 +1,103 @@ +import { Router } from 'express'; +import getHusbando from '../../../controllers/v4/images/husbando.js'; +import createRateLimiter from '../../../middlewares/rateLimit.js'; +import authorize from '../../../middlewares/authorize.js'; +import incrementData from '../../../middlewares/database/add.js'; +import updateData from '../../../middlewares/database/update.js'; +import deleteData from '../../../middlewares/database/delete.js'; + +const router = Router(); + +router + .route('/') + /** + * @api {get} v4/husbando Get a Random Husbando + * @apiDescription Retrieve a random Husbando. + * @apiName getHusbando + * @apiGroup images + * @apiPermission user + * + * @apiHeader {String} Authorization User's access token. + * + * @apiSuccess {Object[]} users List of users. + * + * @apiError (Unauthorized 401) Unauthorized Only authenticated users can access the data. + * @apiError (Forbidden 403) Forbidden Only users can access the data. + * @apiError (Too Many Requests 429) TooManyRequests The client has exceeded the allowed number of requests within the time window. + * @apiError (Internal Server Error 500) InternalServerError An error occurred while processing the rate limit. + * + * @function createRateLimit + * @description Creates a rate limiter middleware to control the frequency of requests. + * @returns {function} Express middleware function that handles rate limiting. + * + */ + .get(authorize(config.roles.USER), createRateLimiter(), getHusbando) + /** + * @api {post} v4/husbando Increment Husbando Data + * @apiDescription Increment data related to Husbandos (only accessible by database moderators). + * @apiName IncrementHusbandoData + * @apiGroup images + * @apiPermission database_moderator + * + * @apiHeader {String} Authorization Database Moderator's access token. + * + * @apiSuccess {Object} result Result of the data incrementation. + * + * @apiError (Unauthorized 401) Unauthorized Only authenticated database moderator can access the data. + * @apiError (Forbidden 403) Forbidden Only users can access the data. + * @apiError (Too Many Requests 429) TooManyRequests The client has exceeded the allowed number of requests within the time window. + * @apiError (Internal Server Error 500) InternalServerError An error occurred while processing the rate limit. + * + * @function createRateLimit + * @description Creates a rate limiter middleware to control the frequency of requests. + * @returns {function} Express middleware function that handles rate limiting. + * + */ + .post(authorize(config.roles.DB_MOD), createRateLimiter(), incrementData('Husbando')); + +router + .route('/:id') + /** + * @api {patch} v4/husbando/:id Update Husbando Data + * @apiDescription Update data related to Husbandos with a specific ID (only accessible by database moderators). + * @apiName UpdateHusbandoData + * @apiGroup Husbando + * @apiPermission database_moderator + * + * @apiHeader {String} Authorization database moderator access token. + * + * @apiSuccess {Object} result Result of the data update. + * + * @apiError (Unauthorized 401) Unauthorized Only authenticated database moderator can access the data. + * @apiError (Forbidden 403) Forbidden Only users can access the data. + * @apiError (Too Many Requests 429) TooManyRequests The client has exceeded the allowed number of requests within the time window. + * @apiError (Internal Server Error 500) InternalServerError An error occurred while processing the rate limit. + * + * @function createRateLimit + * @description Creates a rate limiter middleware to control the frequency of requests. + * @returns {function} Express middleware function that handles rate limiting. + */ + .patch(authorize(config.roles.DB_MOD), createRateLimiter(), updateData('Husbando')) + /** + * @api {delete} v4/husbando/:id Delete Husbando Data + * @apiDescription Delete data related to Husbando with a specific ID (only accessible by admins). + * @apiName DeleteHusbandoData + * @apiGroup Husbando + * @apiPermission admin + * + * @apiHeader {String} Authorization Admin's access token. + * + * @apiSuccess {Object} result Result of the data deletion. + * + * @apiError (Unauthorized 401) Unauthorized Only authenticated admins can access the data. + * @apiError (Forbidden 403) Forbidden Only users can access the data. + * @apiError (Too Many Requests 429) TooManyRequests The client has exceeded the allowed number of requests within the time window. + * @apiError (Internal Server Error 500) InternalServerError An error occurred while processing the rate limit. + * + * @function createRateLimit + * @description Creates a rate limiter middleware to control the frequency of requests. + * @returns {function} Express middleware function that handles rate limiting. + */ + .delete(authorize(config.roles.ADMIN), createRateLimiter(), deleteData('Husbando')); +// Export the router +export default router; diff --git a/src/routes/v4/index.js b/src/routes/v4/index.js index 5bec39d..f79c929 100644 --- a/src/routes/v4/index.js +++ b/src/routes/v4/index.js @@ -120,6 +120,22 @@ import uwuifyRoutes from './textUtilities/uwuify.js'; */ router.use('/uwuify', uwuifyRoutes); +import husbandoRoutes from './images/husbando.js'; + +/** + * @api {use} v4/husbando Use Husbando Routes + * @apiDescription Mount the husbando-related routes for handling images. + * @apiName UseHusbandoRoutes + * @apiGroup Routes + * + * @apiSuccess {Object} routes Uwuify-related routes mounted on the parent router. + * + * @function createUwuifyRoutes + * @description Creates and returns a set of routes for handling images related to husbando. + * @returns {Object} Husbando-related routes. + */ +router.use('/husbando', husbandoRoutes); + import waifuRoutes from './images/waifu.js'; /** From 4a9b7d96631f7aab44b5bd64a94fc5ee835707fc Mon Sep 17 00:00:00 2001 From: kyrea Date: Mon, 5 Feb 2024 15:41:25 +0530 Subject: [PATCH 3/3] Updated some packages and bumped the version --- package-lock.json | 57 +++++++++++++++++++++++++++++------------------ package.json | 2 +- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 80a16f4..5fb4b84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "waifu.it", - "version": "4.4.14", + "version": "4.5.14", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "waifu.it", - "version": "4.4.14", + "version": "4.5.14", "license": "AGPLv3", "dependencies": { "chalk": "^4.1.2", @@ -40,9 +40,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -88,9 +88,9 @@ } }, "node_modules/@types/node": { - "version": "20.10.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.8.tgz", - "integrity": "sha512-f8nQs3cLxbAFc00vEU59yf9UyGUftkPaLGfvbVOIDdx2i1b8epBqj2aNGyP19fiyXWvlmZ7qC1XLjAzw/OKIeA==", + "version": "20.11.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz", + "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -713,6 +713,14 @@ "node": ">= 0.8" } }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -988,15 +996,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.3.tgz", + "integrity": "sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ==", "dependencies": { + "es-errors": "^1.0.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1558,9 +1570,9 @@ } }, "node_modules/nodemon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz", - "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.3.tgz", + "integrity": "sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ==", "dev": true, "dependencies": { "chokidar": "^3.5.2", @@ -2104,14 +2116,15 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", "dependencies": { "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -2449,9 +2462,9 @@ } }, "node_modules/winston-transport": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", - "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", + "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", "dependencies": { "logform": "^2.3.2", "readable-stream": "^3.6.0", diff --git a/package.json b/package.json index 0cdba54..e3c5e51 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "waifu.it", - "version": "4.4.14", + "version": "4.5.14", "description": "Random API Serving Anime stuff", "author": "Aeryk", "private": true,