Compare commits
1 Commits
@portaljs/
...
fix_id_res
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
38febe2f60 |
5
.changeset/sharp-spoons-deny.md
Normal file
5
.changeset/sharp-spoons-deny.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'@portaljs/ckan': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
remove optional from id in resource interface
|
||||||
@@ -1,15 +1,5 @@
|
|||||||
# @portaljs/ckan
|
# @portaljs/ckan
|
||||||
|
|
||||||
## 0.1.0
|
|
||||||
|
|
||||||
### Minor Changes
|
|
||||||
|
|
||||||
- [#1018](https://github.com/datopian/portaljs/pull/1018) [`50122cd0`](https://github.com/datopian/portaljs/commit/50122cd0cbbf68bdadc641341279b30b22538cfd) Thanks [@demenech](https://github.com/demenech)! - package_search method now supports custom headers and include_private parameter
|
|
||||||
|
|
||||||
### Patch Changes
|
|
||||||
|
|
||||||
- [#1016](https://github.com/datopian/portaljs/pull/1016) [`91217f32`](https://github.com/datopian/portaljs/commit/91217f325657e2f298b0e632793ae9bb8b08e870) Thanks [@luccasmmg](https://github.com/luccasmmg)! - remove optional from id in resource interface
|
|
||||||
|
|
||||||
## 0.0.5
|
## 0.0.5
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@portaljs/ckan",
|
"name": "@portaljs/ckan",
|
||||||
"version": "0.1.0",
|
"version": "0.0.5",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "https://portaljs.org",
|
"description": "https://portaljs.org",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
|
|||||||
@@ -69,7 +69,6 @@ export interface PackageSearchOptions {
|
|||||||
query?: string;
|
query?: string;
|
||||||
resFormat?: Array<string>;
|
resFormat?: Array<string>;
|
||||||
sort?: string;
|
sort?: string;
|
||||||
include_private?: boolean;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Tag {
|
export interface Tag {
|
||||||
|
|||||||
@@ -31,7 +31,11 @@ export default class CKAN {
|
|||||||
|
|
||||||
async getDatasetsListWithDetails(options: DatasetListQueryOptions) {
|
async getDatasetsListWithDetails(options: DatasetListQueryOptions) {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/current_package_list_with_resources?offset=${options.offset}&limit=${options.limit}`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/current_package_list_with_resources?offset=${
|
||||||
|
options.offset
|
||||||
|
}&limit=${options.limit}`,
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
@@ -40,8 +44,7 @@ export default class CKAN {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async packageSearch(
|
async packageSearch(
|
||||||
options: PackageSearchOptions,
|
options: PackageSearchOptions
|
||||||
reqOptions: Partial<RequestInit> = {}
|
|
||||||
): Promise<{ datasets: Dataset[]; count: number }> {
|
): Promise<{ datasets: Dataset[]; count: number }> {
|
||||||
function buildGroupsQuery(groups: Array<string>) {
|
function buildGroupsQuery(groups: Array<string>) {
|
||||||
if (groups.length > 0) {
|
if (groups.length > 0) {
|
||||||
@@ -96,18 +99,16 @@ export default class CKAN {
|
|||||||
options.groups,
|
options.groups,
|
||||||
options?.resFormat
|
options?.resFormat
|
||||||
);
|
);
|
||||||
|
const response = await fetchRetry(
|
||||||
let url = `${this.DMS}/api/3/action/package_search?`;
|
`${
|
||||||
url += `start=${options.offset}`;
|
this.DMS
|
||||||
url += `&rows=${options.limit}`;
|
}/api/3/action/package_search?start=${options.offset}&rows=${
|
||||||
url += fq ? fq : '';
|
options.limit
|
||||||
url += options.query ? '&q=' + options.query : '';
|
}${fq ? fq : ''}${options.query ? '&q=' + options.query : ''}${
|
||||||
url += options.sort ? '&sort=' + options.sort : '';
|
options.sort ? '&sort=' + options.sort : ''
|
||||||
url += options.include_private
|
}`,
|
||||||
? '&include_private=' + options.include_private
|
3
|
||||||
: '';
|
);
|
||||||
|
|
||||||
const response = await fetchRetry(url, 3, reqOptions);
|
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
const datasets: Array<Dataset> = responseData.result.results;
|
const datasets: Array<Dataset> = responseData.result.results;
|
||||||
return { datasets, count: responseData.result.count };
|
return { datasets, count: responseData.result.count };
|
||||||
@@ -115,7 +116,9 @@ export default class CKAN {
|
|||||||
|
|
||||||
async getDatasetDetails(datasetName: string) {
|
async getDatasetDetails(datasetName: string) {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/package_show?id=${datasetName}`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/package_show?id=${datasetName}`,
|
||||||
1
|
1
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
@@ -128,7 +131,9 @@ export default class CKAN {
|
|||||||
|
|
||||||
async getDatasetActivityStream(datasetName: string) {
|
async getDatasetActivityStream(datasetName: string) {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/package_activity_list?id=${datasetName}`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/package_activity_list?id=${datasetName}`,
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
@@ -146,7 +151,9 @@ export default class CKAN {
|
|||||||
async getUser(userId: string) {
|
async getUser(userId: string) {
|
||||||
try {
|
try {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/user_show?id=${userId}`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/user_show?id=${userId}`,
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
@@ -159,7 +166,10 @@ export default class CKAN {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async getGroupList() {
|
async getGroupList() {
|
||||||
const response = await fetchRetry(`${this.DMS}/api/3/action/group_list`, 3);
|
const response = await fetchRetry(
|
||||||
|
`${this.DMS}/api/3/action/group_list`,
|
||||||
|
3
|
||||||
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
const groups: Array<string> = responseData.result;
|
const groups: Array<string> = responseData.result;
|
||||||
return groups;
|
return groups;
|
||||||
@@ -167,7 +177,9 @@ export default class CKAN {
|
|||||||
|
|
||||||
async getGroupsWithDetails() {
|
async getGroupsWithDetails() {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/group_list?all_fields=True`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/group_list?all_fields=True`,
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
@@ -177,7 +189,9 @@ export default class CKAN {
|
|||||||
|
|
||||||
async getGroupDetails(groupName: string) {
|
async getGroupDetails(groupName: string) {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/group_show?id=${groupName}&include_datasets=True`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/group_show?id=${groupName}&include_datasets=True`,
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
@@ -187,7 +201,9 @@ export default class CKAN {
|
|||||||
|
|
||||||
async getGroupActivityStream(groupName: string) {
|
async getGroupActivityStream(groupName: string) {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/group_activity_list?id=${groupName}`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/group_activity_list?id=${groupName}`,
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
@@ -214,7 +230,9 @@ export default class CKAN {
|
|||||||
async getOrgsWithDetails(accrossPages?: boolean) {
|
async getOrgsWithDetails(accrossPages?: boolean) {
|
||||||
if (!accrossPages) {
|
if (!accrossPages) {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/organization_list?all_fields=True`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/organization_list?all_fields=True`,
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
@@ -233,7 +251,9 @@ export default class CKAN {
|
|||||||
|
|
||||||
for (let i = 0; i < pages; i++) {
|
for (let i = 0; i < pages; i++) {
|
||||||
let allOrgListResponse = await fetchRetry(
|
let allOrgListResponse = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/organization_list?all_fields=True&offset=${
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/organization_list?all_fields=True&offset=${
|
||||||
i * 25
|
i * 25
|
||||||
}&limit=25`,
|
}&limit=25`,
|
||||||
3
|
3
|
||||||
@@ -247,7 +267,9 @@ export default class CKAN {
|
|||||||
|
|
||||||
async getOrgDetails(orgName: string) {
|
async getOrgDetails(orgName: string) {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/organization_show?id=${orgName}&include_datasets=True`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/organization_show?id=${orgName}&include_datasets=True`,
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
@@ -257,7 +279,9 @@ export default class CKAN {
|
|||||||
|
|
||||||
async getOrgActivityStream(orgName: string) {
|
async getOrgActivityStream(orgName: string) {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/organization_activity_list?id=${orgName}`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/organization_activity_list?id=${orgName}`,
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
@@ -273,7 +297,9 @@ export default class CKAN {
|
|||||||
|
|
||||||
async getAllTags() {
|
async getAllTags() {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/tag_list?all_fields=True`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/tag_list?all_fields=True`,
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
@@ -282,41 +308,49 @@ export default class CKAN {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async getResourcesWithAliasList() {
|
async getResourcesWithAliasList() {
|
||||||
const response = await fetch(`${this.DMS}/api/3/action/datastore_search`, {
|
const response = await fetch(
|
||||||
method: 'POST',
|
`${this.DMS}/api/3/action/datastore_search`,
|
||||||
headers: {
|
{
|
||||||
Accept: 'application/json',
|
method: 'POST',
|
||||||
'Content-Type': 'application/json',
|
headers: {
|
||||||
},
|
Accept: 'application/json',
|
||||||
body: JSON.stringify({
|
'Content-Type': 'application/json',
|
||||||
id: '_table_metadata',
|
},
|
||||||
limit: '32000',
|
body: JSON.stringify({
|
||||||
}),
|
id: '_table_metadata',
|
||||||
});
|
limit: '32000',
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
const tableMetadata: Array<TableMetadata> = responseData.result.records;
|
const tableMetadata: Array<TableMetadata> = responseData.result.records;
|
||||||
return tableMetadata.filter((item) => item.alias_of);
|
return tableMetadata.filter((item) => item.alias_of);
|
||||||
}
|
}
|
||||||
|
|
||||||
async datastoreSearch(resourceId: string) {
|
async datastoreSearch(resourceId: string) {
|
||||||
const response = await fetch(`${this.DMS}/api/3/action/datastore_search`, {
|
const response = await fetch(
|
||||||
method: 'POST',
|
`${this.DMS}/api/3/action/datastore_search`,
|
||||||
headers: {
|
{
|
||||||
Accept: 'application/json',
|
method: 'POST',
|
||||||
'Content-Type': 'application/json',
|
headers: {
|
||||||
},
|
Accept: 'application/json',
|
||||||
body: JSON.stringify({
|
'Content-Type': 'application/json',
|
||||||
id: resourceId,
|
},
|
||||||
limit: '32000',
|
body: JSON.stringify({
|
||||||
}),
|
id: resourceId,
|
||||||
});
|
limit: '32000',
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
return responseData.result.records;
|
return responseData.result.records;
|
||||||
}
|
}
|
||||||
|
|
||||||
async getResourceMetadata(resourceId: string) {
|
async getResourceMetadata(resourceId: string) {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/resource_show?id=${resourceId}`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/resource_show?id=${resourceId}`,
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
@@ -325,14 +359,17 @@ export default class CKAN {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async getResourceInfo(resourceId: string) {
|
async getResourceInfo(resourceId: string) {
|
||||||
const response = await fetch(`${this.DMS}/api/3/action/datastore_info`, {
|
const response = await fetch(
|
||||||
method: 'POST',
|
`${this.DMS}/api/3/action/datastore_info`,
|
||||||
headers: {
|
{
|
||||||
Accept: 'application/json',
|
method: 'POST',
|
||||||
'Content-Type': 'application/json',
|
headers: {
|
||||||
},
|
Accept: 'application/json',
|
||||||
body: JSON.stringify({ resource_id: resourceId }),
|
'Content-Type': 'application/json',
|
||||||
});
|
},
|
||||||
|
body: JSON.stringify({ resource_id: resourceId }),
|
||||||
|
}
|
||||||
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
const resourceInfo: Array<ResourceInfo> = responseData.result;
|
const resourceInfo: Array<ResourceInfo> = responseData.result;
|
||||||
return resourceInfo;
|
return resourceInfo;
|
||||||
@@ -340,7 +377,9 @@ export default class CKAN {
|
|||||||
|
|
||||||
async getFacetFields(field: 'res_format' | 'tags') {
|
async getFacetFields(field: 'res_format' | 'tags') {
|
||||||
const response = await fetchRetry(
|
const response = await fetchRetry(
|
||||||
`${this.DMS}/api/3/action/package_search?facet.field=["${field}"]&rows=0`,
|
`${
|
||||||
|
this.DMS
|
||||||
|
}/api/3/action/package_search?facet.field=["${field}"]&rows=0`,
|
||||||
3
|
3
|
||||||
);
|
);
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
|
|||||||
@@ -9,14 +9,10 @@ export function getDaysAgo(date: string) {
|
|||||||
return (+today - +createdOn) / msInDay;
|
return (+today - +createdOn) / msInDay;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function fetchRetry(
|
export default async function fetchRetry(url: string, n: number): Promise<any> {
|
||||||
url: string,
|
|
||||||
n: number,
|
|
||||||
opts: Partial<RequestInit> = {}
|
|
||||||
): Promise<any> {
|
|
||||||
const abortController = new AbortController();
|
const abortController = new AbortController();
|
||||||
const id = setTimeout(() => abortController.abort(), 30000);
|
const id = setTimeout(() => abortController.abort(), 30000);
|
||||||
const res = await fetch(url, { signal: abortController.signal, ...opts });
|
const res = await fetch(url, { signal: abortController.signal });
|
||||||
clearTimeout(id);
|
clearTimeout(id);
|
||||||
if (!res.ok && n && n > 0) {
|
if (!res.ok && n && n > 0) {
|
||||||
return await fetchRetry(url, n - 1);
|
return await fetchRetry(url, n - 1);
|
||||||
@@ -25,13 +21,13 @@ export default async function fetchRetry(
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function removeTag(tag?: string) {
|
export function removeTag(tag?: string) {
|
||||||
if (tag === '{{description}}' || !tag) {
|
if (tag === "{{description}}" || !tag) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
if (typeof window !== 'undefined') {
|
if (typeof window !== "undefined") {
|
||||||
const div = document.createElement('div');
|
const div = document.createElement("div");
|
||||||
div.innerHTML = tag;
|
div.innerHTML = tag;
|
||||||
return div.textContent || div.innerText || '';
|
return div.textContent || div.innerText || "";
|
||||||
}
|
}
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
@@ -42,10 +38,10 @@ export function convertFieldSchema(
|
|||||||
) {
|
) {
|
||||||
function convertToGraphqlString(fieldName: string) {
|
function convertToGraphqlString(fieldName: string) {
|
||||||
return fieldName
|
return fieldName
|
||||||
.replaceAll(' ', '_')
|
.replaceAll(" ", "_")
|
||||||
.replaceAll('(', '_')
|
.replaceAll("(", "_")
|
||||||
.replaceAll(')', '_')
|
.replaceAll(")", "_")
|
||||||
.replace(/[^\w\s]|(_)\1/gi, '_');
|
.replace(/[^\w\s]|(_)\1/gi, "_");
|
||||||
}
|
}
|
||||||
const entries = Object.entries(schema);
|
const entries = Object.entries(schema);
|
||||||
return {
|
return {
|
||||||
|
|||||||
Reference in New Issue
Block a user