Skip to content

Commit 5bc0e63

Browse files
committed
migrate airtable attachments
1 parent c037448 commit 5bc0e63

File tree

7 files changed

+101
-10
lines changed

7 files changed

+101
-10
lines changed

.github/workflows/orgs-import.yml

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: Import Org logos
2+
3+
on:
4+
schedule:
5+
- cron: "0 0 * * *"
6+
workflow_dispatch:
7+
8+
jobs:
9+
build:
10+
runs-on: ubuntu-latest
11+
steps:
12+
- name: Checkout repository
13+
uses: actions/checkout@master
14+
15+
- name: Use Node.js
16+
uses: actions/setup-node@v1
17+
with:
18+
node-version: '16.x'
19+
20+
- name: Install dependencies
21+
run: yarn install
22+
23+
- name: Import Pretalx schedule
24+
run: yarn org:import
25+
env:
26+
PRETALX_API_KEY: ${{ secrets.PRETALX_API_KEY }}
27+
28+
- name: Commit updates
29+
uses: EndBug/add-and-commit@v9
30+
with:
31+
default_author: github_actions
32+
message: 'CI Logo import'

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"latest": "ts-node src/tools/latest",
1212
"latest:resources": "ts-node src/tools/latest-resources",
1313
"latest:issues": "ts-node src/tools/latest-issues",
14+
"org:import": "ts-node src/tools/org-import",
1415
"twitter:gm": "ts-node src/tools/twitter-gm",
1516
"twitter:last-week": "ts-node src/tools/twitter-last-week",
1617
"twitter:popular": "ts-node src/tools/twitter-popular",

src/components/form/company.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ export function CompanyForm(props: Props) {
6161
readOnly={!!props.org.id}
6262
/>
6363

64+
{/*
65+
// Remove Logo from Airtable/attachments
6466
<FormInput
6567
id="logo"
6668
name="Logo Url"
@@ -69,7 +71,7 @@ export function CompanyForm(props: Props) {
6971
value={props.org.logo}
7072
onChange={(value) => props.onChange({ ...props.org, logo: value })}
7173
readOnly={!!props.org.id}
72-
/>
74+
/> */}
7375

7476
<FormInput
7577
id="website"

src/services/airtable.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,12 @@ export class AirtableService {
2727
twitter: org.twitter,
2828
github: org.github,
2929
externalBoardUrl: org.externalBoardUrl,
30-
logo: [
31-
{
32-
url: org.logo,
33-
} as any,
34-
],
30+
// Remove Logo from Airtable/attachments
31+
// logo: [
32+
// {
33+
// url: org.logo,
34+
// } as any,
35+
// ],
3536
})
3637

3738
if (!response.id) {

src/services/jobs.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import * as dotenv from 'dotenv'
12
import Airtable, { Record, FieldSet } from 'airtable'
23
import { Organization } from 'types/org'
34
import { Job } from 'types/job'
@@ -13,6 +14,9 @@ import {
1314
} from './jobs/index'
1415
import { defaultSlugify, isEmail } from 'utils/helpers'
1516
import { getJobTags } from 'utils/jobs'
17+
import { SITE_URL } from 'utils/constants'
18+
19+
dotenv.config()
1620

1721
if (!process.env.AIRTABLE_API_KEY || !process.env.AIRTABLE_API_KEY) {
1822
throw new Error('Airtable API Base or Key not set.')
@@ -168,14 +172,17 @@ export function toOrganization(source: Record<FieldSet>): Organization {
168172
recordId: source.fields['recordId'],
169173
} as Organization
170174

171-
if (source.fields['logo'] && Array.isArray(source.fields['logo']) && (source.fields['logo'] as any[]).length > 0) {
172-
org.logo = (source.fields['logo'] as any[])[0].url
173-
}
175+
// Remove Logo from Airtable/attachments
176+
// if (source.fields['logo'] && Array.isArray(source.fields['logo']) && (source.fields['logo'] as any[]).length > 0) {
177+
// org.logo = (source.fields['logo'] as any[])[0].url
178+
// }
174179
if (source.fields['website']) {
175180
org.website = (source.fields['website'] as string) ?? ''
176181
}
177182
if (source.fields['twitter']) {
178-
org.twitter = (source.fields['twitter'] as string) ?? ''
183+
const handle = (source.fields['twitter'] as string) ?? ''
184+
org.twitter = handle
185+
org.logo = `${SITE_URL}assets/orgs/${handle.replace('@', '')}.png`
179186
}
180187
if (source.fields['github']) {
181188
org.github = (source.fields['github'] as string) ?? ''

src/tools/org-import.ts

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import * as dotenv from 'dotenv'
2+
import fs from 'fs'
3+
import fetch from 'cross-fetch'
4+
import path from 'path'
5+
import { GetOrganizations } from '../services/jobs'
6+
7+
dotenv.config()
8+
9+
console.log('Import org logos')
10+
run()
11+
12+
const dir = path.join(__dirname, `../../public/assets/orgs`)
13+
fs.mkdir(dir, { recursive: true }, () => '')
14+
15+
async function run() {
16+
const orgs = await GetOrganizations()
17+
const handles = orgs.map((i) => i.twitter?.replaceAll('@', '')).filter((i) => !!i) as string[]
18+
19+
console.log('Orgs', orgs.length)
20+
console.log('Handles', handles.length)
21+
22+
Promise.all(handles.map((i) => fetchAndSave(i))).then((results) => {
23+
const total = results.length
24+
25+
console.log(`Total: ${total}`)
26+
console.log(`Failed: ${results.filter((i) => i === false).length}`)
27+
})
28+
}
29+
30+
async function fetchAndSave(handle: string) {
31+
// console.log('Fetching', handle)
32+
33+
try {
34+
const response = await fetch(`https://unavatar.io/twitter/${handle}`)
35+
const blob = await response.blob()
36+
const arrayBuffer = await blob.arrayBuffer()
37+
const buffer = Buffer.from(arrayBuffer)
38+
fs.writeFileSync(`${dir}/${handle}.png`, buffer)
39+
return true
40+
} catch (e) {
41+
console.log('Unable to fetch', handle)
42+
console.error(e)
43+
return false
44+
}
45+
}

tsconfig.json

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
"incremental": true,
1717
"baseUrl": "./src",
1818
},
19+
"ts-node": {
20+
"require": ["tsconfig-paths/register"]
21+
},
1922
"include": ["next-env.d.ts", "src"],
2023
"exclude": ["node_modules"]
2124
}

0 commit comments

Comments
 (0)