import scala.
slick.
driver.
PostgresDriver.
simple.
_ import Database.
threadLocalSession import securesocial.
core.
{ Identity, UserId, AuthenticationMethod, OAuth1Info, OAuth2Info, PasswordInfo
}
/**
* Class that embodies the parameters of a User.
*/
id: UserId,
firstName: String,
lastName: String,
userRoleID: Int,
authMethod: AuthenticationMethod,
avatarUrl: Option[String],
email: Option[String],
fullName: String,
oAuth1Info: Option[OAuth1Info],
oAuth2Info: Option[OAuth2Info],
passwordInfo
: Option
[PasswordInfo
]) extends Identity
def id
= column
[String
]("id", O.
PrimaryKey) def firstName
= column
[String
]("first_name") def lastName
= column
[String
]("last_name") def userRoleID
= column
[Int
]("at_user_role_id") def authMethod
= column
[String
]("auth_method") def avatarUrl
= column
[Option
[String
]]("avatar_url") // t._6 def email
= column
[Option
[String
]]("email") // t._7 def fullName
= column
[String
]("full_name") // t._8
def oAuth1InfoToken
= column
[Option
[String
]]("oauth1info_token") // t._9 def oAuth1InfoSecret
= column
[Option
[String
]]("oauth1info_secret") // t._10
def oAuth2InfoAccessToken
= column
[Option
[String
]]("oauth2info_access_token") def oAuth2InfoTokenType
= column
[Option
[String
]]("oauth2info_token_type") def oAuth2InfoExpiresIn
= column
[Option
[Int
]]("oauth2info_expires_in") def oAuth2InfoRefreshToken
= column
[Option
[String
]]("oauth2info_refresh_token")
def passwordInfoHasher
= column
[Option
[String
]]("passwordinfo_hasher") // t._15 def passwordInfoPassword
= column
[Option
[String
]]("passwordinfo_password") // t._16 def passwordInfoSalt
= column
[Option
[String
]]("passwordinfo_salt") // t._17
def userRole
= foreignKey
("user_role_fk", userRoleID, UserRoles
)(_.
id)
def oAuth1Unapply
(smth
: Option
[OAuth1Info
]): (String, String
) = smth.map(oa => (oa.token, oa.secret)).getOrElse(("", ""))
def oAuth2Unapply
(smth
: Option
[OAuth2Info
]): (String, Option
[String
], Option
[Int
], Option
[String
]) = smth.map(oa => (oa.accessToken, oa.tokenType, oa.expiresIn, oa.refreshToken)).getOrElse(("", None, None, None))
def passInfoUnapply
(smth
: Option
[PasswordInfo
]): (String, String, Option
[String
]) = smth.map(p => (p.hasher, p.password, p.salt)).getOrElse(("", "", None))
def * = id ~ firstName ~ lastName ~ userRoleID ~ authMethod ~
avatarUrl ~ email ~ fullName ~ oAuth1InfoToken ~ oAuth1InfoSecret ~
oAuth2InfoAccessToken ~ oAuth2InfoTokenType ~ oAuth2InfoExpiresIn ~ oAuth2InfoRefreshToken ~
passwordInfoHasher ~ passwordInfoPassword ~ passwordInfoSalt <> (
{ t =>
User(
UserId(t._1, "google"),
t._2, t._3, t._4,
AuthenticationMethod(t._5), t._6, t._7, t._8,
Some(OAuth1Info((t._9).getOrElse(""), (t._10).getOrElse(""))),
Some(OAuth2Info((t._11).getOrElse(""), t._12, t._13, t._14)),
Some(PasswordInfo((t._15).getOrElse(""), (t._16).getOrElse(""), t._17)))
}, {
(r: User) =>
val oa1
= oAuth1Unapply
(r.
oAuth1Info) val oa2
= oAuth2Unapply
(r.
oAuth2Info) val pin
= passInfoUnapply
(r.
passwordInfo) Some(
(r.id.id, r.firstName, r.lastName, r.userRoleID,
r.authMethod.method, r.avatarUrl, r.email, r.fullName,
Some(oa1._1), Some(oa1._2),
Some(oa2._1), oa2._2, oa2._3, oa2._4,
Some(pin._1), Some(pin._2), pin._3))
})
}
/**
* User table for accessing the database.
*/
case class UserRole
(id
: Option
[Int
], role
: String
) // XXX: Maybe this only needs to have only one field... have ROLE be the primary key?
def id
= column
[Int
]("id", O.
PrimaryKey, O.
AutoInc) def role
= column
[String
]("role") // ...
def * = id.
? ~ role
<> (UserRole, UserRole.
unapply _) //def forInsert = role <> ({t => UserRole(None, t._1)}, {(r: UserRole) => Some((r.role))}) returning id
}
CnBhY2thZ2UgbW9kZWxzCmltcG9ydCBzY2FsYS5zbGljay5kcml2ZXIuUG9zdGdyZXNEcml2ZXIuc2ltcGxlLl8KaW1wb3J0IERhdGFiYXNlLnRocmVhZExvY2FsU2Vzc2lvbgppbXBvcnQgc2VjdXJlc29jaWFsLmNvcmUueyBJZGVudGl0eSwgVXNlcklkLCBBdXRoZW50aWNhdGlvbk1ldGhvZCwgT0F1dGgxSW5mbywgT0F1dGgySW5mbywgUGFzc3dvcmRJbmZvIH0KCi8qKgogICogQ2xhc3MgdGhhdCBlbWJvZGllcyB0aGUgcGFyYW1ldGVycyBvZiBhIFVzZXIuCiAgKi8KY2FzZSBjbGFzcyBVc2VyKAogIGlkOiBVc2VySWQsCiAgZmlyc3ROYW1lOiBTdHJpbmcsCiAgbGFzdE5hbWU6IFN0cmluZywKICB1c2VyUm9sZUlEOiBJbnQsCiAgYXV0aE1ldGhvZDogQXV0aGVudGljYXRpb25NZXRob2QsCiAgYXZhdGFyVXJsOiBPcHRpb25bU3RyaW5nXSwKICBlbWFpbDogT3B0aW9uW1N0cmluZ10sCiAgZnVsbE5hbWU6IFN0cmluZywKICBvQXV0aDFJbmZvOiBPcHRpb25bT0F1dGgxSW5mb10sCiAgb0F1dGgySW5mbzogT3B0aW9uW09BdXRoMkluZm9dLAogIHBhc3N3b3JkSW5mbzogT3B0aW9uW1Bhc3N3b3JkSW5mb10pIGV4dGVuZHMgSWRlbnRpdHkKCm9iamVjdCBVc2VycyBleHRlbmRzIFRhYmxlW1VzZXJdKCJhdF91c2VyIikgewogIGRlZiBpZCA9IGNvbHVtbltTdHJpbmddKCJpZCIsIE8uUHJpbWFyeUtleSkKICBkZWYgZmlyc3ROYW1lID0gY29sdW1uW1N0cmluZ10oImZpcnN0X25hbWUiKQogIGRlZiBsYXN0TmFtZSA9IGNvbHVtbltTdHJpbmddKCJsYXN0X25hbWUiKQogIGRlZiB1c2VyUm9sZUlEID0gY29sdW1uW0ludF0oImF0X3VzZXJfcm9sZV9pZCIpCiAgZGVmIGF1dGhNZXRob2QgPSBjb2x1bW5bU3RyaW5nXSgiYXV0aF9tZXRob2QiKQogIGRlZiBhdmF0YXJVcmwgPSBjb2x1bW5bT3B0aW9uW1N0cmluZ11dKCJhdmF0YXJfdXJsIikgLy8gdC5fNgogIGRlZiBlbWFpbCA9IGNvbHVtbltPcHRpb25bU3RyaW5nXV0oImVtYWlsIikgLy8gdC5fNwogIGRlZiBmdWxsTmFtZSA9IGNvbHVtbltTdHJpbmddKCJmdWxsX25hbWUiKSAvLyB0Ll84CgogIGRlZiBvQXV0aDFJbmZvVG9rZW4gPSBjb2x1bW5bT3B0aW9uW1N0cmluZ11dKCJvYXV0aDFpbmZvX3Rva2VuIikgLy8gdC5fOQogIGRlZiBvQXV0aDFJbmZvU2VjcmV0ID0gY29sdW1uW09wdGlvbltTdHJpbmddXSgib2F1dGgxaW5mb19zZWNyZXQiKSAvLyB0Ll8xMAoKICBkZWYgb0F1dGgySW5mb0FjY2Vzc1Rva2VuID0gY29sdW1uW09wdGlvbltTdHJpbmddXSgib2F1dGgyaW5mb19hY2Nlc3NfdG9rZW4iKQogIGRlZiBvQXV0aDJJbmZvVG9rZW5UeXBlID0gY29sdW1uW09wdGlvbltTdHJpbmddXSgib2F1dGgyaW5mb190b2tlbl90eXBlIikKICBkZWYgb0F1dGgySW5mb0V4cGlyZXNJbiA9IGNvbHVtbltPcHRpb25bSW50XV0oIm9hdXRoMmluZm9fZXhwaXJlc19pbiIpCiAgZGVmIG9BdXRoMkluZm9SZWZyZXNoVG9rZW4gPSBjb2x1bW5bT3B0aW9uW1N0cmluZ11dKCJvYXV0aDJpbmZvX3JlZnJlc2hfdG9rZW4iKQoKICBkZWYgcGFzc3dvcmRJbmZvSGFzaGVyID0gY29sdW1uW09wdGlvbltTdHJpbmddXSgicGFzc3dvcmRpbmZvX2hhc2hlciIpIC8vIHQuXzE1CiAgZGVmIHBhc3N3b3JkSW5mb1Bhc3N3b3JkID0gY29sdW1uW09wdGlvbltTdHJpbmddXSgicGFzc3dvcmRpbmZvX3Bhc3N3b3JkIikgLy8gdC5fMTYKICBkZWYgcGFzc3dvcmRJbmZvU2FsdCA9IGNvbHVtbltPcHRpb25bU3RyaW5nXV0oInBhc3N3b3JkaW5mb19zYWx0IikgLy8gdC5fMTcKCiAgZGVmIHVzZXJSb2xlID0gZm9yZWlnbktleSgidXNlcl9yb2xlX2ZrIiwgdXNlclJvbGVJRCwgVXNlclJvbGVzKShfLmlkKQoKICBkZWYgb0F1dGgxVW5hcHBseShzbXRoOiBPcHRpb25bT0F1dGgxSW5mb10pOiAoU3RyaW5nLCBTdHJpbmcpID0KICAgIHNtdGgubWFwKG9hID0+IChvYS50b2tlbiwgb2Euc2VjcmV0KSkuZ2V0T3JFbHNlKCgiIiwgIiIpKQoKICBkZWYgb0F1dGgyVW5hcHBseShzbXRoOiBPcHRpb25bT0F1dGgySW5mb10pOiAoU3RyaW5nLCBPcHRpb25bU3RyaW5nXSwgT3B0aW9uW0ludF0sIE9wdGlvbltTdHJpbmddKSA9CiAgICBzbXRoLm1hcChvYSA9PiAob2EuYWNjZXNzVG9rZW4sIG9hLnRva2VuVHlwZSwgb2EuZXhwaXJlc0luLCBvYS5yZWZyZXNoVG9rZW4pKS5nZXRPckVsc2UoKCIiLCBOb25lLCBOb25lLCBOb25lKSkKCiAgZGVmIHBhc3NJbmZvVW5hcHBseShzbXRoOiBPcHRpb25bUGFzc3dvcmRJbmZvXSk6IChTdHJpbmcsIFN0cmluZywgT3B0aW9uW1N0cmluZ10pID0KICAgIHNtdGgubWFwKHAgPT4gKHAuaGFzaGVyLCBwLnBhc3N3b3JkLCBwLnNhbHQpKS5nZXRPckVsc2UoKCIiLCAiIiwgTm9uZSkpCgogIGRlZiAqID0gaWQgfiBmaXJzdE5hbWUgfiBsYXN0TmFtZSB+IHVzZXJSb2xlSUQgfiBhdXRoTWV0aG9kIH4KICAgIGF2YXRhclVybCB+IGVtYWlsIH4gZnVsbE5hbWUgfiBvQXV0aDFJbmZvVG9rZW4gfiBvQXV0aDFJbmZvU2VjcmV0IH4KICAgIG9BdXRoMkluZm9BY2Nlc3NUb2tlbiB+IG9BdXRoMkluZm9Ub2tlblR5cGUgfiBvQXV0aDJJbmZvRXhwaXJlc0luIH4gb0F1dGgySW5mb1JlZnJlc2hUb2tlbiB+CiAgICBwYXNzd29yZEluZm9IYXNoZXIgfiBwYXNzd29yZEluZm9QYXNzd29yZCB+IHBhc3N3b3JkSW5mb1NhbHQgPD4gKAogICAgICB7IHQgPT4KICAgICAgICBVc2VyKAogICAgICAgICAgVXNlcklkKHQuXzEsICJnb29nbGUiKSwKICAgICAgICAgIHQuXzIsIHQuXzMsIHQuXzQsCiAgICAgICAgICBBdXRoZW50aWNhdGlvbk1ldGhvZCh0Ll81KSwgdC5fNiwgdC5fNywgdC5fOCwKICAgICAgICAgIFNvbWUoT0F1dGgxSW5mbygodC5fOSkuZ2V0T3JFbHNlKCIiKSwgKHQuXzEwKS5nZXRPckVsc2UoIiIpKSksCiAgICAgICAgICBTb21lKE9BdXRoMkluZm8oKHQuXzExKS5nZXRPckVsc2UoIiIpLCB0Ll8xMiwgdC5fMTMsIHQuXzE0KSksCiAgICAgICAgICBTb21lKFBhc3N3b3JkSW5mbygodC5fMTUpLmdldE9yRWxzZSgiIiksICh0Ll8xNikuZ2V0T3JFbHNlKCIiKSwgdC5fMTcpKSkKICAgICAgfSwgewogICAgICAgIChyOiBVc2VyKSA9PgogICAgICAgICAgdmFsIG9hMSA9IG9BdXRoMVVuYXBwbHkoci5vQXV0aDFJbmZvKQogICAgICAgICAgdmFsIG9hMiA9IG9BdXRoMlVuYXBwbHkoci5vQXV0aDJJbmZvKQogICAgICAgICAgdmFsIHBpbiA9IHBhc3NJbmZvVW5hcHBseShyLnBhc3N3b3JkSW5mbykKICAgICAgICAgIFNvbWUoCiAgICAgICAgICAgIChyLmlkLmlkLCByLmZpcnN0TmFtZSwgci5sYXN0TmFtZSwgci51c2VyUm9sZUlELAogICAgICAgICAgICAgIHIuYXV0aE1ldGhvZC5tZXRob2QsIHIuYXZhdGFyVXJsLCByLmVtYWlsLCByLmZ1bGxOYW1lLAogICAgICAgICAgICAgIFNvbWUob2ExLl8xKSwgU29tZShvYTEuXzIpLAogICAgICAgICAgICAgIFNvbWUob2EyLl8xKSwgb2EyLl8yLCBvYTIuXzMsIG9hMi5fNCwKICAgICAgICAgICAgICBTb21lKHBpbi5fMSksIFNvbWUocGluLl8yKSwgcGluLl8zKSkKICAgICAgfSkKfQoKLyoqCiAgKiBVc2VyIHRhYmxlIGZvciBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlLgogICovCmNhc2UgY2xhc3MgVXNlclJvbGUoaWQ6IE9wdGlvbltJbnRdLCByb2xlOiBTdHJpbmcpCi8vIFhYWDogTWF5YmUgdGhpcyBvbmx5IG5lZWRzIHRvIGhhdmUgb25seSBvbmUgZmllbGQuLi4gaGF2ZSBST0xFIGJlIHRoZSBwcmltYXJ5IGtleT8Kb2JqZWN0IFVzZXJSb2xlcyBleHRlbmRzIFRhYmxlW1VzZXJSb2xlXSgiYXRfdXNlcl9yb2xlIikgewogIGRlZiBpZCA9IGNvbHVtbltJbnRdKCJpZCIsIE8uUHJpbWFyeUtleSwgTy5BdXRvSW5jKQogIGRlZiByb2xlID0gY29sdW1uW1N0cmluZ10oInJvbGUiKQogIC8vIC4uLgogIGRlZiAqID0gaWQuPyB+IHJvbGUgPD4gKFVzZXJSb2xlLCBVc2VyUm9sZS51bmFwcGx5IF8pCiAgLy9kZWYgZm9ySW5zZXJ0ID0gcm9sZSA8PiAoe3QgPT4gVXNlclJvbGUoTm9uZSwgdC5fMSl9LCB7KHI6IFVzZXJSb2xlKSA9PiBTb21lKChyLnJvbGUpKX0pIHJldHVybmluZyBpZAp9Cg==