Как правильно форматировать ответы API в Mongoose?

avatar
josh
9 августа 2021 в 02:17
49
0
0

Итак, недавно я взялся за небольшой проект, использующий стек MEAN. У меня есть простая задача, и я пытаюсь создать простой API, который позволяет администратору назначать пользователей в комнату в определенной квартире.

Итак, у меня есть две функции: одна для назначения пользователя в комнату и одна для отмены назначения. В настоящее время у меня есть только схема квартиры, которая ссылается на схему пользователя, но не наоборот (я не знаю, как это сделать правильно, лол).

Однако проблема, с которой я сталкиваюсь, заключается в том, что при вызове функции getApartments и заполнении поля assignedUser у нее есть два способа форматирования ответов:

[{ assignedUser: { username: 101 }, room: 1003 },...]

или если пользователь не назначен:

[{ assignedUser: null, room: 1003 },...]

В настоящее время я работаю в основном над API, поэтому я не пытался увидеть проблемы на стороне Angular, но есть ли способ должным образом стандартизировать ответы, чтобы, возможно, когда я получаю список комнат, он всегда мог отвечать так? :

[
  { assignedUser: 101, room: 1003 },
  { assignedUser: null, room: 1004 },
  ...
]

Заранее спасибо за любые предложения или советы! (я уверен, что их будет много, лол)

Вот соответствующий код:

квартира.схема.js:

const mongoose = require('mongoose');

const uniqueValidator = require('mongoose-unique-validator');

const ApartmentSchema = new mongoose.Schema({
    id: {
        type: Number,
        required: true,
        unique: true,
    },
    status: {
        type: String,
        enum: ['ACTIVE', 'INACTIVE'],
        default: 'INACTIVE',
    },
    rooms: [{
        assignedUser:
        {
            type: mongoose.Types.ObjectId,
            ref: 'User',
            unique: true,
            default: null,
        },
        room:
        {
            type: Number,
            required: true,
            unique: true,
        },
        _id: false,
    }],
    lastUsed: {
        type: String,
        default: 'N/A',
    },
    __v: false,
});

ApartmentSchema.plugin(uniqueValidator);
module.exports = mongoose.model('apartment', ApartmentSchema);

User.schema.js:

const {Schema, model} = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');

const STATUS = ['ACTIVE', 'INACTIVE'];
const UserSchema = new Schema({
    username: {
        type: Number,
        required: true,
        unique: true,
    },
    hash: {
        type: String,
        required: true,
    },
    admin: {
        type: Boolean,
        required: true,
    },
    apartmentId: Number,
    roomId: {
        type: Number,
        trim: true,
        unique: true,
        sparse: true,
    },
    status: {
        type: String,
        enum: STATUS,
        default: STATUS[1],
    },
});

UserSchema.plugin(
    uniqueValidator,
    {messages: 'Error: expected {PATH} to be unique.'},
);
module.exports = model('User', UserSchema);

квартира.контроллер.js

const Apartment = require('../../models/apartment.controller');
const User = require('../../models/user.schema');

/* Get list of rooms in a apartment */
/* Returns a list of rooms for specified apartment */
exports.getRooms = async (req, res, next) => {
    try {
        Apartment.findOne({id: req.params.id})
            .populate({
                path: 'room.assignedUser',
                select: 'username -_id',
            })
            .exec((err, result) => {
                if (err) {
                    console.log(err);
                    return next(err);
                }

                console.log(result.rooms);
                return res.status(200).send(result.rooms);
            });
    } catch (err) {
        console.log(err);
        next(err);
    }
};

/* Assigns a user to a room */
exports.assignRoom = async (req, res, next) => {
    console.info(`>>/admin/apartment/${req.params.apartmentId}/room/${req.params.roomId}/assign`);

    try {
        const user = await User.findOne({username: req.body.username});

        Apartment.updateOne(
            {'rooms.room': req.params.roomId},
            {$set: {'rooms.$.assignedUser': user._id}},
        ).exec((err, result) => {

            if (err || result.nModified === 0) {
                return next('>>Error assigning room');
            }

            user.apartmentId = req.params.apartmentId;
            user.roomId = req.params.roomId;
            user.save()
                .then(result => {
                    if (result) {
                        console.log(`>>Successfully assigned ${user.username} to room ${req.params.room}`);
                    }
                });
            res.status(200).send(`>>Successfully assigned ${user.username} to room ${req.params.roomId}`);
        });
    } catch (err) {
        next(err);
    }
};

exports.unassignRoom = async (req, res, next) => {
    console.log(`Attempting to unassign ${req.body.username} from ${req.params.roomId}`);
    try {
        const apartment = await Apartment.findOne({'rooms.room': req.params.roomId});
        const user = await User.findOne({username: req.body.username});

        Apartment.updateOne(
            {'rooms.assignedUser': user._id},
            {$set: {'rooms.$.assignedUser': null}},
        ).exec((err, result) => {

            if (err || result.nModified === 0) {
                return next('>>Error unassigning room');
            }

            user.apartmentId = null;
            user.roomId = null;
            user.save()
                .then(result => {
                    if (result) {
                        console.log(`>>Successfully unassigned ${user.username} from room ${req.params.roomId}`);
                    }
                });
            return res.status(200).send(`>>Successfully unassigned ${user.username} from room ${req.params.roomId}`);
        });
    } catch (err) {
        next(err);
    }
};

Примечание. Я добавил функции, которые использую для назначения и отмены назначения комнат. Я не уверен в более эффективном способе выполнения этой операции, поэтому я надеюсь, что кто-то может научить новичка, такого как я, некоторым советам! Большое спасибо!!

Источник
josh
9 августа 2021 в 02:18
0

Если есть какой-либо другой код, который я забыл включить, дайте мне знать, и я сделаю это как можно скорее!

Ответы (0)