UNPKG

@mariolazzari/rijks

Version:

Rijksmuseum REST APIs client TypeScript based

474 lines (342 loc) 9.23 kB
# Rijks ___ This package is a TypeScript based wrapper around the public REST APIs of Rijksmuseum (Amsterdam). **Prerequisites** In order to use this package, you need an api key: You can read more on how to obtain the API key on [this page](http://rijksmuseum.github.io). This package requires [NodeJS](https://nodejs.org) (version 18 or later) and a node package manager (Npm, Yarn, Pnpm or Bun). To make sure you have them available on your machine, try running the following command. ```sh $ npm -v && node -v v10.1.0 v18.18.0 ``` ___ ## Gettting started These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system. ___ ## Installation **BEFORE YOU INSTALL**: please read the prerequisites. Start with cloning this repo on your local machine: ```sh $ git clone https://github.com/mariolazzari/rijks.git $ cd rijks ``` To install and set up the library, run: ```sh npm install @mariolazzari/rijks ``` ___ ## Usage **Import package** ```js import { Rijks } from "@mariolazzari/rijks" ``` **Watch mode** ```sh npm test ``` **Unit testing** ```sh npm test ``` **Bulding new version** ```sh npm build ``` This task will create a distribution version of the project inside your local dist/ folder ## Rijks class Rijks **class** content handles all the requests and the responses to the three main Rijks museum REST APIs. ### Constructor In order to initialize Rijks **client**: ```js const rijks = new Rijks(API_KEY, culture?) ``` Constructor parameters | Parameter | Type | Required | Default | | --------- | ------- | :------: | ------- | | apiKey | string | Yes | | | culture | Culture | No | en | ### Methods Rijks client includes the following three methods: #### getCollection *Description* This asynchronous **method** handles `GET /api/[culture]/collection` REST API. *Prototype* ```ts async getCollection(params: CollectionRequest): Promise<Result<CollectionResponse>> ``` *Sample code* ```ts const params: CollectionRequest = {searchTerm: "Vermeer"} const collection: CollectionResponse = await rijks.getCollection(params) ``` ##### CollectionRequest This **type** contains all the possible parameters handled by **getCollection** method. | Parameter | Type | Required | Default | | ------------- | ------- | :------: | ------- | | searchTerm | string | Yes | | | page | number | Yes | 1 | | perPage | number | Yes | 10 | | format | Format | | json | | culture | Culture | | en | | involvedMaker | string | | | | type | string | | | | material | string | | | | technique | string | | | | period | string | | | | hex | string | | | | imageOnly | string | | true | | topPieces | string | | true | | sort | Sort | | | ##### CollectionResponse This **type** contains all the values returned by **getCollection** method | Value | Type | Required | Default | | ------------------- | ------------ | :------: | :-----: | | elapsedMilliseconds | number | Yes | 0 | | count | number | Yes | 0 | | countFacets | CountFacets | | [] | | artObjects | ArtObjects[] | | [] | | facets | Facet[] | | [] | #### getCollectionDetails *Description* This **method** handles `GET /api/[culture]/collection/[object-number]` REST API. *Prototype* ```ts async getCollectionDetails(params:CollectionDetailsRequst) : Promise<Result<CollectionDetailsResponse>> ``` ##### CollectionDetailsRequst This **type** handles all possible *getCollectionDetails* parameters. ```ts type CollectionDetailsRequest = { objectNumber: string; format?: Format; } ``` | Parameter | Type | Required | Default | | ------------ | ------ | :------: | ------- | | objectNumber | string | Yes | | | format | Format | | json | ##### CollectionDetailsResponse This **type** handles *getCollectionDetails* response. ```ts type CollectionDetailsResponse = { elapsedMilliseconds: number; artObject: ArtObjectDetails; artObjectPage: ArtObjectPage; } ``` #### getCollectionImage *Description* This **method** handles `GET /api/[culture]/collection/[object-number]/tiles` REST API. *Prototype* ```ts async getCollectionImage(params:CollectionImageRequst) : Promise<Result<CollectionImageResponse>> ``` ##### CollectionImageRequest This **type** handles all possible *getCollectionImage* parameters. ```ts type CollectionImageRequest = { objectNumber: string; } ``` | Parameter | Type | Required | Default | | ------------ | ------ | :------: | ------- | | objectNumber | string | Yes | | ##### CollectionImageResponse This **type** handles *getCollectionImage* response. ```ts type CollectionImageResponse = { levels: Level[]; } ``` ## Types In order to implement all features, the following common types have been implemended: ### Result This **type** is a discriminated union that handles all REST APIs responses. ```ts export type Result<T extends Response> = | { success: true; data: T; } | { success: false; error: string; }; ``` ### ArtObject This **type** has the following structure: ```ts type ArtObject = { links: Link; id: string; objectNumber: string; title: string; hasImage: boolean; principalOrFirstMaker: string; longTitle: string; showImage: boolean; permitDownload: boolean; webImage?: Image; headerImage?: Image; productionPlaces: string[]; }; ``` ### ArtObjectDetails This **type** extends *ArtObject* with the following addon fields: ```ts export type ArtObjectDetails = { priref: string; language: Culture; copyrightHolder?: string; colors: Color[]; colorsWithNormalization: ColorNormalization[]; normalizedColors: Color[]; normalized32Colors: Color[]; materialsThesaurus: string[]; techniquesThesaurus: string[]; productionPlacesThesaurus: string[]; titles: string[]; description: string; labelText?: string; objectTypes: string[]; objectCollection: string[]; makers: string[]; } & ArtObject; ``` ### ArtObjectPage This **type** handles *ArtObjectPage* properties. ```ts type ArtObjectPage = { id: string; similarPages: string[]; lang: Culture; objectNumber: string; tags: string[]; plaqueDescription: string; audioFile1?: string; audioFileLabel1?: string; audioFileLabel2?: string; createdOn: string; updatedOn: string; adlibOverrides: Override; }; ``` ### Color This **type** handles *ArtObjectDetails* color properties. ```ts type Color = { percentage: number; hex: string; }; ``` ### CountFacets This **type** has the following definition: ```ts type CountFacets = { hasimage: number; ondisplay: number; }; ``` ### Culture This **type** contains all supported cultures. ```ts type Culture = "en | nl" ``` ### Facet This **type** contains facet properties. ```ts type Facet = { facets: FacetValue[]; name: string; otherTerms: number; prettyName: number; }; ``` ### FacetValue This **type** contains facet key / value pairs for *Facet* type. ```ts type FacetValue = { key: string; value: number; }; ``` ### Format This **type** contains all supported APU repsonse types. ```ts type Format = "json" | "jsonp" | "xml"; ``` ### Image This **type** contains all images properties. ```ts type Image = { guid: string; offsetPercentageX: number; offsetPercentageY: number; width: number; height: number; url: string; }; ``` ### Lavel This **type** contains level properties. ```ts type Level = { name: string; width: number; height: number; tiles: Tile[]; }; ``` ### Link This **type** contains link properties. ```ts type Link = { self?: string; web?: string; search?: string; }; ``` ### Override This **type** handles optional overrides in *ArtObjectPage* type. ```ts type Override = { titel?: string; maker?: string; etiketText?: string; }; ``` ### Rsponse This union **type** contains all possible API repsonse types. ```ts export type Response = | CollectionResponse | CollectionDetailsResponse | CollectionImageResponse; ``` ### Sort **Sort** type contains all supported sorting criterias. ```ts type Sort = | "relevance" | "objectYype" | "chronologic" | "achronologic" | "artist" | "artistDesc" ``` ### Tile This **type** contains all tile properties. ```ts type Tile = { x: number; y: number; url: string; }; ``` ## Authors * **Mario Lazzari** - *Initial work* ## Links * Demo [app](https://www.mariolazzari.it/hobbies/art/rijks) * My personal [site](https://mariolazzari.it) * My [github](https://github.com/mariolazzari) profile * Rijksmuseum API [documentation](https://data.rijksmuseum.nl/object-metadata/api)