View on GitHub

評価値の登録

Home

評価値の登録

API

評価値登録API

frontend/src/services/ratings/postRating.ts

import { ApiContext, Movie, User } from '@/types/data';
import { fetcher } from '@/utils';

const context: ApiContext = {
  apiRootUrl: process.env.NEXT_PUBLIC_API_BASE_URL,
};

/**
 * 評価値登録API
 * @param user ユーザ
 * @param movie 映画
 * @param rating 評価値
 */
const postRating = async (user: User, movie: Movie, rating: number) => {
  const id = user.id + '_' + String(movie.id).padStart(6, '0');
  const body = {
    id: id,
    user_id: user.id,
    movie_id: movie.id,
    rating: rating,
  };
  await fetcher(`${context.apiRootUrl?.replace(/\/$/g, '')}/ratings/`, {
    method: 'POST',
    headers: {
      Accept: 'application/json',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(body),
  });
};

export default postRating;

コンポーネント

スターコンポーネント

frontend/src/app/components/rating/Star.tsx

......
type Props = {
  index: number;
  width: number;
  rating: number;
  setRating: Function;
  handleRatingClick: Function; // <- 追加
};

const Star = (props: Props) => {
  const handleRatingClick = async () => {
    const rating = (props.index + 1) / 2;
    await props.setRating(rating);
    props.handleRatingClick(rating); // <- 追加
  };
......
};

export default Star;

評価値コンポーネント

frontend/src/app/components/rating/StarRating.tsx

......
type Props = {
  starWidth: number;
  rating: number;
  handleRatingClick: Function; // <- 追加
};

const StarRating = (props: Props) => {
  const [rating, setRating] = useState<number>(props.rating);

  return (
    <>
      <div className="flex">
        {(function () {
          const stars = [];
          for (let i = 0; i < 10; i++) {
            stars.push(
              <Star
                key={i}
                index={i}
                width={props.starWidth}
                rating={rating}
                setRating={setRating}
                handleRatingClick={props.handleRatingClick} // <- 追加
              />
            );
          }
          return <div>{stars}</div>;
        })()}
      </div>
    </>
  );
};

export default StarRating;

映画詳細カードコンポーネント

frontend/src/app/components/movie/MovieCardDetail.tsx

'use client'; // <- 追加
import { Movie, User } from '@/types/data';
import Image from 'next/image';
import React from 'react';
import StarRating from '../rating/StarRating';
import postRating from '@/services/ratings/postRating'; // <- 追加
......
const MovieCardDetail = (props: Props) => {
  const img_url = '/img/dummy_poster.png';

  // ↓追加
  const handleRatingClick = async (rating: number) => {
    await postRating(props.user, props.movie, rating);
  };
  // ↑追加

  return (
    <>
      <article key={props.movie.id}>
...(略)...
        {props.user ? (
          <StarRating
            starWidth={STAR_WIDTH}
            rating={props.movie.rating?.rating}
            handleRatingClick={handleRatingClick} // <- 追加
          />
        ) : (
          <></>
        )}
      </article>
    </>
  );
};

export default MovieCardDetail;

映画カードコンポーネント

frontend/src/app/components/movie/MovieCard.tsx

import { Movie, User } from '@/types/data';
import Image from 'next/image';
import Link from 'next/link';
import React from 'react';
import StarRating from '../rating/StarRating';
import postRating from '@/services/ratings/postRating'; // <- 追加
......
const MovieCard = (props: Props) => {
  const img_url = '/img/dummy_poster.png';

  // ↓追加
  const handleRatingClick = async (rating: number) => {
    await postRating(props.user, props.movie, rating);
  };
  // ↑追加

  return (
    <>
      <article className="h-72 w-32 shadow" key={props.movie.id}>
...(略)...
        {props.user ? (
          <StarRating
            starWidth={STAR_WIDTH}
            rating={props.movie.rating?.rating}
            handleRatingClick={handleRatingClick} // <- 追加
          />
        ) : (
          <></>
        )}
...(略)...
      </article>
    </>
  );
};

export default MovieCard;

ブラウザで下記URLにアクセスしてください。

サインイン後、任意の評価値をクリックすると、下記のようにratingsテーブルに評価値が登録されます。下記の例では、movie_id=1の映画に対して、評価値4.5を与えています。

recsys_full=# SELECT * FROM ratings;
        id         | rating |           rated_at            | movie_id |   user_id   
-------------------+--------+-------------------------------+----------+-------------
 【ユーザID】_000001 |    4.5 | 2025-03-22 16:23:06.366922+09 |        1 | 【ユーザID】
...(略)...

ブラウザで下記URLにアクセスしてください。

同様に、映画リスト上でも任意の評価値をクリックすることで、ratingsテーブルに評価値が登録されます。ただし、現時点では、バックエンドサーバから評価値を取得していませんので、映画リスト上で評価値を更新しても、ブラウザを更新したり、ページを切り替えると、元の表示に戻ります。