このエントリはPlay frameworkひとりアドベントカレンダーの24日目です。
今日は /admin/order.csv を実装します。CSVダウンロードです。
今日も今までと同じ流れでいきましょう。
- 元コードを見てcontrollerのinput/outputとviewのinput/outputを確認
- modelを作る
- viewを作る
- controllerを作る(TODOでよい)
- 表示確認
- controllerを作りこむ
元コード
get '/admin/order.csv' => sub {
my ($self, $c) = @_;
$c->res->content_type('text/csv');
my $orders = $self->dbh->select_all(
'SELECT order_request.*, stock.seat_id, stock.variation_id, stock.updated_at
FROM order_request JOIN stock ON order_request.id = stock.order_id
ORDER BY order_request.id ASC',
);
my $body = '';
for my $order (@$orders) {
$body .= join ',', @{$order}{qw( id member_id seat_id variation_id updated_at )};
$body .= "\n";
}
$c->res->body($body);
$c->res;
};
- クエリを実行して,で連結して出力
- Content-Typeはtext/csv
ってなもんですね。
PlayでレスポンスのContent-Typeを指定するには response().setContentType を使います。
ここまで毎日やってれば、他に迷うことはないでしょう。
public static Result adminOrderCSV() {
response().setContentType("text/csv");
List sqlRows = Ebean
.createSqlQuery(
"SELECT order_request.*, stock.seat_id, stock.variation_id, stock.updated_at"
+ " FROM order_request JOIN stock ON order_request.id = stock.order_id"
+ " ORDER BY order_request.id ASC").findList();
StringBuffer buffer = new StringBuffer();
for (SqlRow sqlRow : sqlRows) {
buffer.append(sqlRow.get("member_id"));
buffer.append(",");
buffer.append(sqlRow.get("seat_id"));
buffer.append(",");
buffer.append(sqlRow.get("variation_id"));
buffer.append(",");
buffer.append(sqlRow.get("updated_at"));
buffer.append("\n");
}
return ok(buffer.toString());
}
できましたか?これで全機能が完成です。
Play framework ひとりアドベントカレンダーはこれでおしまいです。
ここまで読んでいただいたかた、ありがとうございました。お疲れさまでした。
最近はあんまりviewはがんばらなくて、JSONを返すだけでOKなシーンが多いと思います。
Javaでさくさくと作れるPlayをぜひ試してみてください!
ちなみに今回のisucon2アプリのplay版はgithubにpushしてあります(playブランチ)。
→https://github.com/netmarkjp/isucon2/tree/play
みんなisucon3が開催されたら参加してみるといいよ。楽しいから!(・∀・)