Open6

Validate Address in Supabaseを作る

heyhey1028heyhey1028

やりたいこと

Firebase ExtensionでValidate Address in Firestoreというエクステンションがあるらしく、Supabaseでも出来そうなので再現してみることにした。

Supabase Extensionなるものがいつか出来たらこういう事なんだろうと思いながら再現してみる。

構成は非常にシンプル。以下を準備する。

  • Supabase Databaseに住所登録用のテーブル
  • GCPにあるAddress Validation APIを叩くdart edge function
  • テーブルへの書き込みで発火し、上記のedge functionを実行するPostgres Triggers
heyhey1028heyhey1028

Address Validation API

https://developers.google.com/maps/documentation/address-validation

リクエスト

  "address": {
    "regionCode": "US",
    "locality": "Mountain View",
    "addressLines": ["1600 Amphitheatre Pkwy"]
  }

レスポンス

{
  "result": {
    // Validation verdict.
    "verdict": {},
    // Address details determined by the API.
    "address": {},
    // The geocode generated for the input address.
    "geocode": {},
    // Information indicating if the address is a business, residence, etc.
    "metadata": {},
    // Information about the address from the US Postal Service
    // ("US" and "PR" addresses only).
    "uspsData": {},
  },
  // A unique identifier generated for every request to the API.
  "responseId": "ID"
}
heyhey1028heyhey1028

Dart Edge

まずSupabase cliを入れないといけない

brew install supabase/tap/supabase

その後、dart製のedge cliも入れる

# install the edge CLI
dart pub global activate edge

以下のコマンドでdart edge用のプロジェクトを作成

edge new supabase_functions [任意のプロジェクト名]

作成されたプロジェクト内に移ってsupabase initを実行

cd [任意のプロジェクト名]
supabase init

edge functionで使う(であろう)以下のパッケージをインストール

dart pub add supabase
dart pub add edge_http_client

main.dart内でSupabaseClientをインスタンス化して使う

main.dart
import 'dart:convert';

import 'package:supabase_functions/supabase_functions.dart';
import 'package:edge_http_client/edge_http_client.dart';
import 'package:supabase/supabase.dart';

void main() {
  final supabase = SupabaseClient(
    Deno.env.get('SUPABASE_URL')!,
    Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!, // Use service role key to bypass RLS
    httpClient: EdgeHttpClient(),
  );

  SupabaseFunctions(fetch: (request) async {
		// You can query `public.users` table for example.
    final List users = await supabase.from('users').select().limit(10);
    return Response.json(users);
  });
}

Reuestからパラメータを取り出す

json()メソッドでjsonを取得可能

    final req = (await request.json()) as Map<String, dynamic>?;

参考

https://zenn.dev/tsuruo/articles/3a3a298531a171
https://docs.dartedge.dev/
https://supabase.com/docs/guides/functions/dart-edge

heyhey1028heyhey1028

Edge functions

急遽tsでedge functionsを開発する事に😭