Coder Social home page Coder Social logo

toebeans's Introduction

ToeBeans

ToeBeans is a social media service for cat lovers!

https://toebeans.ml/landing Not in service now.

toebeans_demo.mp4

Features

Released

Regular user can:

  • User
    • Register a user
    • Read user info
    • Update user info
    • Delete a user
    • Password change
  • Posting
    • Post a posting
    • Read postings
    • Delete a posting
  • Like
    • Do a like
    • Delete a like
  • Follow
    • Do a follow
    • Delete a follow
  • Report
    • Do a report

Guest user can:

  • User
    • Read user info
  • Posting
    • Post a posting
    • Read postings
    • Delete a posting
  • Like
    • Do a like
    • Delete a like
  • Follow
    • Do a follow
    • Delete a follow

Basically, guest user can do only read actions.

Coming

  • Comment
  • Search
  • Notification
  • Refresh token
  • Ranking
  • Block user
  • Movie posting

Tech stacks

  • HTML/CSS/JavaScript/React
  • Go/OpenAPI/MySQL
  • Docker/AWS/Terraform
  • GitHub/GitHub Actions

Architecture Layout

Architecture

※インフラコスト削減を優先しているためRDSの冗長化はしていません。

Documents

API

See backend/openapi.yml .

Backend

See backend/README.md .

Infra

See infra/README.md .

Design memo

https://docs.google.com/presentation/d/1iqj8Hsm_CTQPWf_kTsZQMqlHoHxr-md7kc2Zsn8oom8/edit?usp=sharing

Launch in local

Backend

投稿画像が猫画像かどうかのチェックは本番環境のみでの使用を想定している。ローカルでも確認したい場合は、docker-compose.ymlAPP_ENVprdにし、GOOGLE_API_KEYの値を設定する。値はSSMのパラメータストアに設定されている。

$ cd backend
$ ./serverrun.sh
# go run main.go

localhost:9000でminioコンソールにログインし、toebeans-postingsEdit policy* READ and Writeを追加する。サーバを再起動するたびにこの設定は必要。

Frontend

frontend/.envをローカル用のものに変更する。

$ cd frontend
$ npm install
$ npm start

Browser

Access to localhost:3000/login.

toebeans's People

Contributors

gold-kou avatar

Stargazers

 avatar

Watchers

 avatar

toebeans's Issues

[Frontend] MyPage画面で他ユーザの投稿も表示されてしまう

原因調査

getMyPageでuserNameが設定される前に、getUserPostsが実行され、バックエンドのAPIをパラメータuser_nameが空文字でリクエストしてしまっており、全ユーザの投稿も取得してしまっている。

対応

Home画面時にグローバルstateでユーザ名を扱うとしたが、stateなのでページロードすると消えてしまう。
そこで、Home画面時にlocalStorageにloginUserNameを格納することにする。

[Frontend] Fix axios error handling

今は、 axiosのラッパー関数呼び出し側のcatch で setErrMessage(error.response.data.message) とかしてるけど、dataない場合とかある。

[Backend] Fix various things for Frontend

Frontend作りながら、Backend仕様でいまいちなところを直していきます。

  • titleは"_"不可のvalidation
    • Frontendでは_でsplitしているため。 {title.split("_")[2]}<
  • getPostsでavatorも返す
  • getPostsでリクエストクライアント自身がPost毎にLikeしたかどうか(bool)のプロパティが欲しい
  • DELETE /like/{like_id}/like/{posting_id}
    • like_id で削除するのは変に複雑なデータ加工ややりとりが発生する。IDトークンでユーザ情報判明するのでposting_idだけ指定すればうまく消せそう。
  • パスワード変更APIの追
  • IDトークンはCookieで管理
  • CSRFトークン追加
  • lsof をアプリコンテナで使えるようにする
  • etc

[Frontend] Infinite scroll

最後の投稿までスクロールしたら、次の投稿取得APIを実行する箇所が抜けている。
2回目以降のリクエストでは、 since_at には前回実行で取得した投稿データの最後の uploaded_at を使用する。

Feed / MyPage で要対応。

[Backend] logging middleware

  • ログをミドルウェア化
  • ServeHttpの下で呼び出してステータスやレイテンシーも出力する

[Backend]Add batch

  • Reset password_reset_email_count
  • 1ヶ月以上いいねされていない画像は削除

Add common files of Backend

To begin with, I need some common files to develop backend.

  • OpenAPI models
  • Router
  • S3
  • DB setting
  • Healthcheck
  • etc

[Backend] health check

  • /health → /health/liveness
  • Readiness エンドポイントを追加する。DB含めた生存確認。 /health/readiness

[Backend] controller refactoring

  • controler 層をまとめる。エンドポイントごとにcontrolerのgoファイルを用意するのでなく、意味的に集約する。集約した中で request の r.URL.String() を case文で分岐処理すればパスが異なるやつも意味的に同じなら集約できる。

投稿一覧取得で多重にデータが表示されてしまう

原因調査

Home画面上にて、投稿総数が4以下の場合にgetPostsが多数実行されてしまうことを確認。 await axios.get(/postings?since_at=${sinceAt}&limit=10) が完了する前にgetPostsが繰り返し実行されているようである。
なぜ4かというと、Home画面で最初に見える投稿数が4つまでだから。画面長さを短くすれば、投稿数が4つでも多数実行されることはないことを確認した。また、ページ下部でページロードを実行すると、同じ事象が発生する。
同様事象はMyProfile画面でも発生する。

暫定対応

投稿総数がHome画面上に最初に表示できる数以下という状態は、通常発生しえないため、実装の対応は優先度低い。
ページ下部でページロードすることも比較的発生はしにくいと考える。
とりあえず、ダミーデータいれて運用する。

[Backend] Conflictエラーに変える

以下が400エラーになっていたり、考慮されていない。全てconflictエラーにする。

  • 自分の投稿にいいねリクエストする
  • フォロー済みのユーザをフォローリクエストする
  • いいねしていない投稿にいいね削除リクエストする
  • フォローしていないユーザにフォロー削除リクエストする

[Backend] Add ML

画像アップロード時に google cloud vision api で猫タグがあるかを判定する。
api実行自体が失敗した場合は、Warningログだけだして、ML機能の縮退にする。(外部のAPI仕様変更にひっぱられたくない)

[Backend]エラーレスポンスに必要以上の情報を載せない。

認証まわりの機能に関して、レスポンスのエラーメッセージに必要以上に情報を与えてしまい、セキュリティ上問題がある箇所がないかを確認し、必要あれば修正する。そのようなログイン失敗イベントはログに残す。

  • ログイン失敗時に「パスワードが間違っています」とするのでなく、「メールあるいはパスワードが間違っています」とすべき。

Add guest user

  • add a special token for guest user
  • prohibited methods for guest user

user-activationのレスポンスについて

/user-activation/{user_name}/{activation_key} のレスポンスはHTMLを返すようにしたほうがいいかも。
「アカウント有効化に成功しました。ログインはこちら。」みたいな。

mono repo

I want a mono repository of frontend and backend and infra.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.