Skip to content

Commit

Permalink
Support OAuth Application Endpoints [AHOY-3610] (#2526)
Browse files Browse the repository at this point in the history
* support oauth application endpoints
  • Loading branch information
Annmary12 authored Jan 30, 2025
1 parent 6a938fa commit 9e4a4ce
Show file tree
Hide file tree
Showing 12 changed files with 662 additions and 0 deletions.
2 changes: 2 additions & 0 deletions lib/adapters/REST/endpoints/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import * as Locale from './locale'
import * as Organization from './organization'
import * as OrganizationInvitation from './organization-invitation'
import * as OrganizationMembership from './organization-membership'
import * as OAuthApplication from './oauth-application'
import * as PersonalAccessToken from './personal-access-token'
import * as PreviewApiKey from './preview-api-key'
import * as Release from './release'
Expand Down Expand Up @@ -97,6 +98,7 @@ export default {
Organization,
OrganizationInvitation,
OrganizationMembership,
OAuthApplication,
PersonalAccessToken,
AccessToken,
PreviewApiKey,
Expand Down
196 changes: 196 additions & 0 deletions lib/adapters/REST/endpoints/oauth-application.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
import type { RawAxiosRequestHeaders } from 'axios'
import type { AxiosInstance } from 'contentful-sdk-core'
import type {
CursorPaginatedCollectionProp,
GetOAuthApplicationParams,
GetUserParams,
QueryParams,
} from '../../../common-types'
import type { RestEndpoint } from '../types'
import * as raw from './raw'
import type {
OAuthApplicationProps,
CreateOAuthApplicationProps,
UpdateOAuthApplicationProps,
} from '../../../entities/oauth-application'

/**
* Retrieves details of a specific OAuth application. by its unique user ID and oauth application ID.
*
* @param {AxiosInstance} http - An Axios HTTP client instance.
* @param {Object} params - Parameters for the request.
* @param {string} params.userId - The unique user ID of the user.
* @param {string} params.oauthApplicationId - The unique application ID of the OAuth application.
* @returns {Promise<OAuthApplicationProps>} A Promise that resolves with the retrieved OAuth Application.
* @example ```javascript
* const contentful = require('contentful-management')
*
* const plainClient = contentful.createClient(
* {
* accessToken: '<content_management_api_key>'
* },
* { type: 'plain' }
* )
* plainClient.get({userId: 'TestUserId', oauthApplicationId: 'TestOAuthAppId'})
* .then(oauthApplication => console.log(oauthApplication))
* .catch(console.error)
* ```
*/
export const get: RestEndpoint<'OAuthApplication', 'get'> = (
http: AxiosInstance,
params: GetOAuthApplicationParams
) => {
return raw.get<OAuthApplicationProps>(
http,
`/users/${params.userId}/oauth_applications/${params.oauthApplicationId}`
)
}

/**
* Retrieves a list of OAuth applications associated with the current user.
*
* @param {AxiosInstance} http - An Axios HTTP client instance.
* @param {Object} params - Parameters for the request.
* @param {string} params.userId - The unique user ID of the user.
* @param {QueryParams} params - Query parameters to filter and customize the request.
* @returns {Promise<CursorPaginatedCollectionProp<OAuthApplicationProps>>} A Promise that resolves with a collection of oauth application properties.
* @example ```javascript
* const contentful = require('contentful-management')
*
* const plainClient = contentful.createClient(
* {
* accessToken: '<content_management_api_key>'
* },
* { type: 'plain' }
* )
* plainClient.getManyForUser({userId: 'TestUserId'})
* .then(result => console.log(result.items))
* .catch(console.error)
* ```
*/
export const getManyForUser: RestEndpoint<'OAuthApplication', 'getManyForUser'> = (
http: AxiosInstance,
params: GetUserParams & QueryParams
) => {
return raw.get<CursorPaginatedCollectionProp<OAuthApplicationProps>>(
http,
`/users/${params.userId}/oauth_applications`,
{
params: params.query,
}
)
}

/**
* Creates a new OAuth application for current authenticated user.
*
* @param {AxiosInstance} http - Axios instance for making the HTTP request.
* @param {Object} params - Parameters for the request.
* @param {string} params.userId - The unique user ID of the user.
* @param {RawAxiosRequestHeaders} [headers] - Optional HTTP headers for the request.
* @returns {Promise<OAuthApplicationProps>} A Promise that resolves with the created oauth application.
* @example ```javascript
* const contentful = require('contentful-management')
*
* const plainClient = contentful.createClient(
* {
* accessToken: '<content_management_api_key>',
* },
* { type: 'plain' }
* )
* plainClient.create(
* {userId: 'TestUserId'},
* {name: 'Test-Name', description: 'Test-Desc', scopes: ['content_management_manage'], redirectUri: 'https://redirect.uri.com', confidential: true}
* )
* .then(oauthApplication => console.log(oauthApplication))
* .catch(console.error)
* ```
*/
export const create: RestEndpoint<'OAuthApplication', 'create'> = (
http: AxiosInstance,
params: GetUserParams,
rawData: CreateOAuthApplicationProps,
headers?: RawAxiosRequestHeaders
) => {
return raw.post<OAuthApplicationProps>(
http,
`/users/${params.userId}/oauth_applications`,
rawData,
{
headers,
}
)
}

/**
* Updates details of a specific OAuth application.
*
* @param {AxiosInstance} http - The Axios HTTP client instance.
* @param {Object} params - The parameters for updating oauth application.
* @param {string} params.userId - The unique user ID of the user.
* @param {string} params.oauthApplicationId - The unique application ID of the OAuth application.
* @returns {Promise<OAuthApplicationProps>} A Promise that resolves with the updated oauth application.
* @example ```javascript
* const contentful = require('contentful-management')
*
* const plainClient = contentful.createClient(
* {
* accessToken: '<content_management_api_key>'
* },
* { type: 'plain' }
* )
* plainClient.update(
* {userId: 'TestUserId', oauthApplicationId: 'TestOAuthAppId'},
* {name: 'Test-Name', description: 'Test-Desc', scope: ['content_management_manage'], redirectUri: 'https://redirect.uri.com', confidential: true}
* )
* .then(oauthApplication => console.log(oauthApplication))
* .catch(console.error)
* ```
*/
export const update: RestEndpoint<'OAuthApplication', 'update'> = (
http: AxiosInstance,
params: GetOAuthApplicationParams,
rawData: UpdateOAuthApplicationProps,
headers?: RawAxiosRequestHeaders
) => {
return raw.put<OAuthApplicationProps>(
http,
`/users/${params.userId}/oauth_applications/${params.oauthApplicationId}`,
rawData,
{
headers,
}
)
}

/**
* Deletes a specific OAuth application.
*
* @param {AxiosInstance} http - The Axios HTTP client instance.
* @param {Object} params - The parameters for deleting oauth application.
* @param {string} params.userId - The unique user ID of the user.
* @param {string} params.oauthApplicationId - The unique application ID of the OAuth application.
* @returns {Promise<void>}
* @example ```javascript
* const contentful = require('contentful-management')
*
* const plainClient = contentful.createClient(
* {
* accessToken: '<content_management_api_key>'
* },
* { type: 'plain' }
* )
* plainClient.del({userId: 'TestUserId', oauthApplicationId: 'TestOAuthAppId'}) })
* .then(result => console.log(result.items))
* .catch(console.error)
* ```
*/
export const del: RestEndpoint<'OAuthApplication', 'delete'> = (
http: AxiosInstance,
params: GetOAuthApplicationParams
) => {
return raw.del<void>(
http,
`/users/${params.userId}/oauth_applications/${params.oauthApplicationId}`
)
}
37 changes: 37 additions & 0 deletions lib/common-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,11 @@ import type {
WorkflowsChangelogEntryProps,
WorkflowsChangelogQueryOptions,
} from './entities/workflows-changelog-entry'
import type {
CreateOAuthApplicationProps,
OAuthApplicationProps,
UpdateOAuthApplicationProps,
} from './entities/oauth-application'
import type { FunctionLogProps } from './entities/function-log'

export interface DefaultElements<TPlainObject extends object = object> {
Expand Down Expand Up @@ -635,6 +640,15 @@ type MRInternal<UA extends boolean> = {
'getManyForOrganization'
>

(opts: MROpts<'OAuthApplication', 'get', UA>): MRReturn<'OAuthApplication', 'get'>
(opts: MROpts<'OAuthApplication', 'getManyForUser', UA>): MRReturn<
'OAuthApplication',
'getManyForUser'
>
(opts: MROpts<'OAuthApplication', 'create', UA>): MRReturn<'OAuthApplication', 'create'>
(opts: MROpts<'OAuthApplication', 'update', UA>): MRReturn<'OAuthApplication', 'update'>
(opts: MROpts<'OAuthApplication', 'delete', UA>): MRReturn<'OAuthApplication', 'delete'>

(opts: MROpts<'PreviewApiKey', 'get', UA>): MRReturn<'PreviewApiKey', 'get'>
(opts: MROpts<'PreviewApiKey', 'getMany', UA>): MRReturn<'PreviewApiKey', 'getMany'>

Expand Down Expand Up @@ -1676,6 +1690,26 @@ export type MRActions = {
return: CollectionProp<AccessTokenProps>
}
}
OAuthApplication: {
get: { params: GetOAuthApplicationParams; return: OAuthApplicationProps }
getManyForUser: {
params: GetUserParams & QueryParams
return: CursorPaginatedCollectionProp<OAuthApplicationProps>
}
create: {
params: GetUserParams
payload: CreateOAuthApplicationProps
headers?: RawAxiosRequestHeaders
return: OAuthApplicationProps
}
update: {
params: GetOAuthApplicationParams
payload: UpdateOAuthApplicationProps
headers?: RawAxiosRequestHeaders
return: OAuthApplicationProps
}
delete: { params: GetOAuthApplicationParams; return: void }
}
PreviewApiKey: {
get: { params: GetSpaceParams & { previewApiKeyId: string }; return: PreviewApiKeyProps }
getMany: { params: GetSpaceParams & QueryParams; return: CollectionProp<PreviewApiKeyProps> }
Expand Down Expand Up @@ -2276,6 +2310,9 @@ export type CursorPaginationXORParams = {
export type CursorBasedParams = CursorPaginationXORParams
export type AcceptsQueryParams = { query?: AcceptsQueryOptions }

export type GetOAuthApplicationParams = { userId: string; oauthApplicationId: string }
export type GetUserParams = { userId: string }

export enum ScheduledActionReferenceFilters {
contentTypeAnnotationNotIn = 'sys.contentType.metadata.annotations.ContentType[nin]',
}
94 changes: 94 additions & 0 deletions lib/create-contentful-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import type {
CursorPaginatedCollection,
GetEnvironmentTemplateParams,
BasicCursorPaginationOptions,
GetOAuthApplicationParams,
GetUserParams,
} from './common-types'
import entities from './entities'
import type { Organization, OrganizationProps } from './entities/organization'
Expand All @@ -23,6 +25,11 @@ import type {
EnvironmentTemplateProps,
} from './entities/environment-template'
import type { RawAxiosRequestConfig } from 'axios'
import type {
CreateOAuthApplicationProps,
OAuthApplication,
OAuthApplicationProps,
} from './export-types'

export type ClientAPI = ReturnType<typeof createClientApi>
type CreateSpaceProps = Omit<SpaceProps, 'sys'> & { defaultLocale?: string }
Expand All @@ -41,6 +48,7 @@ export default function createClientApi(makeRequest: MakeRequest) {
const { wrapAppDefinition } = entities.appDefinition
const { wrapEnvironmentTemplate, wrapEnvironmentTemplateCollection } =
entities.environmentTemplate
const { wrapOAuthApplication, wrapOAuthApplicationCollection } = entities.oauthApplication

return {
/**
Expand Down Expand Up @@ -291,6 +299,92 @@ export default function createClientApi(makeRequest: MakeRequest) {
}).then((data) => wrapUser<T>(makeRequest, data))
},

/**
*
* @param params
* @returns Promise of a OAuthApplication
* @example ```javascript
* const contentful = require('contentful-management')
*
* const client = contentful.createClient({
* accessToken: '<content_management_api_key>'
* })
*
* client.getOAuthApplication({
* userId: '<user_id>'
* oauthApplicationId: '<oauth_application_id>'
* }).then(oauthApplication => console.log(oauthApplication))
* .catch(console.error)
*/
getOAuthApplication: function getOAuthApplication(
params: GetOAuthApplicationParams
): Promise<OAuthApplicationProps> {
const { userId } = params
return makeRequest({
entityType: 'OAuthApplication',
action: 'get',
params,
}).then((data) => wrapOAuthApplication(makeRequest, data, userId))
},

/**
*
* @param params
* @returns Promise of list of user's OAuthApplications
* @example ```javascript
* const contentful = require('contentful-management')
*
* const client = contentful.createClient({
* accessToken: '<content_management_api_key>'
* })
*
* client.getOAuthApplications({
* userId: '<user_id>'}).then(oauthApplications => console.log(oauthApplications))
* .catch(console.error)
*/
getOAuthApplications: function getOAuthApplications(
params: GetUserParams & QueryParams
): Promise<CursorPaginatedCollection<OAuthApplication, OAuthApplicationProps>> {
const { userId } = params
return makeRequest({
entityType: 'OAuthApplication',
action: 'getManyForUser',
params,
}).then((data) => wrapOAuthApplicationCollection(makeRequest, data, userId))
},

/**
*
* @param params
* @returns Promise of a new OAuth application.
* @example ```javascript
* const contentful = require('contentful-management')
*
* const client = contentful.createClient({
* accessToken: '<content_management_api_key>'
* })
*
* client.createOAuthApplication({
* userId: '<user_id>'},
* { name: '<name>',
* description: '<description>',
* scopes: ['scope'],
* redirectUri: '<redirectUri>',
* confidential: '<true/false>'}).then(oauthApplications => console.log(oauthApplications))
* .catch(console.error)
*/
createOAuthApplication: function createOAuthApplication(
params: GetUserParams,
rawData: CreateOAuthApplicationProps
): Promise<OAuthApplicationProps> {
const { userId } = params
return makeRequest({
entityType: 'OAuthApplication',
action: 'create',
params,
payload: rawData,
}).then((data) => wrapOAuthApplication(makeRequest, data, userId))
},
/**
* Gets App Definition
* @return Promise for App Definition
Expand Down
Loading

0 comments on commit 9e4a4ce

Please sign in to comment.