Konektor Linear
Hubungkan workspace Linear Anda ke Brevo untuk pelacakan issue yang menghadap pelanggan, notifikasi pembaruan produk, dan kampanye milestone pengembangan melalui Tajo.
Ikhtisar
| Properti | Nilai |
|---|---|
| Platform | Linear |
| Kategori | Custom |
| Kompleksitas setup | Mudah |
| Integrasi resmi | Tidak |
| Data yang disinkronkan | Issue, proyek, pengguna, event |
| Tipe API | GraphQL API |
| Autentikasi | OAuth 2.0 / Personal API Key |
| Base URL | https://api.linear.app/graphql |
Fitur
- Sinkronisasi event issue - Teruskan event pembuatan, pembaruan, dan penyelesaian issue ke timeline kontak Brevo
- Pelacakan milestone proyek - Picu kampanye Brevo saat proyek mencapai milestone penting
- Penautan issue pelanggan - Kaitkan issue Linear dengan kontak Brevo untuk visibilitas dukungan
- Segmentasi berbasis label - Petakan label Linear ke atribut kontak Brevo
- Analitik cycle - Sinkronkan data penyelesaian sprint/cycle untuk pelaporan performa tim
- Otomatisasi berbasis webhook - Penerusan event real-time melalui webhook Linear
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
- Workspace Linear dengan akses admin
- Personal API key atau aplikasi OAuth yang telah dikonfigurasi
- Akun Brevo dengan akses API
- Akun Tajo dengan langganan aktif
Autentikasi
Linear mendukung Personal API key dan OAuth 2.0.
Opsi 1: Personal API Key
- Buka Linear > Settings > API > Personal API keys
- Klik Create key
- Beri nama “Tajo Integration”
- Salin key yang dihasilkan (diawali dengan
lin_api_)
curl -X POST https://api.linear.app/graphql \ -H "Authorization: $LINEAR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"query": "{ viewer { id name email } }"}'Opsi 2: OAuth 2.0
Untuk integrasi yang melayani banyak workspace:
- Buat aplikasi OAuth di linear.app/settings/api/applications
- Konfigurasikan redirect URI:
https://app.tajo.io/callbacks/linear - Minta scope:
read,write,issues:create,comments:create
GraphQL API
Linear secara eksklusif menggunakan GraphQL API. Semua query dan mutation melewati satu endpoint: https://api.linear.app/graphql. Tajo menangani seluruh penyusunan query GraphQL secara otomatis.
Menghubungkan ke Tajo
# Using Personal API Keytajo connectors install linear \ --api-key $LINEAR_API_KEY
# Using OAuthtajo connectors install linear \ --client-id $LINEAR_CLIENT_ID \ --client-secret $LINEAR_CLIENT_SECRETKonfigurasi
Setup dasar
connectors: linear: enabled: true
sync: issues: true projects: true cycles: true users: true
teams: - key: "ENG" sync_to_list: 38 - key: "SUPPORT" sync_to_list: 39
issue_states: - Backlog - Todo - "In Progress" - Done - CanceledPemetaan field
Petakan data pengguna dan issue Linear ke atribut Brevo:
field_mapping: # User fields id: LINEAR_USER_ID email: email name: FIRSTNAME
# Issue metrics mapped to contact events last_issue_identifier: LAST_LINEAR_ISSUE last_issue_state: LAST_ISSUE_STATUS last_issue_priority: LAST_ISSUE_PRIORITY total_issues: LINEAR_ISSUE_COUNT
# Project data current_project: ACTIVE_PROJECT team_key: LINEAR_TEAMPemetaan event
event_mapping: Issue.create: ISSUE_CREATED Issue.update: ISSUE_UPDATED Issue.remove: ISSUE_DELETED Comment.create: COMMENT_ADDED Project.update: PROJECT_UPDATED Cycle.update: CYCLE_UPDATEDEndpoint API
Linear menggunakan satu endpoint GraphQL. Query dan mutation utama yang dipakai Tajo:
| Operasi | Tipe | Tujuan |
|---|---|---|
issues | Query | Menampilkan dan memfilter issue |
issue | Query | Mengambil satu issue berdasarkan ID |
projects | Query | Menampilkan semua proyek |
cycles | Query | Menampilkan cycle (sprint) |
teams | Query | Menampilkan tim workspace |
users | Query | Menampilkan anggota workspace |
viewer | Query | Mengambil info pengguna terautentikasi |
issueCreate | Mutation | Membuat issue baru |
issueUpdate | Mutation | Memperbarui issue yang ada |
commentCreate | Mutation | Menambahkan komentar pada issue |
webhookCreate | Mutation | Mendaftarkan webhook |
Contoh query GraphQL
query GetIssues($filter: IssueFilter, $first: Int, $after: String) { issues(filter: $filter, first: $first, after: $after) { nodes { id identifier title state { name } priority assignee { email name } labels { nodes { name } } createdAt updatedAt } pageInfo { hasNextPage endCursor } }}Contoh kode
Inisialisasi konektor
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
await tajo.connectors.connect('linear', { apiKey: process.env.LINEAR_API_KEY});Menyinkronkan issue
await tajo.connectors.sync('linear', { type: 'incremental', resources: ['issues'], teams: ['ENG', 'SUPPORT'], since: '2024-01-01'});
const status = await tajo.connectors.status('linear');console.log(status);// {// connected: true,// lastSync: '2024-03-15T18:00:00Z',// issuesTracked: 3200,// projectsMonitored: 8,// usersLinked: 45// }Menangani webhook Linear
app.post('/webhooks/linear', async (req, res) => { const event = req.body;
// Verify webhook signature const signature = req.get('Linear-Signature'); if (!verifyLinearSignature(req.body, signature)) { return res.status(401).send('Unauthorized'); }
await tajo.connectors.handleWebhook('linear', { type: event.type, action: event.action, payload: { issueId: event.data?.id, identifier: event.data?.identifier, title: event.data?.title, state: event.data?.state?.name, assigneeEmail: event.data?.assignee?.email } });
res.status(200).send('OK');});Membuat issue dari event Brevo
// Create a Linear issue when a Brevo contact submits a requesttajo.events.on('contact.event', async (event) => { if (event.name === 'FEATURE_REQUEST') { await tajo.connectors.create('linear', { teamId: 'ENG', title: `Feature Request: ${event.data.subject}`, description: event.data.description, priority: 3, labelIds: ['feature-request'] }); }});Batas rate
Linear menerapkan batas rate pada GraphQL API miliknya:
| Tipe batas | Nilai |
|---|---|
| Rate permintaan | 1.500 permintaan per jam per API key |
| Kompleksitas query | 10.000 poin kompleksitas per permintaan |
| Paginasi | Maksimum 250 node per halaman (default 50) |
| Webhook | Event masuk tanpa batas |
Anggaran kompleksitas
Linear menggunakan sistem pembatasan rate berbasis kompleksitas. Query sederhana menghabiskan poin lebih sedikit. Tajo mengoptimalkan query untuk meminimalkan kompleksitas dengan hanya meminta field yang dibutuhkan dan memakai paginasi yang efisien.
Linear mengembalikan 429 Too Many Requests dengan header Retry-After saat batas terlampaui.
Pemecahan masalah
Masalah umum
| Masalah | Penyebab | Solusi |
|---|---|---|
| 401 Unauthorized | API key tidak valid atau dicabut | Buat API key baru di Linear Settings |
| Error query | Sintaks GraphQL tidak valid | Validasi query menggunakan API explorer Linear |
| Issue hilang | Akses tim dibatasi | Pastikan pemilik API key memiliki akses ke tim tujuan |
| Webhook tidak terpicu | URL salah atau dinonaktifkan | Periksa status webhook di Linear Settings > API > Webhooks |
| Paginasi tidak lengkap | Cursor after hilang | Pastikan perulangan paginasi berjalan sampai hasNextPage bernilai false |
Mode debug
connectors: linear: debug: true log_level: verbose log_queries: trueMenguji koneksi
tajo connectors test linear# ✓ GraphQL API connection successful# ✓ Workspace access verified# ✓ Team list readable# ✓ Issue query operational# ✓ Webhook registration availablePraktik terbaik
- Gunakan webhook untuk real-time - Daftarkan webhook alih-alih melakukan polling untuk perubahan issue
- Filter berdasarkan tim - Sinkronkan hanya issue dari tim yang relevan untuk mengurangi penggunaan API
- Optimalkan query GraphQL - Minta hanya field yang dibutuhkan agar tetap dalam batas kompleksitas
- Petakan label ke segmen - Gunakan label Linear untuk menggerakkan segmentasi kontak Brevo
- Tangani paginasi - Selalu periksa
hasNextPagedan gunakanendCursoruntuk data yang lengkap - Verifikasi tanda tangan webhook - Selalu validasi header
Linear-Signature
Keamanan
- Autentikasi API key - Personal key dibatasi pada lingkup workspace
- OAuth 2.0 - Alur otorisasi aman untuk integrasi multi-workspace
- Hanya HTTPS - Seluruh komunikasi API dienkripsi via TLS 1.2+
- Tanda tangan webhook - Verifikasi tanda tangan berbasis HMAC
- Penyimpanan terenkripsi - API key dienkripsi saat disimpan di Tajo
- Kepatuhan SOC 2 - Platform Linear bersertifikat SOC 2 Type II