🦋
Serverpod ~ UserIdを紐付ける
認証したuserはどこにいる?
前回、E-mail認証したuserを使って、まずは次のことをやりたい。
- 年表に新しく「この」事象を登録したuserはだれか記録する。
- 「この」userがこれまでに登録した事象はどれかを検索する。
- 各userがこれまで登録した事象の件数を取得する →→ 登録数に応じてポイントを付与する。
ということで、まず、userIDはどこにあるのか。
これは、postgreSQLに自動生成されてたserverpod_user_infoというtableにある。
他にも、今の私には使途のわからないtableがたくさん自動生成されている。
まずはbackendで中間tableと関数を作る。
protocol(table設定)
class: PrincipalUser
table: principal_user
fields:
principal_id: int
user_id: int
serverpod generateすると次のようなSQLが自動生成されるので、
それをpostico2のSQLに貼り付けてやると、tableができる。
--
-- Class PrincipalUser as table principal_user
--
CREATE TABLE "principal_user" (
"id" serial,
"principal_id" integer NOT NULL,
"user_id" integer NOT NULL
);
ALTER TABLE ONLY "principal_user"
ADD CONSTRAINT principal_user_pkey PRIMARY KEY (id);
endpoint
import 'package:serverpod/serverpod.dart';
import 'package:acorn_server/src/generated/protocol.dart';
class PrincipalUserEndpoint extends Endpoint {
//Fetch principal-user from DB
Future<List<PrincipalUser>> getUser(Session session,
int userId) async {
return await PrincipalUser.find(
session,
//where: (t) => keyword !=null ? t.pUser.like('%$keyword%') : Constant(true),
orderBy: PrincipalUser.t.user_id,
);
}
//Add PUser in DB
Future<int> addPrincipalUser(Session session, PrincipalUser pUser) async {
await PrincipalUser.insert(session, pUser);
return pUser.id!;
}
}
これで準備は万端。
serverpod generateして、次はfrontの操作。
フロント側でUserIDをどう取得するか。
前回、tutorialで作った「入り口での判定」で以下のような記述があった。
builder: (context) => sessionManager.isSignedIn
? const AccountPage()
: const SignInPage(),
ここから推測するに、たぶんsessionManagerというのを使うんだろう。
実際にsessionManagerの中身を確認する、などというレベルではないので、
適当に当たりをつけてコードを書き始め、
補完が出してくるargumentを、これかな、こっちかな・・・
ほぼほぼジグソーパズルの要領ですね。
頼みの爺様にはServerpodが新しすぎるので、いきなり聞いても変な答えが出るんですが、
ある程度書いて、エラーメッセージと一緒に修正案を聞けば、けっこういい答えが出る。
以下のcodeは、年表に新しい事象を登録する一連の関数の最後にくっついている。
すでに新しい事象のidが取れているので、
それとuserIdを紐付けて中間tableに入れる関数、ということになる。
var userId = sessionManager.signedInUser?.id ?? 0; //これで作業しているuserのIDが取れる。
print('written by user: $userId');
var principalUser = PrincipalUser(principal_id: principalId, user_id: userId); //中間tableへのargument
var principalUserId = await client.principalUser.addPrincipalUser(principalUser); //中間tableに保存
debugPrint('Added principal User : $principalUserId');
userIDをつかって、検索する方法はまた次回。
Discussion