| 1 | import { eq } from "drizzle-orm"; |
| 2 | import { z } |
| 3 | import { db } |
| 4 | import { settings } |
| 5 | import { env } |
| 6 | import { recordActivity } |
| 7 | import { deleteObject } |
| 8 | import { encrypt } |
| 9 | import { adminProcedure, publicProcedure |
| 10 | |
| 11 | const ENCRYPTED_SETTINGS_KEYS = new |
| 12 | |
| 13 | export const settingsRouter = |
| 14 | getActiveSocialProviders: publicProcedure.handler |
| 15 | const rows = |
| 16 | const s = |
| 17 | const providers: |
| 18 | if (s.github_enabled |
| 19 | if (s.discord_enabled |
| 20 | return providers; |
| 21 | }), |
| 22 | |
| 23 | isSetupComplete: publicProcedure.handler |
| 24 | const row = |
| 25 | where: eq(settings |
| 26 | }); |
| 27 | return row?.value |
| 28 | }), |
| 29 | |
| 30 | get: adminProcedure |
| 31 | .input(z.object |
| 32 | .handler(async ( |
| 33 | const row = |
| 34 | where: eq(settings |
| 35 | }); |
| 36 | return row?.value |
| 37 | }), |
| 38 | |
| 39 | set: adminProcedure |
| 40 | .input(z.object |
| 41 | .handler(async ( |
| 42 | const storageValue = |
| 43 | await db |
| 44 | .insert(settings) |
| 45 | .values({ key: |
| 46 | .onDuplicateKeyUpdate({ set: |
| 47 | context.revalidate?.(); |
| 48 | recordActivity({ eventType: |
| 49 | }), |
| 50 | |
| 51 | getAll: adminProcedure.handler |
| 52 | const rows = |
| 53 | return Object.fromEntries |
| 54 | }), |
| 55 | |
| 56 | getConfig: adminProcedure.handler |
| 57 | const rows = |
| 58 | const s = |
| 59 | return { |
| 60 | appName: env.APP_NAME |
| 61 | appNameFromEnv: !!env.APP_NAME |
| 62 | appUrl: env.APP_URL |
| 63 | appUrlFromEnv: !!env.APP_URL |
| 64 | metaDescription: s.meta_description |
| 65 | registrationEnabled: s.registration_enabled |
| 66 | logoUrl: s.logo_url |
| 67 | ogBannerUrl: s.og_banner_url |
| 68 | githubEnabled: s.github_enabled |
| 69 | githubClientId: s.github_client_id |
| 70 | githubClientSecretSet: !!(s. |
| 71 | discordEnabled: s.discord_enabled |
| 72 | discordClientId: s.discord_client_id |
| 73 | discordClientSecretSet: !!(s. |
| 74 | googleDriveClientId: s.google_drive_client_id |
| 75 | googleDriveClientSecretSet: !!(s. |
| 76 | ogTitle: s.og_title |
| 77 | ogDescription: s.og_description |
| 78 | ogSiteName: s.og_site_name |
| 79 | ogType: s.og_type |
| 80 | twitterCard: s.twitter_card |
| 81 | twitterSite: s.twitter_site |
| 82 | twitterCreator: s.twitter_creator |
| 83 | themeColor: s.theme_color |
| 84 | metaKeywords: s.meta_keywords |
| 85 | }; |
| 86 | }), |
| 87 | |
| 88 | removeLogo: adminProcedure.handler |
| 89 | const row = |
| 90 | if (row?.value |
| 91 | const key = |
| 92 | void deleteObject(key) |
| 93 | } |
| 94 | await db.delete |
| 95 | context.revalidate?.(); |
| 96 | }), |
| 97 | |
| 98 | removeOgBanner: adminProcedure.handler |
| 99 | const row = |
| 100 | if (row?.value |
| 101 | const key = |
| 102 | void deleteObject(key) |
| 103 | } |
| 104 | await db.delete |
| 105 | context.revalidate?.(); |
| 106 | }), |
| 107 | |
| 108 | getBillingConfig: adminProcedure.handler |
| 109 | const rows = |
| 110 | const s = |
| 111 | return { |
| 112 | enabled: s.billing_enabled |
| 113 | defaultCurrency: s.billing_default_currency |
| 114 | trialsEnabled: s.billing_trials_enabled |
| 115 | trialDays: Number(s |
| 116 | taxEnabled: s.billing_tax_enabled |
| 117 | vatRate: Number(s |
| 118 | requireVatNumber: s.billing_require_vat_number |
| 119 | invoicePrefix: s.billing_invoice_prefix |
| 120 | companyName: s.billing_company_name |
| 121 | referralEnabled: s.billing_referral_enabled |
| 122 | refereeDiscountPercent: Number(s |
| 123 | referrerRewardPercent: Number(s |
| 124 | }; |
| 125 | }), |
| 126 | |
| 127 | setBillingSettings: adminProcedure |
| 128 | .input( |
| 129 | z.object({ |
| 130 | enabled: z.boolean |
| 131 | defaultCurrency: z.string |
| 132 | trialsEnabled: z.boolean |
| 133 | trialDays: z.number |
| 134 | taxEnabled: z.boolean |
| 135 | vatRate: z.number |
| 136 | requireVatNumber: z.boolean |
| 137 | invoicePrefix: z.string |
| 138 | companyName: z.string |
| 139 | referralEnabled: z.boolean |
| 140 | refereeDiscountPercent: z.number |
| 141 | referrerRewardPercent: z.number |
| 142 | }), |
| 143 | ) |
| 144 | .handler(async ( |
| 145 | const pairs: |
| 146 | if (input.enabled |
| 147 | if (input.defaultCurrency |
| 148 | if (input.trialsEnabled |
| 149 | if (input.trialDays |
| 150 | if (input.taxEnabled |
| 151 | if (input.vatRate |
| 152 | if (input.requireVatNumber |
| 153 | if (input.invoicePrefix |
| 154 | if (input.companyName |
| 155 | if (input.referralEnabled |
| 156 | if (input.refereeDiscountPercent |
| 157 | if (input.referrerRewardPercent |
| 158 | for (const { |
| 159 | await db |
| 160 | .insert(settings) |
| 161 | .values({ key |
| 162 | .onDuplicateKeyUpdate({ set: |
| 163 | } |
| 164 | context.revalidate?.(); |
| 165 | recordActivity({ eventType: |
| 166 | }), |
| 167 | }; |