Git Product home page Git Product logo

sportsdayapi's Introduction

api_banner

SportsDayAPI

SportsDayAPIは、各リソースへのアクセス、認証を行うREST APIです。

  • Ktorによる高速化 🚀
  • キャッシュシステムでDB負荷を軽減 🎈
  • Kubernetesサポート 💪

動作環境

  • JDK 11
  • MySQL 8.0
  • Redis 7.0 (クラスター化するに必須)

環境変数

Name Description
AZURE_AD_TENANT_ID Azure AD テナントID
DATABASE_HOST データベースホスト
DATABASE_PORT データベースポート
DATABASE_USER データベースユーザー名
DATABASE_PASSWORD データベースパスワード
DATABASE_DB データベース名
DISCORD_WEBHOOK Discord Webhook URL
REDIS_HOST Redis ホスト
ALLOWED_HOSTS 許可するホスト(CORS)
OUTPUT_REQUEST_LOG リクエストログを出力するかどうか
OUTPUT_REDIS_LOG Redisログを出力するかどうか

開発

Linter

コミットする前にlinter formatを実行すると幸せになります。

./gradlew ktlintFormat

Git branch

mainブランチから作業用のブランチを切って作業を行います。

Style

<type>/#<issue-number>-<alias>

Type

main: プロダクション用ブランチ
feature: 開発用ブランチ

Git commit

Template

<type>: <subject>

Type

  • feat: 新機能
  • change: 修正・削除
  • fix: バグフィックス
  • docs: ドキュメントに関する変更
  • style: フォーマット等の変更
  • refactor: リファクタに関する変更
  • debug: デバック用のコード
  • test: テストコードの追加・更新
  • chore: GitHub Actions等タスクに関する変更

LICENSE

Apache-2.0 Copyright Sports-day

sportsdayapi's People

Contributors

1nayu avatar testusuke avatar

Stargazers

 avatar

sportsdayapi's Issues

ActionsでCI機能を実装

概要
Lint, Build, JUnit等のCIをActions上で動かし、質を高める

タスク

  • Lint系のCI導入
  • BuildのCI導入
  • JUnitのCI導入

リーグ結果からのトーナメント出場チーム補完

概要
リーグ結果を確認して、手動でトーナメント出場チームを設定する手間がかかるので、リーグ結果よりトーナメント出場チームを自動で補完する機能

タスク

  • 試合のチームを特定のリーグ・トーナメントの優勝チーム等との依存関係を追加できるようにする
  • 検証

試合の結果を申告制にする機能

概要
審判から結果の紙を受け取って管理者がSPORTSDAYに入力していくのは無駄な手間が一つ増えるため、審判がweb appより結果を申告できるようにする。申告された結果は管理者が承認する形式にする。

タスク

  • 審判箇所を文字列からteamエンティティにする
  • 開始時間が近づいた審判の試合を返すエンドポイントの開発
  • 試合結果を申告するエンドポイントの開発
  • 試合結果を承認するエンドポイントの開発
  • 検証

テーブルの一部再設計

概要
テーブルの設計を見直す。
見直す余地のあるテーブルとして、トーナメントパス、ユーザー連携等がある。

Group機能を削除

概要

グループ分けはサブドメインで分ければいいからいらない

晴天時・雨天時等の切り替え機能

概要
晴天時の場合、雨天時の登録データを削除する必要がある。
しかし、人的ミスで意図しないデータが消えるリスクが考えられるので、切り替えできる機能を実装すればいいと思う。

タスク

  • TagsのCRUDを作成
  • Tagの状態に応じてオブジェクト返すかを制御する
  • 検証

外部キーをエンティティーに置き換える

概要
フロントエンドの実装を考えて、バックエンド側で外部キーをエンティティーに置き換えてレスポンスする

Refactor: Dependency Injectionを導入
DI,DDDを導入する際にこのissueが解決する

例:

{
  "id": 1,
  "name": "Team A",
  "usersIds": [
    1, 3
  ]
}

以下のようにusersに置き換える。

{
  "id": 1,
  "name": "Team A",
  "users": [
    {
      "id": 1,
      "name": "User A"
    },
    {
      "id": 3,
      "name": "User A"
    }
  ]
}

タスク

  • Entity::serializable()関数を再設計or廃止して別のものにする
  • DTOからレスポンスを作成
  • レスポンスのJSONを直す

権限データベースのキャッシュ

概要

ユーザーの権限などを各ノードでキャッシュする場合、うまく同期できないことが予想できる。
そこで一時的な共有キャッシュとしてRedisを活用する。

タスク

  • 権限キャッシュ部分の取り除き
  • Redisへキャッシュする
  • クラスターで検証

権限ベースの認可

概要

Roleを取り除いた状態では、認可ができていないので権限ベースの認可を追加する

タスク

  • Permissionドメイン実装
  • PermissionGroupドメイン実装
  • 認可フロー(pipeline?)実装
  • 検証

チームタグ機能

概要

ドメインがリファクタリングを通して変更されていくため一時的な識別方法としてチームタグ機能を設けることにした

タスク

  • TeamTagドメイン追加
  • エンドポイント追加

残り試合数に応じて503を返す

概要

集計が終わる前に結果がわかってしまうのはよろしくないので、残り試合数がある割合になれば503を返す

タスク

  • コンフィグ周りを実装
  • コンフィグ用のエンドポイント作成
  • バックエンド側で503を返すか判定
  • フロント側で503を検知して表示
  • 検証

OpenID Connectを用いた特定のプロバイダーに依存しない認証

概要

現在実装されている認証方法は、改善が必要だと考えられる。その要因としては、以下の2つが挙げられる。

  • 特定のプロバイダー(現在はAzure AD)でしかログインが行えない点
  • 本来ならプロバイダーのリソースサーバーへのアクセスで使用するためのトークンを、本システムの認証にも流用している点

OpenID Connectを用いた認証方法に移行を行う

タスク

  • MicrosoftAccountsをUsersに統合
  • 認証フローを修正
  • 検証

プロフィール画像をImagesに保存する

概要

Usersにプロフィール画像を直接埋め込むとフェッチにかかる時間が大幅に長くなるため、Imagesに保存してUsersにはurlとして保存する

タスク

  • Imagesの改良
  • UsersにImagesの外部キー挿入
  • URL経由で画像ファイルを配信できるように変更
  • ログイン時の非同期画像更新
  • 検証

リファクタリング

概要
Dependency Injectionを導入し可読性を向上させ、開発へ参加のハードルを下げることを目的とする。

タスク

  • Linter導入
  • 複雑な(汚い)コードのリファクタリング
  • DI導入
  • ドキュメント化

データキャッシュシステムの再設計

概要

Refactor: Dependency Injectionを導入
DI,DDDを導入する際にこのissueもついでに解決する

すべてのPodが正しくデータを同期できていない場合があるので再設計する。

原因として考えられるもの:

  • Redisのメッセージを落としている
  • DBが過負荷でトランザクションが複数回失敗し取得ができていない
    上にあげた以外に、考えられる原因はあるかもしれない。

完璧にデータを同期できるシステムを作る。かつ、DBに負荷の少ないシステムにする。

タスク

  • 原因を調査する
  • 設計
  • 実装
  • 検証

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.