えいのうにっき

a-knowの日記です

GAE本の 3.3 章を Go で写経したので、そこでの学びをメモするよ

昨日に引き続き。今日は3.3章、 Users Service。Googleアカウントを利用した認証の仕組みが、GAE ならお手軽に使えるよー、という章。

今回も前回と同じく、写経をすることによって得られた気付き、学びをメモするよ。

3.3章の概要

スクショは↓。

f:id:a-know:20141014180032p:plain

f:id:a-know:20141014180043p:plain

学んだことメモ

Datastore に突っ込める type として User は列挙されていないけど

The datastore package  |  App Engine standard environment for Go  |  Google Cloud を見る限りは列挙されてないんだけど、The user package  |  App Engine standard environment for Go  |  Google Cloud を見てみると、こいつは単純な struct なので、structs whose fields are all valid value types ってことで、下記のように普通に突っ込める。

type Minutes struct {
    Key         *datastore.Key
    Title        string
    Author    user.User
    CreatedAt time.Time
}
func SaveAs(c appengine.Context, title string, u *user.User) (*datastore.Key, error) {
    key := datastore.NewKey(c, "minutes", uuid.New(), 0, nil)

    m1 := Minutes{
        Key:       key,
        Title:     title,
        Author:    *u,
        CreatedAt: time.Now(),
    }

取得はこう。

import "appengine/user"

u := user.Current(c)

ちなみに、このようなネストした strcut を Datastore に突っ込むと、そのプロパティは平坦化される(さきほどのスクショの2枚目みたいに)。これについては GAE/Go Datastore特有の機能~構造化プロパティ~ - The Round が詳しいので参照されたし。

DTO(Data Transfer Object)

お手本では slim3 の model として作成しているけど、こっちは dto というディレクトリを掘ってそこに定義してやってみることにした。 とりあえずこの章に関して言えば支障はなさげ。

ログイン状態&admin権限を必要とするパスの指定方法

お手本・Javaだと web.xml の security-constraint 要素に指定するやつは、 gae/g だとどうなるのか、だけど、 app.yaml Reference  |  App Engine standard environment for Go  |  Google Cloud の通りにやれば大丈夫っぽい。app.yaml に書くので、 gae/py も同じ書き方なのかも。

今回はこんな感じ。

関係ないけど、今回のこの写経は東京へ戻るための新幹線の待ち時間にしてたんだけど、岡山駅WiMAX 2+ がバリバリ掴めたのには驚いた! まじで「大都会」に近づきつつあるのかも!