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

Клон Reddit с полным стеком – Spring Boot, React, Электронное приложение – Часть 7

Клон Reddit с полным стеком – Spring Boot, React, Электронное приложение – Введение в часть 7… С тегами react, typescript, java, javascript.

Вступление

Добро пожаловать в часть 7 о создании клона Reddit с помощью Spring Boot и реагируйте.

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

  • Запрос комментариев К
  • Комментарий Ответ НА
  • Обновить репозиторий комментариев
  • Служба комментариев
  • Конечные точки чтения Комментариев
  • СОЗДАТЬ конечную точку комментария

В части 6 мы добавили некоторые пользовательские исключения и сделали наши конечные точки post!

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

Часть 1: Комментарий DTO 📨

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

  • Запрос комментария: Обрабатывает создание данных, которые будут отправлены клиентом в API.
package com.maxicb.backend.dto;

import com.maxicb.backend.model.Post;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CommentRequest {
    private Long id;
    private String text;
    private Post post;
}
  • Ответ на комментарий: Обрабатывает создание данных, которые будут отправлены клиенту из API.
package com.maxicb.backend.dto;

import com.maxicb.backend.model.User;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.Instant;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CommentResponse {
    private Long id;
    private String text;
    private Long postId;
    private Instant creationDate;
    private User user;
}

Часть 2. Обновление репозитория комментариев 📨

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

  • Хранилище комментариев
package com.maxicb.backend.repository;

import com.maxicb.backend.model.Comment;
import com.maxicb.backend.model.Post;
import com.maxicb.backend.model.User;
import org.springframework.data.repository.PagingAndSortingRepository;

import java.util.List;

public interface CommentRepository extends PagingAndSortingRepository {
    List findByPost(Post post);

    List findAllByUser(User user);
}

Часть 3: Служба комментариев 🌎

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

  • Служба комментариев: Поддерживает логику сопоставления данных с и с, получения всех комментариев по опубликованным, получения комментариев конкретных пользователей и добавления комментариев к публикациям.
package com.maxicb.backend.service;

import com.github.marlonlom.utilities.timeago.TimeAgo;
import com.maxicb.backend.dto.CommentRequest;
import com.maxicb.backend.dto.CommentResponse;
import com.maxicb.backend.exception.PostNotFoundException;
import com.maxicb.backend.exception.UserNotFoundException;
import com.maxicb.backend.model.Comment;
import com.maxicb.backend.model.Post;
import com.maxicb.backend.model.User;
import com.maxicb.backend.repository.CommentRepository;
import com.maxicb.backend.repository.PostRepository;
import com.maxicb.backend.repository.UserRepository;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.Instant;
import java.util.List;
import java.util.stream.Collectors;

@Service
@AllArgsConstructor
@Transactional
public class CommentService {
    private final UserRepository userRepository;
    private final PostRepository postRepository;
    private final CommentRepository commentRepository;
    private final AuthService authService;

    private CommentResponse mapToResponse(Comment comment) {
        return CommentResponse.builder()
                .id(comment.getId())
                .text(comment.getText())
                .postId(comment.getPost().getPostId())
                .creationDate(TimeAgo.using(comment.getCreationDate().toEpochMilli()))
                .userName(comment.getUser().getUsername())
                .build();
    }

    private Comment mapToComment(CommentRequest commentRequest) {
        User user = authService.getCurrentUser();
        Post post = postRepository.findById(commentRequest.getPostId())
                .orElseThrow(() -> new PostNotFoundException("Post not found with id: " + commentRequest.getPostId()));
        return Comment.builder()
                .text(commentRequest.getText())
                .post(post)
                .creationDate(Instant.now())
                .user(user)
                .build();
    }

    public CommentResponse save(CommentRequest commentRequest) {
        return mapToResponse(commentRepository.save(mapToComment(commentRequest)));
    }

    public List getCommentsForPost(Long id) {
        Post post = postRepository.findById(id)
                .orElseThrow(() -> new PostNotFoundException("Post not found with id: " + id));
        return commentRepository.findByPost(post)
                .stream()
                .map(this::mapToResponse)
                .collect(Collectors.toList());
    }

    public List getCommentsForUser(Long id) {
        User user = userRepository.findById(id)
                .orElseThrow(() -> new UserNotFoundException("User not found with id: " + id));
        return commentRepository.findAllByUser(user)
                .stream()
                .map(this::mapToResponse)
                .collect(Collectors.toList());
    }
}

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

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

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

import com.maxicb.backend.dto.CommentRequest;
import com.maxicb.backend.dto.CommentResponse;
import com.maxicb.backend.service.CommentService;
import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/comments")
@AllArgsConstructor
public class CommentController {
    private final CommentService commentService;

    @PostMapping
    public ResponseEntity addComment(@RequestBody CommentRequest commentRequest) {
        return new ResponseEntity<>(commentService.save(commentRequest), HttpStatus.CREATED);
    }

    @GetMapping("/post/{id}")
    public ResponseEntity> getCommentsByPost(@PathVariable Long id) {
        return new ResponseEntity<>(commentService.getCommentsForPost(id), HttpStatus.OK);
    }

    @GetMapping("/user/{id}")
    public ResponseEntity> getCommentsByUser(@PathVariable Long id) {
        return new ResponseEntity<>(commentService.getCommentsForUser(id), HttpStatus.OK);
    }
}

Вывод 🔍

  • Чтобы убедиться, что все настроено правильно, вы можете запустить приложение и убедиться, что в консоли нет ошибок. В нижней части консоли вы должны увидеть вывод, аналогичный приведенному ниже
  • Если в консоли нет ошибок, вы можете проверить логику создания комментариев, отправив запрос post на http://localhost:8080/api/comments со следующими данными. Вам все равно придется выполнить те же действия, описанные в предыдущих частях, чтобы войти в учетную запись для публикации, а также создать субреддит и действительную публикацию для добавления комментария.
{
    "postId": ,
    "text": "My First Comment!!"
}
  • В этой статье мы добавили конечные точки СОЗДАНИЯ и ЧТЕНИЯ для создания и чтения комментариев!.

Следующий

Система голосования! Часть 8

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