- offer to create tag when none is found while adding a link from cli - fix tag display in search
82 lines
2.2 KiB
JavaScript
82 lines
2.2 KiB
JavaScript
import path from "path";
|
|
import { fileURLToPath } from "url";
|
|
import dotenv from "dotenv";
|
|
import { createDirectus, staticToken, rest } from "@directus/sdk";
|
|
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
|
dotenv.config({ path: path.resolve(__dirname, "..", "..", "..", ".env") });
|
|
|
|
let directus;
|
|
let API_URL;
|
|
|
|
export const initDirectusClient = (config) => {
|
|
API_URL = config.directus?.apiUrl;
|
|
|
|
const token = process.env.DIRECTUS_API_TOKEN;
|
|
|
|
if (!API_URL || !token) throw new Error("Missing Directus API URL or token.");
|
|
|
|
directus = createDirectus(API_URL).with(staticToken(process.env.DIRECTUS_API_TOKEN)).with(rest());
|
|
};
|
|
|
|
export const getDirectusClient = () => {
|
|
if (!directus) throw new Error("Directus client not initialized.");
|
|
|
|
return directus;
|
|
};
|
|
|
|
const request = async (method, endpoint, body = null) => {
|
|
const API_TOKEN = process.env.DIRECTUS_API_TOKEN;
|
|
const res = await fetch(`${API_URL}/items/${endpoint}`, {
|
|
method,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
Authorization: `Bearer ${API_TOKEN}`
|
|
},
|
|
body: body ? JSON.stringify(body) : null
|
|
});
|
|
|
|
if (!res.ok) {
|
|
const errorText = await res.text();
|
|
|
|
throw new Error(`Directus API error: ${res.status} ${errorText}`);
|
|
}
|
|
|
|
return await res.json();
|
|
};
|
|
|
|
export const searchItems = async (collection, query = "", filters = {}) => {
|
|
const API_TOKEN = process.env.DIRECTUS_API_TOKEN;
|
|
const params = new URLSearchParams();
|
|
|
|
if (query) params.append("search", query);
|
|
|
|
params.append("limit", "50");
|
|
|
|
for (const [field, value] of Object.entries(filters)) {
|
|
params.append(`filter[${field}][_eq]`, value);
|
|
}
|
|
|
|
try {
|
|
const res = await fetch(`${API_URL}/items/${collection}?${params.toString()}`, {
|
|
method: "GET",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
Authorization: `Bearer ${API_TOKEN}`
|
|
}
|
|
});
|
|
const data = await res.json();
|
|
|
|
return data?.data ?? [];
|
|
} catch (err) {
|
|
console.error(`❌ Failed to search ${collection}:`, err.message);
|
|
|
|
return [];
|
|
}
|
|
};
|
|
|
|
export const updateItem = async (collection, id, values) =>
|
|
await request("PATCH", `${collection}/${id}`, values);
|
|
|
|
export const createItem = async (collection, values) => await request("POST", collection, values);
|