2024-MacC-M14-Medio / SQSupabase / supabase / functions / PlaylistIDs / index.ts
index.ts
Raw
// Follow this setup guide to integrate the Deno language server with your editor:
// https://deno.land/manual/getting_started/setup_your_environment
// This enables autocomplete, go to definition, etc.

// Setup type definitions for built-in Supabase Runtime APIs
import "jsr:@supabase/functions-js/edge-runtime.d.ts"
import { createClient } from 'jsr:@supabase/supabase-js@2'
import { ErrorResponse, SuccessResponse } from 'Responses'
import { FilterType, PeriodType, InsertValueModel_v1 } from "QueryTypes"
import { RecentQuery } from "RecentQuery"
import { MostQuery } from "./QueryMethods/MostQuery.ts"
const defaultClient = (authorization: string) => createClient( 
  Deno.env.get('SUPABASE_URL') ?? '',
   Deno.env.get('SUPABASE_ANON_KEY') ?? '',
  { global: { headers: { Authorization: authorization! } } }
)

Deno.serve(async (req: Request) => {
  // if(req.method !== "GET") return ErrorResponse("Method error", 405);
  if(Deno.env.get('SUPABASE_ANON_KEY') !== req.headers.get('Authorization')) return ErrorResponse("Authorization error", 401);
  const ActionByRequestMethods: { [key: string]: () => Promise<Response> } = {
    "GET": async ()=>{
      try {
        const supabase = defaultClient(req.headers.get('Authorization')!);
        const params: URLSearchParams = new URLSearchParams(new URL(req.url).search);
        const filterType : FilterType = params.get("filter") as FilterType ?? "";
        const limitCount: number = Number(params.get("limitcount")) ?? 0;
          switch(filterType){
            case FilterType.RECENT: {
              const { data, error } = await RecentQuery.PlaylistHeadAccessDateVersion(supabase, limitCount);
              return error ? ErrorResponse(error.message, 500) : SuccessResponse(data?.map((x: { id: string }) => x.id) ?? []);
            }
            case FilterType.MOST: {
              const periodType: PeriodType = params.get("period") as PeriodType ?? "";
              const date:Date = new Date(params.get("date") as string);
              const {data, error} = await MostQuery.v1(supabase, periodType, date, limitCount);
              return error ? ErrorResponse(error.message, 500) : SuccessResponse(data);
            }
            default: return ErrorResponse("FilterTypeError", 401);
          }
      } catch (err) {
        return new Response(String(err?.message ?? err), { status: 500 })
      }
    },
    "POST": async ()=>{
      try {
        const supabase = defaultClient(req.headers.get('Authorization')!);
        const json: InsertValueModel_v1 = await req.json();
        
        const res = await supabase.rpc('insert_sqooped_log', { 
            playlist_id: json.id,
            now_date: json.date,
            country_code: json.locale
          });
        return res.error ?
          ErrorResponse(res.error.message, 500) :
          SuccessResponse(json);
      }catch(err){
        return new Response(String(err?.message ?? err), { status: 500 })
      }
    }
  };
  return ActionByRequestMethods[req.method] ? 
    await ActionByRequestMethods[req.method]() : 
    ErrorResponse("Method error", 405);
})

/* To invoke locally:

  1. Run `supabase start` (see: https://supabase.com/docs/reference/cli/supabase-start)
  2. Make an HTTP request:

  curl -i --location --request POST 'http://127.0.0.1:54321/functions/v1/PlaylistIDs' \
    --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0' \
    --header 'Content-Type: application/json' \
    --data '{"name":"Functions"}'

*/