OAuth Clientモジュールに付属しているサンプル

Play! frameworkOAuth Clientモジュールに付属しているサンプルを動かしてみたのですが、いくつか問題点がありました。

問題点

Userテーブルにレコードが保存されない

ApplicationコントローラのgetUserアクションで、UserモデルのfindOrCreateメソッドが呼ばれていますが、実際このメソッド内でユーザが見つからなかった時はUsersモデルのインスタンスを作成しているだけで、データベースにレコードは作成されません。

UsersテーブルとCredentialsテーブルに関連付けが無い

一対一あるいは一対多の関連づけに関するアノテーションがUsersおよびCredentialsモデルにありません。したがって、例えばユーザ名(username)からCredentialsを取ってくることができません。

解決方法

方法は複数ありますが、私はモジュールを修正しないで済むやり方を選択しました。

  1. UsersモデルにCredentialsモデルのフィールドを追加。
  2. Credentialsモデルの各メソッドをUserモデルにコピーし、ICredentialsインターフェースを実装。

ただし、conf/application.confでjpa.ddlがnone以外の場合、データベースにCredentialsテーブルが作成されますので、その場合は後からこのテーブルを削除しました。

package models;

import play.db.jpa.*;
import javax.persistence.*;
import play.modules.oauthclient.ICredentials;

@Entity
public class Users extends Model implements ICredentials {

    public String username;    
    private String token;
    private String secret;

    public Users(String username) {
        this.username = username;
        save();
    }

    public static Users findOrCreate(String username) {
        Users user = Users.find("username", username).first();

        if (user == null) {
            user = new Users(username);
        }
        
        return user;
    }

    public void setToken(String token) {
        this.token = token;
        save();
    }

    public String getToken() {
        return token;
    }

    public void setSecret(String secret) {
        this.secret = secret;
        save();
    }

    public String getSecret() {
        return secret;
    }

}