Skip to content

Commit

Permalink
Merge pull request #8 from surmon-china/v0.3.0
Browse files Browse the repository at this point in the history
feat: v0.3.0
  • Loading branch information
surmon-china committed Nov 23, 2022
2 parents 26dbcc2 + 67a383f commit df39e13
Show file tree
Hide file tree
Showing 9 changed files with 2,594 additions and 2,120 deletions.
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,24 @@

All notable changes to this project will be documented in this file.

### v0.3.0 (2022-11-24)

**Breaking Change**

- Upgrade axios to `1.x` ([Cannot find name 'ProgressEvent'](https://github.com/axios/axios/issues/5297))
- Upgrade mongodb to `4.12.x`
- Upgrade [url endpoint to v1](https://www.mongodb.com/docs/atlas/api/data-api-resources/#base-url)
- Add `cloud` provider config
- Remove built-in `regions`

**Fix**

- [#6 `error.toJSON` is not a function](https://github.com/surmon-china/mongodb-data-api/issues/6)

**Chore**

- Upgrade deps

### v0.2.1 (2022-11-19)

**Fix**
Expand Down
35 changes: 18 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
 
[![GitHub license](https://img.shields.io/github/license/surmon-china/mongodb-data-api.svg?style=for-the-badge)](/LICENSE)

MongoDB Atlas [Data API](https://docs.atlas.mongodb.com/api/data-api/) SDK for Node.js.
MongoDB Atlas [Data API](https://www.mongodb.com/docs/atlas/api/data-api/) SDK for Node.js.

---

Expand All @@ -33,12 +33,12 @@ yarn add mongodb-data-api
#### Init

```ts
import { createMongoDBDataAPI, Region } from 'mongodb-data-api'
import { createMongoDBDataAPI } from 'mongodb-data-api'

// init by URL Endpoint
const api = createMongoDBDataAPI({
apiKey: '<your_mongodb_api_key>',
urlEndpoint: 'https://data.mongodb-api.com/app/<your_mongodb_app_id>/endpoint/data/beta'
urlEndpoint: 'https://data.mongodb-api.com/app/<your_mongodb_app_id>/endpoint/data/v1'
})

// or init by app ID
Expand All @@ -47,28 +47,29 @@ const api = createMongoDBDataAPI({
appId: '<your_mongodb_app_id>'
})

// specific region of app
// specific region and cloud of app
const api = createMongoDBDataAPI({
apiKey: '<your_mongodb_api_key>',
appId: '<your_mongodb_app_id>',
region: Region.Virginia
region: '<your_mongodb_app_region>', // e.g. us-east-1
cloud: '<your_mongodb_app_cloud>' // e.g. aws
})
```

#### Actions

See [MongoDB Data API Resources](https://docs.atlas.mongodb.com/api/data-api-resources/).
See [MongoDB Data API Resources](https://www.mongodb.com/docs/atlas/api/data-api-resources/).

- [`api.findOne`](https://docs.atlas.mongodb.com/api/data-api-resources/#find-a-single-document)
- [`api.find`](https://docs.atlas.mongodb.com/api/data-api-resources/#find-multiple-documents)
- [`api.insertOne`](https://docs.atlas.mongodb.com/api/data-api-resources/#insert-a-single-document)
- [`api.insertMany`](https://docs.atlas.mongodb.com/api/data-api-resources/#insert-multiple-documents)
- [`api.updateOne`](https://docs.atlas.mongodb.com/api/data-api-resources/#update-a-single-document)
- [`api.updateMany`](https://docs.atlas.mongodb.com/api/data-api-resources/#update-multiple-documents)
- [`api.replaceOne`](https://docs.atlas.mongodb.com/api/data-api-resources/#replace-a-single-document)
- [`api.deleteOne`](https://docs.atlas.mongodb.com/api/data-api-resources/#delete-a-single-document)
- [`api.deleteMany`](https://docs.atlas.mongodb.com/api/data-api-resources/#delete-multiple-documents)
- [`api.aggregate`](https://docs.atlas.mongodb.com/api/data-api-resources/#run-an-aggregation-pipeline)
- [`API.findOne`](https://www.mongodb.com/docs/atlas/api/data-api-resources/#find-a-single-document)
- [`API.find`](https://www.mongodb.com/docs/atlas/api/data-api-resources/#find-multiple-documents)
- [`API.insertOne`](https://www.mongodb.com/docs/atlas/api/data-api-resources/#insert-a-single-document)
- [`API.insertMany`](https://www.mongodb.com/docs/atlas/api/data-api-resources/#insert-multiple-documents)
- [`API.updateOne`](https://www.mongodb.com/docs/atlas/api/data-api-resources/#update-a-single-document)
- [`API.updateMany`](https://www.mongodb.com/docs/atlas/api/data-api-resources/#update-multiple-documents)
- [`API.replaceOne`](https://www.mongodb.com/docs/atlas/api/data-api-resources/#replace-a-single-document)
- [`API.deleteOne`](https://www.mongodb.com/docs/atlas/api/data-api-resources/#delete-a-single-document)
- [`API.deleteMany`](https://www.mongodb.com/docs/atlas/api/data-api-resources/#delete-multiple-documents)
- [`API.aggregate`](https://www.mongodb.com/docs/atlas/api/data-api-resources/#run-an-aggregation-pipeline)

#### Action examples

Expand Down Expand Up @@ -159,7 +160,7 @@ api.findOne<C>({

#### Specific Action

You can specific the action request to prevent this package from lagging relative to the official one.
You can specify the action request to prevent this package from lagging relative to the official one.

```ts
api.$$action('findOne', {
Expand Down
27 changes: 14 additions & 13 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mongodb-data-api",
"version": "0.2.1",
"version": "0.3.0",
"description": "MongoDB atlas data API SDK for Node.js",
"author": "Surmon",
"license": "MIT",
Expand Down Expand Up @@ -32,20 +32,21 @@
"release": ". ./scripts/release.sh"
},
"dependencies": {
"axios": "^0.25.0",
"mongodb": "^4.0.0"
"axios": "^1.1.0",
"mongodb": "^4.12.0"
},
"devDependencies": {
"@surmon-china/libundler": "^2.2.0",
"@types/jest": "^27.4.0",
"@typescript-eslint/eslint-plugin": "^5.9.1",
"@typescript-eslint/parser": "^5.9.1",
"eslint": "^8.7.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0",
"jest": "^27.4.7",
"@surmon-china/libundler": "^2.3.0",
"@types/jest": "^29.2.0",
"@types/node": "^18.11.9",
"@typescript-eslint/eslint-plugin": "^5.44.0",
"@typescript-eslint/parser": "^5.44.0",
"eslint": "^8.28.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.2.0",
"jest": "^29.3.0",
"prettier": "^2.5.1",
"ts-jest": "^27.1.3",
"typescript": "^4.5.4"
"ts-jest": "^29.0.0",
"typescript": "^4.9.0"
}
}
95 changes: 52 additions & 43 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,6 @@ type AnyKeys<T> = { [P in keyof T]?: T[P] | any }
type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never }
type XOR<T, U> = T | U extends object ? (Without<T, U> & U) | (Without<U, T> & T) : T | U

/**
* Specific region of endpoint.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#regional-requests
*/
export enum Region {
Virginia = 'us-east-1',
Oregon = 'us-west-2',
Ireland = 'eu-west-1',
Sydney = 'ap-southeast-2'
}

// https://docs.atlas.mongodb.com/api/data-api-resources/#base-url
const getUrlEndpoint = (appId: string, region?: Region) => {
return region
? `https://${region}.aws.data.mongodb-api.com/app/${appId}/endpoint/data/beta`
: `https://data.mongodb-api.com/app/${appId}/endpoint/data/beta`
}
const getActionUrl = (endpoint: string, action: string) => {
return `${endpoint}/action/${action}`
}

type ExtendBaseParams<T> = BaseParams & T
interface BaseParams {
dataSource?: string
Expand All @@ -43,24 +22,35 @@ interface BaseParams {
interface BaseConfig {
/**
* Specific Data API key.
* @link https://docs.atlas.mongodb.com/api/data-api/#2.-create-a-data-api-key
* @link https://www.mongodb.com/docs/atlas/api/data-api/#2.-create-a-data-api-key
*/
apiKey: string
}

interface UrlEndpointConfig extends BaseConfig {
/**
* Specific URL Endpoint.
* @link https://docs.atlas.mongodb.com/api/data-api/#3.-send-a-data-api-request
* @link https://www.mongodb.com/docs/atlas/api/data-api/#3.-send-a-data-api-request
*/
urlEndpoint: string
}

interface PackEndpointConfig extends BaseConfig {
/**
* Specific Data App ID.
* @link https://docs.atlas.mongodb.com/api/data-api/#3.-send-a-data-api-request
* @link https://www.mongodb.com/docs/atlas/api/data-api/#3.-send-a-data-api-request
*/
appId: string
region?: Region
/**
* Specific region name of endpoint.
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/#regional-requests
*/
region?: string
/**
* Specific cloud provider of endpoint.
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/#regional-requests
*/
cloud?: string
}

export type Config = XOR<UrlEndpointConfig, PackEndpointConfig>
Expand Down Expand Up @@ -116,10 +106,10 @@ export class MongoDBDataAPI<InnerDoc = Document> {

/**
* Execute a API action.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/
*/
public $$action<Result = unknown>(
name: string,
type: string,
params: BaseParams = {},
axiosConfig?: AxiosRequestConfig
): Promise<Result> {
Expand All @@ -132,14 +122,29 @@ export class MongoDBDataAPI<InnerDoc = Document> {
return Promise.reject('Invalid params: dataSource, database, collection')
}

// https://www.mongodb.com/docs/atlas/api/data-api-resources/#base-url
// https://www.mongodb.com/docs/atlas/api/data-api-resources/#regional-requests
const getUrlEndpoint = (appId: string, region?: string, cloud?: string) => {
return region && cloud
? `https://${region}.${cloud}.data.mongodb-api.com/app/${appId}/endpoint/data/v1`
: `https://data.mongodb-api.com/app/${appId}/endpoint/data/v1`
}

const getActionUrl = (endpoint: string, action: string) => {
return `${endpoint}/action/${action}`
}

const API_KEY_FIELD = 'api-key'

return this.#axios({
method: 'post',
data: JSON.stringify(mergedParams),
url: this.#config.urlEndpoint
? getActionUrl(this.#config.urlEndpoint, name)
: getActionUrl(getUrlEndpoint(this.#config.appId!, this.#config.region), name),
? getActionUrl(this.#config.urlEndpoint, type)
: getActionUrl(
getUrlEndpoint(this.#config.appId!, this.#config.region, this.#config.cloud),
type
),
headers: {
'Content-Type': 'application/json',
'Access-Control-Request-Headers': '*',
Expand All @@ -151,16 +156,20 @@ export class MongoDBDataAPI<InnerDoc = Document> {
return response.data
})
.catch((error) => {
// https://docs.atlas.mongodb.com/api/data-api-resources/#error-codes
const errorJSON = error.toJSON()
errorJSON.config.headers[API_KEY_FIELD] = '*****'
return Promise.reject(error.toJSON())
// https://www.mongodb.com/docs/atlas/api/data-api-resources/#error-codes
if (_axios.isAxiosError(error)) {
const errorJSON: any = error.toJSON()
errorJSON.config.headers[API_KEY_FIELD] = '*****'
return Promise.reject(errorJSON)
} else {
return Promise.reject(error)
}
})
}

/**
* Find a Single Document.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#find-a-single-document
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/#find-a-single-document
*/
public findOne<D = InnerDoc, T = NoInfer<D>>(
params?: ExtendBaseParams<{
Expand All @@ -173,7 +182,7 @@ export class MongoDBDataAPI<InnerDoc = Document> {

/**
* Find Multiple Documents.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#find-multiple-documents
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/#find-multiple-documents
*/
public find<D = InnerDoc, T = NoInfer<D>>(
params?: ExtendBaseParams<{
Expand All @@ -189,7 +198,7 @@ export class MongoDBDataAPI<InnerDoc = Document> {

/**
* Insert a Single Document.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#insert-a-single-document
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/#insert-a-single-document
*/
public insertOne<D = InnerDoc, T = NoInfer<D>>(
params: ExtendBaseParams<{ document: AnyKeys<T> | Document }>
Expand All @@ -199,7 +208,7 @@ export class MongoDBDataAPI<InnerDoc = Document> {

/**
* Insert Multiple Documents.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#insert-multiple-documents
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/#insert-multiple-documents
*/
public insertMany<D = InnerDoc, T = NoInfer<D>>(
params: ExtendBaseParams<{ documents: Array<AnyKeys<T> | Document> }>
Expand All @@ -209,7 +218,7 @@ export class MongoDBDataAPI<InnerDoc = Document> {

/**
* Update a Single Document.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#update-a-single-document
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/#update-a-single-document
*/
public updateOne<D = InnerDoc, T = NoInfer<D>>(
params: ExtendBaseParams<{
Expand All @@ -227,7 +236,7 @@ export class MongoDBDataAPI<InnerDoc = Document> {

/**
* Update Multiple Documents.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#update-multiple-documents
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/#update-multiple-documents
*/
public updateMany<D = InnerDoc, T = NoInfer<D>>(
params: ExtendBaseParams<{
Expand All @@ -245,7 +254,7 @@ export class MongoDBDataAPI<InnerDoc = Document> {

/**
* Replace a Single Document.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#replace-a-single-document
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/#replace-a-single-document
*/
public replaceOne<D = InnerDoc, T = NoInfer<D>>(
params: ExtendBaseParams<{
Expand All @@ -263,7 +272,7 @@ export class MongoDBDataAPI<InnerDoc = Document> {

/**
* Delete a Single Document.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#delete-a-single-document
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/#delete-a-single-document
*/
public deleteOne<D = InnerDoc, T = NoInfer<D>>(
params: ExtendBaseParams<{ filter: Filter<T> }>
Expand All @@ -273,7 +282,7 @@ export class MongoDBDataAPI<InnerDoc = Document> {

/**
* Delete Multiple Documents.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#delete-multiple-documents
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/#delete-multiple-documents
*/
public deleteMany<D = InnerDoc, T = NoInfer<D>>(
params: ExtendBaseParams<{ filter: Filter<T> }>
Expand All @@ -283,7 +292,7 @@ export class MongoDBDataAPI<InnerDoc = Document> {

/**
* Run an Aggregation Pipeline.
* @link https://docs.atlas.mongodb.com/api/data-api-resources/#run-an-aggregation-pipeline
* @link https://www.mongodb.com/docs/atlas/api/data-api-resources/#run-an-aggregation-pipeline
*/
public aggregate<T extends Array<any>>(
params: ExtendBaseParams<{ pipeline: Array<Document> }>
Expand Down
6 changes: 3 additions & 3 deletions tests-dts/index.test-d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Document } from 'mongodb'
import { createMongoDBDataAPI, MongoDBDataAPI, Region } from '../src'
import { createMongoDBDataAPI, MongoDBDataAPI } from '../src'
import {
describe,
expectError,
Expand All @@ -23,7 +23,7 @@ describe('Class creator', () => {
// @ts-expect-error
expectError(new MongoDBDataAPI({ apiKey: '', appId: '', urlEndpoint: '' }))
// @ts-expect-error
expectError(new MongoDBDataAPI({ apiKey: '', appId: '', region: '' }))
expectError(new MongoDBDataAPI({ apiKey: '', region: '', cloud: '' }))

// @ts-expect-error
expectError(createMongoDBDataAPI())
Expand All @@ -33,7 +33,7 @@ describe('Class creator', () => {
expectType<MongoDBDataAPI>(api)
expectAssignable<MongoDBDataAPI>(api)

const api2 = new MongoDBDataAPI({ apiKey: '', appId: '', region: Region.Virginia })
const api2 = new MongoDBDataAPI({ apiKey: '', appId: '', region: 'us-east-1' })
expectType<MongoDBDataAPI>(api2)
expectAssignable<MongoDBDataAPI>(api2)
})
Expand Down

0 comments on commit df39e13

Please sign in to comment.