[ English | 日本語版 ]
liketion はコンテナベースのシンプルなイイね機能バックエンドを提供します。 ブログや個人ページなどにイイね機能を導入したい場合、liketion サーバにより REST API 経由でイイね管理を行えます。
$ docker -v
Docker version 20.10.10, build b485636
以下コマンドにより docker image をビルドできます。
git clone https://github.com/badmintoncryer/liketion.git
cd liketion
docker build . -t liketion
また、dockerhub からイメージを pull することもできます。
docker pull nixiemintonprivate/liketion:latest
以下コマンドから docker コンテナを起動させることができます。 この時、/path/to/db は適切なものに変更して下さい。(DB には SQLite を用いているため、永続化を行うディレクトリを指定する必要があります。)
docker run -d --rm --name liketion -p 127.0.0.1:3000:3000 -v /path/to/db:/usr/src/app/db -v /usr/src/node_modules liketion
細かいことは気にせずとりあえず動かしてみたい。という方は、以下の docker compose コマンドを試してみて下さい。
git clone https://github.com/badmintoncryer/liketion.git
cd liketion
docker compose up
curl -X POST -H "Content-Type: application/json" -d '{"name": "user name"}' http://localhost:3000/root_path/unique_id
curl http://loaclhost:3000/root_path/unique_id
各種設定は /config/settings.yaml で行います。
liketion が listen するポート番号を設定します。 初期値は 3000 です。
liketion が listen するルートパスを設定します。
例えば、https://example.com/liketionをルートとしたい場合、rootPath: '/liketion'
.と設定して下さい。
この時パス末尾のスラッシュは不要です。
liketion を動かしたい場合、以下コマンドで実行可能です。
docker compose up
or
docker build . -t liketion
docker run -d --rm --name liketion -p 127.0.0.1:3000:3000 -v /path/to/db:/usr/src/app/db -v /usr/src/node_modules liketion
or
yarn dev
Liketion が http://localhost:3000 で listen している状態で、動作検証用のサンプルアプリを動作させることができます。
$ cd ./sample/sample-react-app
$ yarn
$ PORT=2345 yarn start
http://localhost:2345 にアクセスするとサンプルアプリにアクセスでき、liketion へイイねを登録させることができます。
いいねを登録するための API です。ユニーク ID とユーザ名をペアとして、DB への登録を行います。 ブログページの URL など、一意な文字列をユニーク ID とすることを想定しています。
POST https://example.com/{ROOT_PATH}/${id}
key | value |
---|---|
name | [string] |
key | value | description |
---|---|---|
status | "OK" or "Already Registered" | 既に同一の id, naem の組が DB に登録されている場合、"Already Registered" が返される。 |
contentId | id [string] | ユニーク ID として用いられたパスパラメータ |
name | [string] | 名前として用いられたリクエストボディのパラメータ |
$ POST https://example.com/root_path/page_1 {"name": "Taro"}
{
"status": "OK",
"contentId": "page_1",
"name": "Taro"
}
// 同一のリクエストを再度実行
$ POST https://example.com/root_path/page_1 {"name": "Taro"}
{
"status": "Already Registered",
"contentId": "hoge",
"name": "taro"
}
ユニーク ID に紐付いたイイね一覧を取得する API
GET https://example.com/{ROOT_PATH}/${id}
key | value | description |
---|---|---|
status | "OK" | |
likes | array of like | いいねの配列。詳細は以下に記載 |
key | value | description |
---|---|---|
id | [number] | DB の主キーの値 |
contentId | [string] | ユニーク ID。(パスパラメータで渡されたもの) |
name | [string] | ユーザ名 |
$ GET https://example.com/root_path/page_1
{
"status": "OK",
"likes":[
{
"id":2,
"contentId":"page_1",
"name":"Taro"
},
{
"id":3,
"contentId":"page_1",
"name":"Jiro"
}
]
}
ユニーク ID に紐付いたイイねを削除する API
GET https://example.com/{ROOT_PATH}/${id}
key | value | description |
---|---|---|
name | [string] | 削除したいイイねのユーザ名を指定する。name をパラメータとして渡さなかった場合、id に紐づくイイねを全て削除する |
key | value | description |
---|---|---|
status | "OK" or "Not Registered" | 削除対象が存在しなかった場合、"Not Registered" を返す |
contentId | [string] | ユニーク ID。(パスパラメータで渡されたもの) |
name | [string] | 名前として用いられたリクエストボディのパラメータ |
# page_1のTaroのイイねを削除する
$ DELETE https://example.com/root_path/page_1 {"name": "Taro"}
{
"status": "OK",
"contentId": "page_1",
"name": "Taro"
}
# page_1のイイねを全て削除する
$ DELETE https://example.com/root_path/page_1
{
"status": "OK",
"contentId": "page_1",
}
使用例として、liketion を認証連携済み ALB の後段に設置することがあります。(Elaastic Container Service でも EC2 でも構いません。) ALB と cognito や AzureAD など IdP を OIDC 連携させ、認証済みユーザによる API リクエストのみを liketion にアクセスさせることが可能です。
ALB は認証済みユーザ情報を HTTP リクエストのヘッダに付加します。 ユーザ名やメールアドレス等の情報をヘッダから抽出し、postLike 時のユーザ名として用いることが可能です。
postLike 実行時にリクエストボディによる name パラメータを付加しないだけで OK です。
liketion は ALB によって付加された"x-amzn-oidc-data"ヘッダから name, email フィールドを読み取り、これを DB 登録時のユーザ名として用います。
もし name, email いずれも x-amzn-oidc-data に存在した場合、name が優先的に使われます。また、仮にいずれも存在しなかった場合、リクエストボディの name パラメータが用いられます。
リクエストボディでの name パラメータは常に HTTP リクエストに載っけることができますが、基本的に x-amzn-oidc-data の値によって上書きされます。
$ POST https://example.com/root_path/postLike/page_1 (without request body)
The payload of x-amzn-oidc-data is
{
sub: '3456789-abcdefg',
email_verified: 'false',
name: 'username'
email: 'test@mail_address.com',
exp: 1651818337,
iss: 'https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_aaaaaaaaa'
}
return is
{
"status": "OK",
"contentId": "page_1",
"name": "username"
}
$ POST https://example.com/root_path/postLike/page_1 (without request body)
The payload of x-amzn-oidc-data is
{
sub: '3456789-abcdefg',
email_verified: 'false',
email: 'test@mail_address.com',
exp: 1651818337,
iss: 'https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_aaaaaaaaa'
}
return is
{
"status": "OK",
"contentId": "page_1",
"name": "test@mail_address.com"
}
$ POST https://example.com/root_path/postLike/page_1 {"name": "Taro"}
The payload of x-amzn-oidc-data is
{
sub: '3456789-abcdefg',
email_verified: 'false',
email: 'test@mail_address.com',
exp: 1651818337,
iss: 'https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_aaaaaaaaa'
}
return is
{
"status": "OK",
"contentId": "page_1",
"name": "test@mail_address.com"
}
# 仮にリクエストボディでnameパラメータが指定されている場合でも、
# x-amzn-oidc-dataにemailフィールドが存在するため、値が上書きされている