Привет всем, добро пожаловать в сквозной проект полного стека (бэкэнд, фронтенд) с искусственным интеллектом и машинным обучением и серией этических хакеров. В этом посте мы собираемся добавить дополнительные функции в наш ранее созданный API.

В предыдущем посте мы настроили и создали расширенный RESTFUL API с использованием Node.js, а в конце поста я упоминаю, что мы добавим в наш API еще две функции, которые позволят пользователям добавлять комментарии к сообщению и разрешить им для загрузки изображений с локального компьютера, но вместо добавления этих двух функций, в этом посте мы добавим только перо комментария, чтобы позволить пользователям добавлять комментарий к целевому посту. Так же, как и раньше, чтобы упростить задачу, давайте разобьем процесс на части и запишем в точечной форме.

Первая часть разработки серверной части:



Ссылка на серию:



Что вы узнаете?

  • Создание схем базы данных
  • Создавайте различные типы маршрутов
  • Заполнение схем базы данных с использованием виртуальных машин мангуста
  • Глубокая популяция мангустов
  • Тестировать API

Функции которые мы собираемся реализовать:

  • Разрешить пользователям добавлять комментарий к целевому сообщению
  • Получить комментарии к посту (заполнить)
  • Получить оба сообщения, комментарии при запросе пользователя

Этапы, которые вы должны выполнить:

Примечание. Опять же, я надеюсь, что вы завершили предыдущее сообщение (часть 1), так как это продолжение, вы должны завершить API до этого момента. Сказав это, давайте начнем с этого урока.

Создать схему данных комментариев

Создайте файл с именем Comment.js в папке моделей. Мы собираемся создать схему данных внутри этого файла. У нас будет 3 поля ввода данных:
Postid: идентификатор сообщения, к которому вы хотите добавить комментарий
Userid: идентификатор пользователь, разместивший комментарий
Комментарий: комментарий (строка)

/models/Comment.js

const mongoose = require('mongoose');
let CommentSchema = new mongoose.Schema({
    PostId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'post',
        required: true
    },
    UserId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'user',
        required: true
    },
    comment: {
        type: String,
        required: true
    }
})
module.exports = mongoose.model('comment', CommentSchema)

Создать маршрут для добавления комментария

Откройте файл functions.js внутри папки маршрутов. Здесь мы создадим маршрут для добавления комментария в конец файла перед экспортом маршрутизатора, а также убедитесь, что вы импортируете модель комментариев в верхнюю часть файла функций. (так же, как вы импортировали другие модели)

/post/comment/:id: запрос POST, который примет комментарий в виде строки и добавит в базу данных идентификатор целевого сообщения и идентификатор вошедшего в систему пользователя. Идентификатор сообщения — это «:id» в URL-адресе.

/routes/features.js

// GET | /api/v1/post/comment/:id| Private | add a comment to a post
router.post('/post/comment/:id', verifyAuth,async (req, res) => {
    try {
        const comment = await Comment.create({
            PostId: req.params.id,
            comment: req.body.comment,
            UserId: req.user.id,
        })
        if (!comment) {
            return res.status(400).json({
                success: false
            })
        }
        res.status(200).json({
            data: comment,
            success: true
        })
    } catch (err) {
        console.log(err)
        res.status(400).json({success: false})
    }
})
module.exports = router

Обновить схему публикации

Теперь нам нужно добавить виртуальные объекты в схему данных поста, чтобы получить комментарии, связанные с постом, при получении поста. Для этого откройте файл Post.js в папке моделей и добавьте следующую функцию для создания виртуалов.

/models/Post.js

PostSchema.virtual('comments', {
    ref: 'comment',
    localField: '_id',
    foreignField: 'PostId',
    justOne: false
})
module.exports = mongoose.model('post', PostSchema)

Заполните необходимые маршруты

Теперь нам нужно заполнить некоторые маршруты комментариями, чтобы мы могли получать комментарии с запросами.

Маршруты, которые мы собираемся обновить

/user: чтобы мы могли получать сообщения и комментарии с сообщениями вошедшего в систему пользователя. (глубокое заполнение)
/profile/:id: получение сообщений и комментариев к сообщениям целевого пользователя (глубокое заполнение)
/posts : получить все сообщения и комментарии к сообщениям
/followers-posts: получить все сообщения от подписчиков и комментариев к сообщениям
/post/: id: получить одно сообщение и комментарии к целевому сообщению

Посмотрим, как изменится код

/пользователь — auth.js

router.get('/user', verifyAuth,  async (req, res) => {
    try {
        const user = await User.findById(req.user.id).populate({
            // deep populate
            path: 'posts',
            populate : {
                path : 'comments'
            }
        })
        res.status(200).json({
            user,
            success: true
        })
    } catch (err) {
        console.error(err.message)
        res.status(500).json({ msg:'SERVER ERROR'})
    }
})

/profile/:id — features.js

router.get('/profile/:id', async (req, res) => {
    try {
        const user = await User.findById(req.params.id).populate({
            // deep populate
            path: 'posts',
            populate : {
                path : 'comments'
            }
        })
        if(!user){
            return res.status(401).json({success: false})
        }
        res.status(200).json({
            data: user,
            success: true
        })
    } catch (err) {
        console.log(err)
        res.status(400).json({success: false})
    }
})

/posts — posts.js

router.get('/posts', async (req, res) => {
    try {
        // populate
        const posts = await     Post.find().populate('comments').populate('posted_by')
 
        return res.status(200).json({
            data: posts,
            success: true
        })
    } catch (error) {
        console.log(err)
        res.status(400).json({success: false})
    }
})

/followers-posts — posts.js

router.get('/followers-posts', verifyAuth, async (req, res) => {
 
    try {
        const get_user = await User.findById(req.user.id)
 
        // populate
        const posts  = await Post.find({UserId: get_user.following}).populate('comments').populate('posted_by')
 
        res.status(200).json({
            data: posts,
            success: true
        })
    } catch (err) {
        console.log(err)
        res.status(400).json({success: false})
    }
})

/post/:id — posts.js

router.get('/post/:id', async (req, res) => {
    try {
        // populate
        const post  = await Post.findById(req.params.id).populate('comments')
 
 
 
        if(!post){
            res.status(400).json({success: false})
        }
       
        res.status(200).json({
            data: post,
            success: true
        })
 
    } catch (err) {
        console.log(err)
        res.status(400).json({success: false})
    }
})

Протестируйте API

Теперь, когда мы успешно добавили перо комментариев в API, давайте протестируем API с помощью postman.

/login
Войдите как joey, помните, что мы создали этого пользователя в предыдущем посте

/post/comment/:id
Используйте токен, который вы получили от joey login, и настройте заголовки URL-адреса добавления комментария, создайте данные JSON в теле и выполните POST просьба. :id должен быть идентификатором целевого сообщения.

Мы видим, что успешно добавили комментарий к целевому сообщению.

/user
Попросите пользователя joey проверить, выполняется ли заполнение. Если это работает, мы должны иметь возможность видеть сообщения, размещенные пользователем, и добавленные комментарии к каждому сообщению.

Здесь мы можем видеть как массив сообщений с сообщением, так и массив комментариев к сообщениям.

Заключение

Ура!.. Мы успешно добавили и протестировали новое перо в API

Отлично, это конец этой версии внутреннего API. Надеюсь, вам понравилось. Мы можем снова обновить серверную часть, как только начнем добавлять модели машинного обучения, поэтому, надеюсь, в следующий раз мы будем создавать интерфейс для API. И снова, если вы, ребята (читатели), хотите, чтобы я внес какие-либо изменения, пожалуйста, дайте мне знать, я постараюсь сделать все возможное, чтобы реализовать это.

ссылка на репозиторий github:https://github.com/nafiu-dev/full_stack_app_with_AI-ML_models/tree/backend_v2

Вы можете связаться со мной здесь:

https://www.instagram.com/nafiu.dev

Linkedin: https://www.linkedin.com/in/nafiu-nizar-93a16720b

Другие мои публикации