Play frameworkでisucon2アプリを書く-9

このエントリはPlay frameworkひとりアドベントカレンダーの24日目です。

今日は /admin/order.csv を実装します。CSVダウンロードです。

今日も今までと同じ流れでいきましょう。

  1. 元コードを見てcontrollerのinput/outputとviewのinput/outputを確認
  2. modelを作る
  3. viewを作る
  4. controllerを作る(TODOでよい)
  5. 表示確認
  6. 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が開催されたら参加してみるといいよ。楽しいから!(・∀・)


See also