🦋

Serverpod ~ UserIdを紐付ける

2023/11/01に公開

認証した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をつかって、検索する方法はまた次回。

Flutter大学

Discussion