From b5ec9b03975305e968a0b4a32b27b0d72e2d4643 Mon Sep 17 00:00:00 2001 From: jiyuujin Date: Sat, 11 May 2024 13:01:42 +0900 Subject: [PATCH] feat: supabase initialize --- apps/peatix-adapter/.env.example | 2 + apps/peatix-adapter/package.json | 1 + .../after-purchase/after-purchase.module.ts | 4 ++ .../after-purchase/after-purchase.service.ts | 5 +- apps/peatix-adapter/src/env/env.service.ts | 8 +++ .../src/env/utils/configuration.ts | 2 + .../src/peatix-order/peatix-order.module.ts | 4 ++ .../src/peatix-order/peatix-order.service.ts | 23 ++++----- .../src/supabase/supabase.module.ts | 24 +++++++++ .../src/supabase/supabase.service.ts | 35 +++++++++++++ bun.lockb | Bin 891824 -> 893920 bytes yarn.lock | 46 +++++++++++++++++- 12 files changed, 137 insertions(+), 17 deletions(-) create mode 100644 apps/peatix-adapter/src/supabase/supabase.module.ts create mode 100644 apps/peatix-adapter/src/supabase/supabase.service.ts diff --git a/apps/peatix-adapter/.env.example b/apps/peatix-adapter/.env.example index 032166a6..fe986aa9 100644 --- a/apps/peatix-adapter/.env.example +++ b/apps/peatix-adapter/.env.example @@ -4,3 +4,5 @@ PUPPETEER_EXECUTABLE_PATH= PEATIX_EVENT_ID= PEATIX_BASIC_EMAIL= PEATIX_BASIC_PASSWORD= +SUPABASE_URL= +SUPABASE_KEY= diff --git a/apps/peatix-adapter/package.json b/apps/peatix-adapter/package.json index 8721fd6e..49563e56 100644 --- a/apps/peatix-adapter/package.json +++ b/apps/peatix-adapter/package.json @@ -24,6 +24,7 @@ "@nestjs/common": "10.3.7", "@nestjs/core": "10.3.7", "@nestjs/platform-express": "10.3.7", + "@supabase/supabase-js": "2.43.1", "puppeteer": "19.9.1", "reflect-metadata": "0.2.2", "rxjs": "7.8.1" diff --git a/apps/peatix-adapter/src/after-purchase/after-purchase.module.ts b/apps/peatix-adapter/src/after-purchase/after-purchase.module.ts index 7675bf3a..52f2ceea 100644 --- a/apps/peatix-adapter/src/after-purchase/after-purchase.module.ts +++ b/apps/peatix-adapter/src/after-purchase/after-purchase.module.ts @@ -12,6 +12,8 @@ import { EnvModule } from '../env/env.module' import { PeatixOrderService } from '../peatix-order/peatix-order.service' import { HttpModule } from '@nestjs/axios' import { PeatixOrderModule } from 'src/peatix-order/peatix-order.module' +import { SupabaseModule } from 'src/supabase/supabase.module' +import { SupabaseService } from 'src/supabase/supabase.service' @Module({ imports: [ @@ -22,6 +24,7 @@ import { PeatixOrderModule } from 'src/peatix-order/peatix-order.module' }), EnvModule, HttpModule, + SupabaseModule, PeatixOrderModule, ], providers: [ @@ -33,6 +36,7 @@ import { PeatixOrderModule } from 'src/peatix-order/peatix-order.module' }, AfterPurchaseCommand, AfterPurchaseService, + SupabaseService, PeatixOrderService, ], }) diff --git a/apps/peatix-adapter/src/after-purchase/after-purchase.service.ts b/apps/peatix-adapter/src/after-purchase/after-purchase.service.ts index 972ca313..f4a317be 100644 --- a/apps/peatix-adapter/src/after-purchase/after-purchase.service.ts +++ b/apps/peatix-adapter/src/after-purchase/after-purchase.service.ts @@ -5,12 +5,11 @@ import { PeatixOrderService } from '../peatix-order/peatix-order.service' export class AfterPurchaseService { private readonly logger = new Logger(AfterPurchaseService.name) - constructor(private readonly peatixOrderService: PeatixOrderService,) { + constructor(private readonly peatixOrderService: PeatixOrderService) { // } async apply() { - const orders = this.peatixOrderService.getOrders() - this.logger.log(orders) + this.peatixOrderService.getOrders() } } diff --git a/apps/peatix-adapter/src/env/env.service.ts b/apps/peatix-adapter/src/env/env.service.ts index 827ef3e4..d331eebe 100644 --- a/apps/peatix-adapter/src/env/env.service.ts +++ b/apps/peatix-adapter/src/env/env.service.ts @@ -23,4 +23,12 @@ export class EnvService { get PEATIX_BASIC_PASSWORD() { return this.configService.getOrThrow('peatixBasicPassword') } + + get SUPABASE_URL() { + return this.configService.getOrThrow('supabaseUrl') + } + + get SUPABASE_KEY() { + return this.configService.getOrThrow('supabaseKey') + } } diff --git a/apps/peatix-adapter/src/env/utils/configuration.ts b/apps/peatix-adapter/src/env/utils/configuration.ts index bc629a2f..b6bfa072 100644 --- a/apps/peatix-adapter/src/env/utils/configuration.ts +++ b/apps/peatix-adapter/src/env/utils/configuration.ts @@ -2,4 +2,6 @@ export const configuration = () => ({ peatixEventId: process.env.PEATIX_EVENT_ID || '', peatixBasicEmail: process.env.PEATIX_BASIC_EMAIL || '', peatixBasicPassword: process.env.PEATIX_BASIC_PASSWORD || '', + supabaseUrl: process.env.SUPABASE_URL || '', + supabaseKey: process.env.SUPABASE_KEY || '', }) diff --git a/apps/peatix-adapter/src/peatix-order/peatix-order.module.ts b/apps/peatix-adapter/src/peatix-order/peatix-order.module.ts index edb39593..72c92d15 100644 --- a/apps/peatix-adapter/src/peatix-order/peatix-order.module.ts +++ b/apps/peatix-adapter/src/peatix-order/peatix-order.module.ts @@ -6,6 +6,8 @@ import { EnvModule } from 'src/env/env.module' import { HttpModule } from '@nestjs/axios' import { EnvService } from 'src/env/env.service' import { IPuppeteerService, PuppeteerService } from 'src/puppeteer/puppeteer.service' +import { SupabaseModule } from 'src/supabase/supabase.module' +import { SupabaseService } from 'src/supabase/supabase.service' @Module({ imports: [ @@ -16,6 +18,7 @@ import { IPuppeteerService, PuppeteerService } from 'src/puppeteer/puppeteer.ser }), EnvModule, HttpModule, + SupabaseModule, ], providers: [ ConfigService, @@ -24,6 +27,7 @@ import { IPuppeteerService, PuppeteerService } from 'src/puppeteer/puppeteer.ser provide: IPuppeteerService, useClass: PuppeteerService, }, + SupabaseService, PeatixOrderService, ], exports: [PeatixOrderService], diff --git a/apps/peatix-adapter/src/peatix-order/peatix-order.service.ts b/apps/peatix-adapter/src/peatix-order/peatix-order.service.ts index d900263d..7ad5659e 100644 --- a/apps/peatix-adapter/src/peatix-order/peatix-order.service.ts +++ b/apps/peatix-adapter/src/peatix-order/peatix-order.service.ts @@ -10,6 +10,7 @@ import { promises, readFileSync } from 'fs' import { ScraperPage } from '../scraper-page/scraper-page' import { HttpService } from '@nestjs/axios' import { JSON_USAGE, PUPPETEER_USAGE } from '../features' +import { SupabaseService } from 'src/supabase/supabase.service' const { parse } = require('csv-parse/sync') @@ -21,6 +22,7 @@ export class PeatixOrderService extends ScraperPage { envService: EnvService, puppeteerService: IPuppeteerService, private readonly httpService: HttpService, + private readonly supabaseService: SupabaseService, ) { super(envService, puppeteerService) } @@ -160,33 +162,28 @@ export class PeatixOrderService extends ScraperPage { ) try { - let attendees = [] - if (PUPPETEER_USAGE) { await this.login(page) - await this.download(page, (res: PeatixCsv[]) => { - attendees = res - this.logger.log(res) + await this.download(page, async (res: PeatixCsv[]) => { + const attendees = res + this.logger.log(attendees) + + const adminUsers = await this.supabaseService.fetchAdminUsers() + this.logger.log(adminUsers) }) } if (JSON_USAGE) { const res = await this.fetchJson<{ json_data: Peatix }>() - attendees = res.json_data.event.attendees - this.logger.log(res) + const attendees = res.json_data.event.attendees + this.logger.log(attendees) } - this.logger.log(attendees) - await browser.close() - - return attendees } catch (e) { this.logger.error(e) await browser.close() - - return [] } } } diff --git a/apps/peatix-adapter/src/supabase/supabase.module.ts b/apps/peatix-adapter/src/supabase/supabase.module.ts new file mode 100644 index 00000000..acdce199 --- /dev/null +++ b/apps/peatix-adapter/src/supabase/supabase.module.ts @@ -0,0 +1,24 @@ +import { Module } from '@nestjs/common' +import { ConfigModule, ConfigService } from '@nestjs/config' +import { SupabaseService } from './supabase.service' +import { EnvModule } from 'src/env/env.module' +import { configuration } from 'src/env/utils' +import { EnvService } from 'src/env/env.service' + +@Module({ + imports: [ + ConfigModule.forRoot({ + envFilePath: '.env', + expandVariables: true, + load: [configuration], + }), + EnvModule, + ], + providers: [ + ConfigService, + EnvService, + SupabaseService, + ], + exports: [SupabaseService], +}) +export class SupabaseModule {} diff --git a/apps/peatix-adapter/src/supabase/supabase.service.ts b/apps/peatix-adapter/src/supabase/supabase.service.ts new file mode 100644 index 00000000..087f4d22 --- /dev/null +++ b/apps/peatix-adapter/src/supabase/supabase.service.ts @@ -0,0 +1,35 @@ +import { Injectable, Logger } from '@nestjs/common' +import { SupabaseClient, createClient } from '@supabase/supabase-js' +import { EnvService } from 'src/env/env.service' + +@Injectable() +export class SupabaseService { + private readonly logger = new Logger(SupabaseService.name) + + private client: SupabaseClient + + constructor(private readonly envService: EnvService) { + // + } + + private getClient() { + if (this.client) { + this.logger.log('Client already exists') + return + } + + this.client = createClient( + this.envService.SUPABASE_URL, + this.envService.SUPABASE_KEY, + ) + + this.client + } + + public async fetchAdminUsers() { + this.getClient() + + const { data } = await this.client.from('admin_users').select() + return data + } +} diff --git a/bun.lockb b/bun.lockb index dad087da6bb88454f96ad4f6fffcdab0cbbc0fb3..413ca8996ada872b5033f50388ca710972040de3 100755 GIT binary patch delta 29306 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 bUR1*jo@F7(Pe{5}-v)B0uALW^CgT4AfS(X* delta 28602 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