Рубрики
Без рубрики

Полный Стек Reddit Clone – Spring Boot, React, Приложение Electron – Часть 8

Полный стек Reddit Clone – Spring Boot, React, Приложение Electron – Введение в часть 8… С тегами react, java, typescript, javascript.

Вступление

Добро пожаловать в часть 8 создания клона Reddit с использованием Spring Boot и React.

Что мы строим в этой части?

  • Голосовать ЗА
  • Исключение для голосования
  • Служба голосования
  • Контролер голосования

В части 7 мы добавили конечные точки СОЗДАНИЯ и ЧТЕНИЯ для создания и чтения комментариев!!

Важные ссылки

Часть 1:: Голосовать ЗА 📨

Давайте рассмотрим наши DTO, которые нам понадобятся для получения и отправки информации о голосовании. Внутри com.your-name.backend.to мы создадим следующий класс.

  • VoteDTO: Обрабатывает создание данных, которые будут отправлены с клиента в API.
import com.maxicb.backend.model.VoteType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class VoteDTO {
    private VoteType voteType;
    private Long id;
}

Часть 2: Исключение для голосования 🚫

Давайте рассмотрим наши пользовательские исключения, которые нам понадобятся. Внутри com.your-name.backend.exception мы создадим следующий класс.

  • Исключение для голосования: Обрабатывает исключения, связанные с поиском недопустимого пользователя.
package com.maxicb.backend.exception;

public class VoteException extends RuntimeException {
        public VoteException(String message) {
            super(message);
        }
}

Часть 3: Служба голосования 🌎

Давайте рассмотрим сервис голосования, который будет иметь наше приложение. Внутри com.your-name.backend.services добавьте следующий класс.

  • VoteService: Содержит логику для сопоставления данных с DTO и из DTO и добавления голосов к сообщению.
package com.maxicb.backend.service;

import com.maxicb.backend.dto.VoteDTO;
import com.maxicb.backend.exception.PostNotFoundException;
import com.maxicb.backend.model.Post;
import com.maxicb.backend.model.Vote;
import com.maxicb.backend.repository.PostRepository;
import com.maxicb.backend.repository.VoteRepository;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

import static com.maxicb.backend.model.VoteType.UPVOTE;

@Service
@AllArgsConstructor
public class VoteService {
    private final VoteRepository voteRepository;
    private final PostRepository postRepository;
    private final AuthService authService;

    private Vote maptoVote(VoteDTO voteDTO, Post post) {
        return Vote.builder()
                .voteType(voteDTO.getVoteType())
                .post(post)
                .user(authService.getCurrentUser())
                .build();
    }

    @Transactional
    public void vote(VoteDTO voteDTO) {
        Post post = postRepository.findById(voteDTO.getId())
                .orElseThrow(() -> new PostNotFoundException("Post not found with id:" + voteDTO.getId()));
        Optional votePostAndUser = voteRepository.findTopByPostAndUserOrderByVoteIdDesc(post, authService.getCurrentUser());
        if(votePostAndUser.isPresent() && votePostAndUser.get().getVoteType().equals(voteDTO.getVoteType())) {
            throw new PostNotFoundException("You've already " + voteDTO.getVoteType() + "'d this post");
        }
        if(UPVOTE.equals(voteDTO.getVoteType())) {
            post.setVoteCount(post.getVoteCount() + 1);
        } else {
            post.setVoteCount(post.getVoteCount() - 1);
        }
        voteRepository.save(maptoVote(voteDTO, post));
        postRepository.save(post);
    }
}

Часть 4: Контролер голосования 🌐

Давайте рассмотрим контроллер голосования, который будет иметь наше приложение. Внутри com.your-name.backend.controller добавьте следующий класс.

  • VoteController: Удерживайте конечные точки, добавляя голоса к определенному сообщению.
package com.maxicb.backend.controller;

import com.maxicb.backend.dto.VoteDTO;
import com.maxicb.backend.service.VoteService;
import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/vote")
@AllArgsConstructor
public class VoteController {

    private final VoteService voteService;

    @PostMapping
    public ResponseEntity vote(@RequestBody VoteDTO voteDTO) {
        voteService.vote(voteDTO);
        return new ResponseEntity<>(HttpStatus.OK);
    }
}

Вывод 🔍

  • Чтобы убедиться, что все настроено правильно, вы можете запустить приложение и убедиться, что в консоли нет ошибок. В нижней части консоли вы должны увидеть вывод, аналогичный приведенному ниже
  • Если в консоли нет ошибок, вы можете протестировать логику голосования, отправив post-запрос по адресу http://localhost:8080/api/vote со следующими данными. Вам все равно придется выполнить те же действия, что и в предыдущих частях, чтобы войти в учетную запись для создания сообщений, а также создать субреддит и действительную запись для добавления комментария.
{
    "voteType": "UPVOTE",
    "id": 
}
  • Теперь вы можете отправить запрос GET в http://localhost:8080/api/posts/ чтобы увидеть изменение подсчета голосов в посте, за который вы только что проголосовали.
{
    "postId": 9,
    "postTitle": "Testing Post",
    "url": "URL",
    "description": "DESCRIPTION",
    "userName": "USERNAME",
    "subredditName": "/r/NAME",
    "voteCount": 1,
    "commentCount": 1,
    "duration": "4 hours ago",
    "upVote": true,
    "downVote": false
}
  • В этой статье мы реализовали логику голосования по постам!.

Следующий

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

Оригинал: “https://dev.to/maxicb/full-stack-reddit-clone-spring-boot-react-electron-app-part-8-oa7”