フルスタックredditクローン-春のブート、反応、電子アプリ-パート2


フルスタックredditクローン-春のブート、反応、電子アプリ-パート2


導入


第2部に春のブートを使用してRedditのクローンを作成し、反応する.
我々は我々のプロジェクトを初期化し、必要なすべての依存関係を追加しました.この記事では、我々のバックエンドを完了するために必要なエンティティとリポジトリのすべてを作成するカバー!

重要なリンク

  • バックエンドソースhttps://github.com/MaxiCB/vox-nobis/tree/master/backend
  • フロントエンドソース:https://github.com/MaxiCB/vox-nobis/tree/master/client
  • 進行中のURL
  • Part 1 :ドメインエンティティの作成📝


    我々のアプリケーションが持つ異なるドメイン実体の全てをカバーしましょう.インサイドコム.お名前.バックエンドは、モデルと呼ばれる新しいパッケージを作成し、次のクラスを追加します.
    注意: Rambokを一部の依存関係としてインストールしました.私たちは開発プロセスを通して様々なロンボク注釈を使用します.これらの注釈にアクセスするには、IDEで注釈処理を有効にする必要があります.詳細については、ここでロンボクガイドを設定することができます.https://www.baeldung.com/lombok-ide
    注意:いくつかの場合、POMに次の依存関係を追加する必要があります.フィールド検証のためのXMLファイル
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    
  • ユーザー:一意のユーザーID、ユーザー名、パスワード、メールアドレス、Creationdate、AccountStatusを持っている
  •   package com.maxicb.backend.model;
    
        import lombok.AllArgsConstructor;
        import lombok.Data;
        import lombok.NoArgsConstructor;
    
        import javax.persistence.*;
        import javax.validation.constraints.Email;
        import javax.validation.constraints.NotBlank;
        import java.time.Instant;
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @Table(name = "users")
        @Entity
        public class User {
            @Id
            @SequenceGenerator(name = "USER_GEN", sequenceName = "SEQ_USER", allocationSize = 1)
            @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_GEN")
            private Long userId;
            @NotBlank(message = "Username is required")
            private String username;
            @NotBlank(message = "Password is required")
            private String password;
            @Email
            @NotBlank(message = "Email is required")
            private String email;
            private Instant creationDate;
            private boolean accountStatus;
        }
    
    
  • 投稿:ユニークなpostid、post名、URL、説明、votecount、ユーザー、creationdate、subredditを持っている
  •   package com.maxicb.backend.model;
    
        import lombok.AllArgsConstructor;
        import lombok.Builder;
        import lombok.Data;
        import lombok.NoArgsConstructor;
        import org.springframework.lang.Nullable;
    
        import javax.persistence.*;
        import javax.validation.constraints.NotBlank;
        import java.time.Instant;
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @Builder
        @Entity
        public class Post {
            @Id
            @SequenceGenerator(name = "POST_GEN", sequenceName = "SEQ_POST", allocationSize = 1)
            @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "POST_GEN")
            private Long postId;
            @NotBlank(message = "Post Title is required")
            private String postTitle;
            @Nullable
            private String url;
            @Nullable
            @Lob
            private String description;
            private Integer voteCount;
            @ManyToOne(fetch = FetchType.LAZY)
            @JoinColumn(name = "userId", referencedColumnName = "userId")
            private User user;
            private Instant creationDate;
            @ManyToOne(fetch = FetchType.LAZY)
            @JoinColumn(name = "id", referencedColumnName = "id")
            private Subreddit subreddit;
        }
    
    
  • Subreddit :ユニークなID、名前、説明、投稿、Creationdate、ユーザーを持つ
  •   package com.maxicb.backend.model;
    
        import lombok.AllArgsConstructor;
        import lombok.Builder;
        import lombok.Data;
        import lombok.NoArgsConstructor;
    
        import javax.persistence.*;
        import javax.validation.constraints.NotBlank;
        import java.time.Instant;
        import java.util.List;
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @Builder
        @Entity
        public class Subreddit {
            @Id
            @SequenceGenerator(name = "SUB_GEN", sequenceName = "SEQ_SUB", allocationSize = 1)
            @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SUB_GEN")
            private Long id;
            @NotBlank(message = "Subreddit name is required")
            private String name;
            @NotBlank(message = "Subreddit description is required")
            private String description;
            @OneToMany(fetch = FetchType.LAZY)
            private List<Post> posts;
            private Instant creationDate;
            @ManyToOne(fetch = FetchType.LAZY)
            private User user;
        }
    
    
  • 投票:ユニークなID、投稿、ユーザーがあります
  •   package com.maxicb.backend.model;
    
        import lombok.AllArgsConstructor;
        import lombok.Builder;
        import lombok.Data;
        import lombok.NoArgsConstructor;
    
        import javax.persistence.*;
        import javax.validation.constraints.NotNull;
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @Builder
        @Entity
        public class Vote {
            @Id
            @GeneratedValue(strategy = GenerationType.SEQUENCE)
            private Long voteId;
            private VoteType voteType;
            @NotNull
            @ManyToOne(fetch = FetchType.LAZY)
            @JoinColumn(name = "postId", referencedColumnName = "postId")
            private Post post;
            @ManyToOne(fetch = FetchType.LAZY)
            @JoinColumn(name = "userId", referencedColumnName = "userId")
            private User user;
        }
    
    
  • ユニークなID、テキスト、ポスト、Creationdateを持ちます
  •   package com.maxicb.backend.model;
    
        import lombok.AllArgsConstructor;
        import lombok.Builder;
        import lombok.Data;
        import lombok.NoArgsConstructor;
    
        import javax.persistence.*;
        import javax.validation.constraints.NotEmpty;
        import java.time.Instant;
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @Builder
        @Entity
        public class Comment {
            @Id
            @GeneratedValue(strategy = GenerationType.SEQUENCE)
            private Long id;
            @NotEmpty
            private String text;
            @ManyToOne(fetch = FetchType.LAZY)
            @JoinColumn(name = "postId", referencedColumnName = "postId")
            private Post post;
            private Instant creationDate;
            @ManyToOne(fetch = FetchType.LAZY)
            @JoinColumn(name = "userId", referencedColumnName = "userId")
            private User user;
        }
    
    
  • votetype enum : upvote , downvote
  •     public enum VoteType {
            UPVOTE(1), DOWNVOTE(-1);
    
            VoteType(int direction) {}
        }
    
    
  • ユニークなID、トークン、ユーザー、exparetiondate
  •   package com.maxicb.backend.model;
    
        import lombok.AllArgsConstructor;
        import lombok.Builder;
        import lombok.Data;
        import lombok.NoArgsConstructor;
    
        import javax.persistence.*;
        import java.time.Instant;
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @Builder
        @Table(name = "token")
        @Entity
        public class AccountVerificationToken {
            @Id
            @GeneratedValue(strategy = GenerationType.IDENTITY)
            private Long id;
            private String token;
            @OneToOne(fetch = FetchType.LAZY)
            private User user;
            private Instant expirationDate;
        }
    
    
  • 通知メール:件名、受入、本文
  •   package com.maxicb.backend.model;
    
        import lombok.AllArgsConstructor;
        import lombok.Data;
        import lombok.NoArgsConstructor;
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        public class NotificationEmail {
            private String subject;
            private String recepient;
            private String body;
        }
    
    

    パート2 :リポジトリの作成👩‍


    今では、データベースにEntitesを格納する責任があるリポジトリをカバーする必要があります.インサイドコム.お名前.バックエンドは、リポジトリと呼ばれる新しいパッケージを作成し、次のインターフェイスを追加します.
  • ユーザリポジトリ
  •     package com.maxicb.backend.repository;
    
        import com.maxicb.backend.model.User;
        import org.springframework.data.repository.CrudRepository;
    
        import java.util.Optional;
    
        public interface UserRepository extends CrudRepository<User, Long> {
            Optional<User> findByUsername(String username);
        }
    
  • ポストリポジトリ
  •     package com.maxicb.backend.repository;
    
        import com.maxicb.backend.model.Post;
        import com.maxicb.backend.model.Subreddit;
        import com.maxicb.backend.model.User;
        import org.springframework.data.repository.CrudRepository;
    
        import java.util.List;
    
        public interface PostRepository extends CrudRepository<Post, Long> {
            List<Post> findAllBySubreddit(Subreddit subreddit);
    
            List<Post> findByUser(User user);
        }
    
  • Subredditリポジトリ
  •   package com.maxicb.backend.repository;
    
      import com.maxicb.backend.model.Subreddit;
      import org.springframework.data.repository.CrudRepository;
    
      import java.util.Optional;
    
      public interface SubredditRepository extends CrudRepository<Subreddit, Long> {
          Optional<Subreddit> findByName(String subredditName);
      }
    
  • リポジトリ
  •     package com.maxicb.backend.repository;
    
        import com.maxicb.backend.model.Post;
        import com.maxicb.backend.model.User;
        import com.maxicb.backend.model.Vote;
        import org.springframework.data.repository.CrudRepository;
    
        import java.util.Optional;
    
        public interface VoteRepository extends CrudRepository<Vote, Long> {
            Optional<Vote> findTopByPostAndUserOrderByVoteIdDesc(Post post, User currentUser);
        }
    
  • コメントリポジトリ
  •     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.CrudRepository;
    
        import java.util.List;
    
        public interface CommentRepository extends CrudRepository<Comment, Long> {
            List<Comment> findByPost(Post post);
    
            List<Comment> findAllByUser(User user);
        }
    
  • トークンリポジトリ
  •   package com.maxicb.backend.repository;
    
    import com.maxicb.backend.model.AccountVerificationToken;
    import org.springframework.data.repository.CrudRepository;
    
    import java.util.Optional;
    
    public interface TokenRepository extends CrudRepository<AccountVerificationToken, Long> {
        Optional<AccountVerificationToken> findByToken(String token);
    }
    

    結論🔍

  • すべてが正しく構成されるようにするには、アプリケーションを実行し、コンソールにエラーがないことを確認できます.コンソールの底に向けて、以下のような出力を見るべきです
  • この記事では、私たちは、私たちの春のブートバックエンド内で必要なエンティティとリポジトリを作成しました.あとに続くすべてのロジックの基礎を築くこと.

  • 登録、電子メールの送信、アカウントの活性化/検証の実装。