Moved v3 code from NginxProxyManager/nginx-proxy-manager-3 to NginxProxyManager/nginx-proxy-manager

This commit is contained in:
Jamie Curnow
2022-05-12 08:47:31 +10:00
parent 4db34f5894
commit 2110ecc382
830 changed files with 38168 additions and 36635 deletions

View File

@@ -0,0 +1,95 @@
import { camelizeKeys, decamelizeKeys } from "humps";
import AuthStore from "modules/AuthStore";
import * as queryString from "query-string";
const contentTypeHeader = "Content-Type";
interface BuildUrlArgs {
url: string;
params?: queryString.StringifiableRecord;
}
function buildUrl({ url, params }: BuildUrlArgs) {
const endpoint = url.replace(/^\/|\/$/g, "");
const apiParams = params ? `?${queryString.stringify(params)}` : "";
const apiUrl = `/api/${endpoint}${apiParams}`;
return apiUrl;
}
function buildAuthHeader(): Record<string, string> | undefined {
if (AuthStore.token) {
return { Authorization: `Bearer ${AuthStore.token.token}` };
}
return {};
}
function buildBody(data?: Record<string, any>) {
if (data) {
return JSON.stringify(decamelizeKeys(data));
}
}
async function processResponse(response: Response) {
const payload = await response.json();
if (!response.ok) {
throw new Error(payload.error.message);
}
return camelizeKeys(payload) as any;
}
interface GetArgs {
url: string;
params?: queryString.StringifiableRecord;
}
export async function get(
{ url, params }: GetArgs,
abortController?: AbortController,
) {
const apiUrl = buildUrl({ url, params });
const method = "GET";
const signal = abortController?.signal;
const headers = buildAuthHeader();
const response = await fetch(apiUrl, { method, headers, signal });
return processResponse(response);
}
interface PostArgs {
url: string;
data?: any;
}
export async function post(
{ url, data }: PostArgs,
abortController?: AbortController,
) {
const apiUrl = buildUrl({ url });
const method = "POST";
const headers = {
...buildAuthHeader(),
[contentTypeHeader]: "application/json",
};
const signal = abortController?.signal;
const body = buildBody(data);
const response = await fetch(apiUrl, { method, headers, body, signal });
return processResponse(response);
}
interface PutArgs {
url: string;
data?: any;
}
export async function put(
{ url, data }: PutArgs,
abortController?: AbortController,
) {
const apiUrl = buildUrl({ url });
const method = "PUT";
const headers = {
...buildAuthHeader(),
[contentTypeHeader]: "application/json",
};
const signal = abortController?.signal;
const body = buildBody(data);
const response = await fetch(apiUrl, { method, headers, body, signal });
return processResponse(response);
}

View File

@@ -0,0 +1,16 @@
import * as api from "./base";
import { CertificateAuthority } from "./models";
export async function createCertificateAuthority(
data: CertificateAuthority,
abortController?: AbortController,
): Promise<CertificateAuthority> {
const { result } = await api.post(
{
url: "/certificate-authorities",
data,
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,16 @@
import * as api from "./base";
import { DNSProvider } from "./models";
export async function createDNSProvider(
data: DNSProvider,
abortController?: AbortController,
): Promise<DNSProvider> {
const { result } = await api.post(
{
url: "/dns-providers",
data,
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,30 @@
import * as api from "./base";
import { User } from "./models";
export interface AuthOptions {
type: string;
secret: string;
}
export interface NewUser {
name: string;
nickname: string;
email: string;
isDisabled: boolean;
auth: AuthOptions;
capabilities: string[];
}
export async function createUser(
data: NewUser,
abortController?: AbortController,
): Promise<User> {
const { result } = await api.post(
{
url: "/users",
data,
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,19 @@
import * as api from "./base";
import { CertificateAuthoritiesResponse } from "./responseTypes";
export async function getCertificateAuthorities(
offset = 0,
limit = 10,
sort?: string,
filters?: { [key: string]: string },
abortController?: AbortController,
): Promise<CertificateAuthoritiesResponse> {
const { result } = await api.get(
{
url: "certificate-authorities",
params: { limit, offset, sort, ...filters },
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,13 @@
import * as api from "./base";
import { CertificateAuthority } from "./models";
export async function getCertificateAuthority(
id: number,
params = {},
): Promise<CertificateAuthority> {
const { result } = await api.get({
url: `/certificate-authorities/${id}`,
params,
});
return result;
}

View File

@@ -0,0 +1,19 @@
import * as api from "./base";
import { CertificatesResponse } from "./responseTypes";
export async function getCertificates(
offset = 0,
limit = 10,
sort?: string,
filters?: { [key: string]: string },
abortController?: AbortController,
): Promise<CertificatesResponse> {
const { result } = await api.get(
{
url: "certificates",
params: { limit, offset, sort, ...filters },
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,13 @@
import * as api from "./base";
import { DNSProvider } from "./models";
export async function getDNSProvider(
id: number,
params = {},
): Promise<DNSProvider> {
const { result } = await api.get({
url: `/dns-providers/${id}`,
params,
});
return result;
}

View File

@@ -0,0 +1,19 @@
import * as api from "./base";
import { DNSProvidersResponse } from "./responseTypes";
export async function getDNSProviders(
offset = 0,
limit = 10,
sort?: string,
filters?: { [key: string]: string },
abortController?: AbortController,
): Promise<DNSProvidersResponse> {
const { result } = await api.get(
{
url: "dns-providers",
params: { limit, offset, sort, ...filters },
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,14 @@
import * as api from "./base";
import { DNSProvidersAcmesh } from "./models";
export async function getDNSProvidersAcmesh(
abortController?: AbortController,
): Promise<DNSProvidersAcmesh[]> {
const { result } = await api.get(
{
url: "dns-providers/acmesh",
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,14 @@
import * as api from "./base";
import { HealthResponse } from "./responseTypes";
export async function getHealth(
abortController?: AbortController,
): Promise<HealthResponse> {
const { result } = await api.get(
{
url: "",
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,19 @@
import * as api from "./base";
import { HostTemplatesResponse } from "./responseTypes";
export async function getHostTemplates(
offset = 0,
limit = 10,
sort?: string,
filters?: { [key: string]: string },
abortController?: AbortController,
): Promise<HostTemplatesResponse> {
const { result } = await api.get(
{
url: "host-templates",
params: { limit, offset, sort, ...filters },
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,19 @@
import * as api from "./base";
import { HostsResponse } from "./responseTypes";
export async function getHosts(
offset = 0,
limit = 10,
sort?: string,
filters?: { [key: string]: string },
abortController?: AbortController,
): Promise<HostsResponse> {
const { result } = await api.get(
{
url: "hosts",
params: { limit, offset, sort, expand: "user,certificate", ...filters },
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,19 @@
import * as api from "./base";
import { SettingsResponse } from "./responseTypes";
export async function getSettings(
offset = 0,
limit = 10,
sort?: string,
filters?: { [key: string]: string },
abortController?: AbortController,
): Promise<SettingsResponse> {
const { result } = await api.get(
{
url: "settings",
params: { limit, offset, sort, ...filters },
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,24 @@
import * as api from "./base";
import { TokenResponse } from "./responseTypes";
interface Options {
payload: {
type: string;
identity: string;
secret: string;
};
}
export async function getToken(
{ payload }: Options,
abortController?: AbortController,
): Promise<TokenResponse> {
const { result } = await api.post(
{
url: "/tokens",
data: payload,
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,14 @@
import * as api from "./base";
import { User } from "./models";
export async function getUser(
id: number | string = "me",
params = {},
): Promise<User> {
const userId = id ? id : "me";
const { result } = await api.get({
url: `/users/${userId}`,
params,
});
return result;
}

View File

@@ -0,0 +1,19 @@
import * as api from "./base";
import { UsersResponse } from "./responseTypes";
export async function getUsers(
offset = 0,
limit = 10,
sort?: string,
filters?: { [key: string]: string },
abortController?: AbortController,
): Promise<UsersResponse> {
const { result } = await api.get(
{
url: "users",
params: { limit, offset, sort, expand: "capabilities", ...filters },
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,34 @@
import { decamelize } from "humps";
/**
* This will convert a react-table sort object into
* a string that the backend api likes:
* name.asc,id.desc
*/
export function tableSortToAPI(sortBy: any): string | undefined {
if (sortBy?.length > 0) {
const strs: string[] = [];
sortBy.map((item: any) => {
strs.push(decamelize(item.id) + "." + (item.desc ? "desc" : "asc"));
return undefined;
});
return strs.join(",");
}
return;
}
/**
* This will convert a react-table filters object into
* a string that the backend api likes:
* name:contains=jam
*/
export function tableFiltersToAPI(filters: any): { [key: string]: string } {
const items: { [key: string]: string } = {};
if (filters?.length > 0) {
filters.map((item: any) => {
items[`${decamelize(item.id)}:${item.value.modifier}`] = item.value.value;
return undefined;
});
}
return items;
}

View File

@@ -0,0 +1,24 @@
export * from "./createCertificateAuthority";
export * from "./createDNSProvider";
export * from "./createUser";
export * from "./getCertificateAuthorities";
export * from "./getCertificateAuthority";
export * from "./getCertificates";
export * from "./getDNSProvider";
export * from "./getDNSProviders";
export * from "./getDNSProvidersAcmesh";
export * from "./getHealth";
export * from "./getHosts";
export * from "./getHostTemplates";
export * from "./getSettings";
export * from "./getToken";
export * from "./getUser";
export * from "./getUsers";
export * from "./helpers";
export * from "./models";
export * from "./refreshToken";
export * from "./responseTypes";
export * from "./setAuth";
export * from "./setCertificateAuthority";
export * from "./setDNSProvider";
export * from "./setUser";

View File

@@ -0,0 +1,123 @@
export interface Sort {
field: string;
direction: "ASC" | "DESC";
}
export interface UserAuth {
id: number;
userId: number;
type: string;
createdOn: number;
updatedOn: number;
}
export interface User {
id: number;
name: string;
nickname: string;
email: string;
createdOn: number;
updatedOn: number;
gravatarUrl: string;
isDisabled: boolean;
notifications: Notification[];
capabilities?: string[];
auth?: UserAuth;
}
export interface Notification {
title: string;
seen: boolean;
}
export interface Setting {
id: number;
createdOn: number;
modifiedOn: number;
name: string;
value: any;
}
// TODO: copy pasta not right
export interface Certificate {
id: number;
createdOn: number;
modifiedOn: number;
name: string;
acmeshServer: string;
caBundle: string;
maxDomains: number;
isWildcardSupported: boolean;
isSetup: boolean;
}
export interface CertificateAuthority {
id: number;
createdOn: number;
modifiedOn: number;
name: string;
acmeshServer: string;
caBundle: string;
maxDomains: number;
isWildcardSupported: boolean;
isReadonly: boolean;
}
export interface DNSProvider {
id: number;
createdOn: number;
modifiedOn: number;
userId: number;
name: string;
acmeshName: string;
dnsSleep: number;
meta: any;
}
export interface DNSProvidersAcmeshField {
name: string;
type: string;
metaKey: string;
isRequired: boolean;
isSecret: boolean;
}
export interface DNSProvidersAcmesh {
name: string;
acmeshName: string;
fields: DNSProvidersAcmeshField[];
}
export interface Host {
id: number;
createdOn: number;
modifiedOn: number;
userId: number;
type: string;
hostTemplateId: number;
listenInterface: number;
domainNames: string[];
upstreamId: number;
certificateId: number;
accessListId: number;
sslForced: boolean;
cachingEnabled: boolean;
blockExploits: boolean;
allowWebsocketUpgrade: boolean;
http2Support: boolean;
hstsEnabled: boolean;
hstsSubdomains: boolean;
paths: string;
upstreamOptions: string;
advancedConfig: string;
isDisabled: boolean;
}
export interface HostTemplate {
id: number;
createdOn: number;
modifiedOn: number;
userId: number;
hostType: string;
template: string;
}

View File

@@ -0,0 +1,14 @@
import * as api from "./base";
import { TokenResponse } from "./responseTypes";
export async function refreshToken(
abortController?: AbortController,
): Promise<TokenResponse> {
const { result } = await api.get(
{
url: "/tokens",
},
abortController,
);
return result;
}

View File

@@ -0,0 +1,58 @@
import {
Certificate,
CertificateAuthority,
DNSProvider,
Host,
HostTemplate,
Setting,
Sort,
User,
} from "./models";
export interface BaseResponse {
total: number;
offset: number;
limit: number;
sort: Sort[];
}
export interface HealthResponse {
commit: string;
errorReporting: boolean;
healthy: boolean;
setup: boolean;
version: string;
}
export interface TokenResponse {
expires: number;
token: string;
}
export interface SettingsResponse extends BaseResponse {
items: Setting[];
}
export interface CertificatesResponse extends BaseResponse {
items: Certificate[];
}
export interface CertificateAuthoritiesResponse extends BaseResponse {
items: CertificateAuthority[];
}
export interface UsersResponse extends BaseResponse {
items: User[];
}
export interface DNSProvidersResponse extends BaseResponse {
items: DNSProvider[];
}
export interface HostsResponse extends BaseResponse {
items: Host[];
}
export interface HostTemplatesResponse extends BaseResponse {
items: HostTemplate[];
}

View File

@@ -0,0 +1,18 @@
import * as api from "./base";
import { UserAuth } from "./models";
export async function setAuth(
id: number | string = "me",
data: any,
): Promise<UserAuth> {
const userId = id ? id : "me";
if (data.id) {
delete data.id;
}
const { result } = await api.post({
url: `/users/${userId}/auth`,
data,
});
return result;
}

View File

@@ -0,0 +1,17 @@
import * as api from "./base";
import { CertificateAuthority } from "./models";
export async function setCertificateAuthority(
id: number,
data: any,
): Promise<CertificateAuthority> {
if (data.id) {
delete data.id;
}
const { result } = await api.put({
url: `/certificate-authorities/${id}`,
data,
});
return result;
}

View File

@@ -0,0 +1,17 @@
import * as api from "./base";
import { DNSProvider } from "./models";
export async function setDNSProvider(
id: number,
data: any,
): Promise<DNSProvider> {
if (data.id) {
delete data.id;
}
const { result } = await api.put({
url: `/dns-providers/${id}`,
data,
});
return result;
}

View File

@@ -0,0 +1,18 @@
import * as api from "./base";
import { User } from "./models";
export async function setUser(
id: number | string = "me",
data: any,
): Promise<User> {
const userId = id ? id : "me";
if (data.id) {
delete data.id;
}
const { result } = await api.put({
url: `/users/${userId}`,
data,
});
return result;
}