OSS で公開されているクラウドファンディング専用の Rails アプリケーション "Catarse" をローカルで動かしてみた.
まだ詳細な機能までは確認できてなくてデバッグ中だけど,基本機能は揃っていて普通によくできてるなという印象を受けた.技術スタックも面白く,多種多様に採用されていたので,観測できた範囲での技術スタックの紹介と,実際にローカルで動かすまでの手順をまとめておこうと思う.
What is Catarse ?
Catarse はブラジル大手のクラウドファンディングサービスで,まだプロジェクト数は多くなさそうだけど,ブラジル国内でも活発に支援が集まっている雰囲気だった.その Catarse のプラットフォームが全て OSS になっていて,日々開発が続けられている.ちなみに Catarse はポルトガル語で「カタルシス」の意味だった.
ブラジル大手のクラウドファンディングサービスだと Kickante もある.
コード規模
rake stats
を出力してみた.中規模レベルのコード規模だなと思うけど,JS のコードが比較的多いことと,テストコードの量が多いことが特徴だと言える.
$ bundle exec rake stats +----------------------+-------+-------+---------+---------+-----+-------+ | Name | Lines | LOC | Classes | Methods | M/C | LOC/M | +----------------------+-------+-------+---------+---------+-----+-------+ | Controllers | 1255 | 1022 | 27 | 142 | 5 | 5 | | Models | 2232 | 1739 | 51 | 200 | 3 | 6 | | Javascripts | 3409 | 2711 | 0 | 360 | 0 | 5 | | Libraries | 127 | 105 | 8 | 23 | 2 | 2 | | Benmark specs | 56 | 0 | 0 | 0 | 0 | 0 | | Config specs | 36 | 28 | 0 | 0 | 0 | 0 | | Controller specs | 1736 | 1400 | 0 | 0 | 0 | 0 | | Decorator specs | 469 | 392 | 0 | 0 | 0 | 0 | | Lib specs | 56 | 43 | 0 | 0 | 0 | 0 | | Model specs | 3424 | 2788 | 0 | 2 | 0 | 1392 | | Observer specs | 526 | 435 | 0 | 0 | 0 | 0 | | Policy specs | 562 | 437 | 0 | 0 | 0 | 0 | | State_machine specs | 1104 | 859 | 0 | 2 | 0 | 427 | | Uploader specs | 120 | 96 | 0 | 0 | 0 | 0 | | Worker specs | 131 | 108 | 0 | 0 | 0 | 0 | +----------------------+-------+-------+---------+---------+-----+-------+ | Total | 15243 | 12163 | 86 | 729 | 8 | 14 | +----------------------+-------+-------+---------+---------+-----+-------+ Code LOC: 5577 Test LOC: 6586 Code to Test Ratio: 1:1.2
機能
クラウドファンディングサービスとしての基本機能は揃っていて,各サービス似たような感じなんだなと思った.
まだまだ大枠しか確認できてなく,詳細な機能はあると思うけど,新しくクラウドファンディングサービスを立ち上げるのであれば,十分でしょう!
ただ英語に対応してなくて,全てポルトガル語での実装なので,その点は相当厳しかった.ただ Google 翻訳が想像以上に的確だったのと,個人的にクラウドファンディングサービスのことをよく知ってるため,ほぼ理解することができた.
- 認証(メール認証 or Facebook 認証)
- プロジェクト検索
- 決済(インターフェース実装になっていて各国の仕様も追加で実装できるようになっていた)
- プロジェクトニュース
- 応援メッセージ
- ノーティフィケーション
- メール送信(開発環境だと letter_opener を使ってる)
- プロジェクト申込
- プロジェクト入稿
- プロジェクト分析機能(まだ詳しく見れてないけど)
- 管理画面(承認フローなどもあった)
技術スタック
観測できたものを箇条書きにしておく.キレイに分類してないし,間違ってるかもしれないけど,ご了承を!適宜追記していくと思う.
アプリケーション
- Rails 4.1
- Ruby 2.2.3
- PostgreSQL 9.4
- postgREST 0.3
- Sidekiq
- JWT
フロント
- Bower
- Mithril
- Backbone.js
- Underscore.js
- Sass
外部サービス
- New Relic
- Mixpanel
- Circle CI
- Travis CI
テスト関連
- RSpec
- Capybara
- Jasmine
技術スタック感想
個人的に気になったものをピックアップしてみる.
まず PostgREST で,名前の通り PostgreSQL をラップした REST API のライブラリなんだけど,全く知らなかったし,日本で紹介されている記事もあまり見つからなかった.GitHub のスターを見ると 6600 を超えてるし,海外だとやはり PostgreSQL が人気なのかなー?
次に JWT で,まだ詳しく見れてないけど,認証を JWT で実装しているようだった.実際に JWT を使ってる例をあまり見たことがなくて,参考になりそう.
フロントだと Mithril を使ってる点が珍しいかなと思った.最初 view を追ってたら全然コードの関係性が読めなくて困ったけど,よくよく追ったら Mithril でレンダリングされていた.フロント無知すぎて React や Angular と比較してどう違うのかはわからないけど.
他にも採用されてる Gem の中に知らなかったものも多かったから,勉強しよう.
環境構築手順
基本的には README に載ってる手順通りで問題ないけど,postgREST の起動でエラーになった.PostgreSQL の postgrest
ユーザに LOGIN ロールを付与するとうまく起動できる.
catarse_development=# ALTER ROLE postgrest WITH LOGIN;
ALTER ROLE
起動した後にプロジェクト入稿をするときに states
テーブルと cites
テーブルにデータを登録する必要があった.恐らく地域的なデータだからだと思うけど rake db:seed
では自動的に入らなかった.よって Rails Console から適当にデータを突っ込んだ(実際に使うならもっと別のデータが必要だと思う).
irb(main):002:0> State.create(name: 'Tokyo', acronym: 'Tokyo') irb(main):005:0> City.create(name: 'Shibuya-ku', state_id: 1)
プロジェクトを作った
クラウドファンディングの雰囲気ある!w
Contribute
Catarse にプルリクを送って Contribute することはできるし,Issue も Catarse Dev に公開されているけど,一般的な OSS と比べると敷居が高いように感じた.まず,OSS とは言え,実際に稼働しているサービスのコア部分であるため,Catarse の仕様に限定されてしまう.コードに関しても master に直接 push されるケースがあったり,プルリクも特にレビューはされてなく,サクッとマージされていたりする.
よって,一番簡単な Contribute はロケール対応かなと思っている.現在は完全にポルトガル語にフォーカスされていて,i18n の en ロケールすらほぼ未対応という状況だから,英語サポートは必要だと思う.README にも書いてあるし.とは言え,Issue を出して Catarse のメンバーと進め方は合意しておく必要があるかも?
We hope to support a lot of languages in the future, so we are willing to accept pull requests with translations to other languages.
まとめ
クラウドファンディングサービスを最速で立ち上げるなら Catarse をベースにする判断もあり得るなと感じた.実際に先日の 表参道.rb #10 で紹介されてた「スペースファンド」もその例だったし.
また個人的にはクラウドファンディングサービスのスキーマを見れることも参考なるし,ゆっくりと吟味していこうと思う.Catarse を使った家族用のファミリーファンディングをネタ的に実装してみようと思ってるので,その過程で改善できそうな点があれば積極的に Contribute していくぞ!