Bootstrap static json applications definition
This commit is contained in:
@@ -1,30 +1,24 @@
|
||||
import { FastifyReply, FastifyRequest } from "fastify";
|
||||
import {
|
||||
CrudException,
|
||||
ExecutionContext,
|
||||
} from "../../../../core/platform/framework/api/crud-service";
|
||||
import { CrudController } from "../../../../core/platform/services/webserver/types";
|
||||
import {
|
||||
PaginationQueryParameters,
|
||||
ResourceCreateResponse,
|
||||
ResourceDeleteResponse,
|
||||
ResourceGetResponse,
|
||||
ResourceListResponse,
|
||||
ResourceUpdateResponse,
|
||||
} from "../../../../utils/types";
|
||||
import Application, {
|
||||
import gr from "../../../global-resolver";
|
||||
import {
|
||||
ApplicationObject,
|
||||
PublicApplicationObject,
|
||||
getApplicationObject,
|
||||
getPublicObject,
|
||||
} from "../../entities/application";
|
||||
import {
|
||||
CrudException,
|
||||
ExecutionContext,
|
||||
Pagination,
|
||||
} from "../../../../core/platform/framework/api/crud-service";
|
||||
import _ from "lodash";
|
||||
import { randomBytes } from "crypto";
|
||||
import { ApplicationEventRequestBody } from "../types";
|
||||
import { logger as log } from "../../../../core/platform/framework";
|
||||
import { hasCompanyAdminLevel } from "../../../../utils/company";
|
||||
import gr from "../../../global-resolver";
|
||||
import config from "../../../../core/config";
|
||||
import axios from "axios";
|
||||
|
||||
export class ApplicationController
|
||||
implements
|
||||
@@ -41,9 +35,7 @@ export class ApplicationController
|
||||
const context = getExecutionContext(request);
|
||||
|
||||
const entity = await gr.services.applications.marketplaceApps.get(
|
||||
{
|
||||
id: request.params.application_id,
|
||||
},
|
||||
request.params.application_id,
|
||||
context,
|
||||
);
|
||||
|
||||
@@ -55,173 +47,7 @@ export class ApplicationController
|
||||
const isAdmin = companyUser && companyUser.role == "admin";
|
||||
|
||||
return {
|
||||
resource: isAdmin ? entity.getApplicationObject() : entity.getPublicObject(),
|
||||
};
|
||||
}
|
||||
|
||||
async list(
|
||||
request: FastifyRequest<{
|
||||
Querystring: PaginationQueryParameters & { search: string };
|
||||
}>,
|
||||
): Promise<ResourceListResponse<PublicApplicationObject>> {
|
||||
const entities = await gr.services.applications.marketplaceApps.list(new Pagination(), {
|
||||
search: request.query.search,
|
||||
});
|
||||
return {
|
||||
resources: entities.getEntities(),
|
||||
next_page_token: entities.nextPage.page_token,
|
||||
};
|
||||
}
|
||||
|
||||
async save(
|
||||
request: FastifyRequest<{
|
||||
Params: { application_id: string };
|
||||
Body: { resource: Application };
|
||||
}>,
|
||||
_reply: FastifyReply,
|
||||
): Promise<ResourceGetResponse<ApplicationObject | PublicApplicationObject>> {
|
||||
const context = getExecutionContext(request);
|
||||
|
||||
try {
|
||||
const app = request.body.resource;
|
||||
const now = new Date().getTime();
|
||||
const pluginsEndpoint = config.get("plugins.api");
|
||||
|
||||
let entity: Application;
|
||||
|
||||
if (request.params.application_id) {
|
||||
entity = await gr.services.applications.marketplaceApps.get(
|
||||
{
|
||||
id: request.params.application_id,
|
||||
},
|
||||
context,
|
||||
);
|
||||
|
||||
if (!entity) {
|
||||
throw CrudException.notFound("Application not found");
|
||||
}
|
||||
|
||||
entity.publication.requested = app.publication.requested;
|
||||
if (app.publication.requested === false) {
|
||||
entity.publication.published = false;
|
||||
}
|
||||
|
||||
if (entity.publication.published) {
|
||||
if (
|
||||
!_.isEqual(
|
||||
_.pick(entity, "identity", "api", "access", "display"),
|
||||
_.pick(app, "identity", "api", "access", "display"),
|
||||
)
|
||||
) {
|
||||
throw CrudException.badRequest(
|
||||
"You can't update applications details while it published",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
entity.identity = app.identity;
|
||||
entity.api.hooks_url = app.api.hooks_url;
|
||||
entity.api.allowed_ips = app.api.allowed_ips;
|
||||
entity.access = app.access;
|
||||
entity.display = app.display;
|
||||
|
||||
entity.stats.updated_at = now;
|
||||
entity.stats.version++;
|
||||
|
||||
const res = await gr.services.applications.marketplaceApps.save(entity);
|
||||
entity = res.entity;
|
||||
} else {
|
||||
// INSERT
|
||||
|
||||
app.is_default = false;
|
||||
app.publication.published = false;
|
||||
app.api.private_key = randomBytes(32).toString("base64");
|
||||
|
||||
app.stats = {
|
||||
created_at: now,
|
||||
updated_at: now,
|
||||
version: 0,
|
||||
};
|
||||
|
||||
const res = await gr.services.applications.marketplaceApps.save(app);
|
||||
entity = res.entity;
|
||||
}
|
||||
|
||||
// SYNC PLUGINS
|
||||
if (app.identity.repository) {
|
||||
try {
|
||||
axios
|
||||
.post(
|
||||
`${pluginsEndpoint}/add`,
|
||||
{
|
||||
gitRepo: app.identity.repository,
|
||||
pluginId: entity.getApplicationObject().id,
|
||||
pluginSecret: entity.getApplicationObject().api.private_key,
|
||||
},
|
||||
{
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
},
|
||||
)
|
||||
.then(response => {
|
||||
log.info(response.data);
|
||||
})
|
||||
.catch(error => {
|
||||
log.error(error);
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
resource: entity.getApplicationObject(),
|
||||
};
|
||||
} catch (e) {
|
||||
log.error(e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
async delete(
|
||||
request: FastifyRequest<{ Params: { application_id: string } }>,
|
||||
reply: FastifyReply,
|
||||
): Promise<ResourceDeleteResponse> {
|
||||
const context = getExecutionContext(request);
|
||||
|
||||
const application = await gr.services.applications.marketplaceApps.get(
|
||||
{
|
||||
id: request.params.application_id,
|
||||
},
|
||||
context,
|
||||
);
|
||||
|
||||
const compUser = await gr.services.companies.getCompanyUser(
|
||||
{ id: application.company_id },
|
||||
{ id: context.user.id },
|
||||
);
|
||||
if (!compUser || !hasCompanyAdminLevel(compUser.role)) {
|
||||
throw CrudException.forbidden("You don't have the rights to delete this application");
|
||||
}
|
||||
|
||||
const deleteResult = await gr.services.applications.marketplaceApps.delete(
|
||||
{
|
||||
id: request.params.application_id,
|
||||
},
|
||||
context,
|
||||
);
|
||||
|
||||
if (deleteResult.deleted) {
|
||||
reply.code(204);
|
||||
|
||||
return {
|
||||
status: "success",
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
status: "error",
|
||||
resource: isAdmin ? getApplicationObject(entity) : getPublicObject(entity),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -237,9 +63,7 @@ export class ApplicationController
|
||||
const content = request.body.data;
|
||||
|
||||
const applicationEntity = await gr.services.applications.marketplaceApps.get(
|
||||
{
|
||||
id: request.params.application_id,
|
||||
},
|
||||
request.params.application_id,
|
||||
context,
|
||||
);
|
||||
|
||||
|
||||
@@ -62,45 +62,6 @@ export class CompanyApplicationController
|
||||
) || [],
|
||||
};
|
||||
}
|
||||
|
||||
async save(
|
||||
request: FastifyRequest<{
|
||||
Params: { company_id: string; application_id: string };
|
||||
Body: PublicApplicationObject;
|
||||
}>,
|
||||
): Promise<ResourceGetResponse<PublicApplicationObject>> {
|
||||
const context = getCompanyExecutionContext(request);
|
||||
|
||||
const resource = await gr.services.applications.companyApps.save(
|
||||
{ application_id: request.params.application_id, company_id: context.company.id },
|
||||
{},
|
||||
context,
|
||||
);
|
||||
|
||||
const app = await gr.services.applications.companyApps.get(resource.entity);
|
||||
|
||||
return {
|
||||
resource: app.application,
|
||||
};
|
||||
}
|
||||
|
||||
async delete(
|
||||
request: FastifyRequest<{ Params: { company_id: string; application_id: string } }>,
|
||||
_reply: FastifyReply,
|
||||
): Promise<ResourceDeleteResponse> {
|
||||
const context = getCompanyExecutionContext(request);
|
||||
const resource = await gr.services.applications.companyApps.delete(
|
||||
{
|
||||
application_id: request.params.application_id,
|
||||
company_id: context.company.id,
|
||||
id: undefined,
|
||||
},
|
||||
context,
|
||||
);
|
||||
return {
|
||||
status: resource.deleted ? "success" : "error",
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function getCompanyExecutionContext(
|
||||
|
||||
@@ -26,9 +26,7 @@ const routes: FastifyPluginCallback = (fastify: FastifyInstance, options, next)
|
||||
|
||||
if (request.params.application_id) {
|
||||
const application = await gr.services.applications.marketplaceApps.get(
|
||||
{
|
||||
id: request.params.application_id,
|
||||
},
|
||||
request.params.application_id,
|
||||
undefined,
|
||||
);
|
||||
|
||||
@@ -61,15 +59,6 @@ const routes: FastifyPluginCallback = (fastify: FastifyInstance, options, next)
|
||||
* Marketplace of applications
|
||||
*/
|
||||
|
||||
//Get and search list of applications in the marketplace
|
||||
fastify.route({
|
||||
method: "GET",
|
||||
url: `${applicationsUrl}`,
|
||||
preValidation: [fastify.authenticate],
|
||||
// schema: applicationGetSchema,
|
||||
handler: applicationController.list.bind(applicationController),
|
||||
});
|
||||
|
||||
//Get a single application in the marketplace
|
||||
fastify.route({
|
||||
method: "GET",
|
||||
@@ -79,35 +68,6 @@ const routes: FastifyPluginCallback = (fastify: FastifyInstance, options, next)
|
||||
handler: applicationController.get.bind(applicationController),
|
||||
});
|
||||
|
||||
//Create application (must be my company application and I must be company admin)
|
||||
fastify.route({
|
||||
method: "POST",
|
||||
url: `${applicationsUrl}`,
|
||||
preHandler: [adminCheck],
|
||||
preValidation: [fastify.authenticate],
|
||||
schema: applicationPostSchema,
|
||||
handler: applicationController.save.bind(applicationController),
|
||||
});
|
||||
|
||||
//Edit application (must be my company application and I must be company admin)
|
||||
fastify.route({
|
||||
method: "POST",
|
||||
url: `${applicationsUrl}/:application_id`,
|
||||
preHandler: [adminCheck],
|
||||
preValidation: [fastify.authenticate],
|
||||
schema: applicationPostSchema,
|
||||
handler: applicationController.save.bind(applicationController),
|
||||
});
|
||||
|
||||
// Delete application (must be my company application and I must be company admin)
|
||||
fastify.route({
|
||||
method: "DELETE",
|
||||
url: `${applicationsUrl}/:application_id`,
|
||||
preHandler: [adminCheck],
|
||||
preValidation: [fastify.authenticate],
|
||||
handler: applicationController.delete.bind(applicationController),
|
||||
});
|
||||
|
||||
/**
|
||||
* Company applications collection
|
||||
* Company-wide available applications
|
||||
@@ -130,22 +90,6 @@ const routes: FastifyPluginCallback = (fastify: FastifyInstance, options, next)
|
||||
handler: companyApplicationController.get.bind(companyApplicationController),
|
||||
});
|
||||
|
||||
//Remove an application from a company
|
||||
fastify.route({
|
||||
method: "DELETE",
|
||||
url: `${companyApplicationsUrl}/:application_id`,
|
||||
preValidation: [fastify.authenticate],
|
||||
handler: companyApplicationController.delete.bind(companyApplicationController),
|
||||
});
|
||||
|
||||
//Add an application to the company
|
||||
fastify.route({
|
||||
method: "POST",
|
||||
url: `${companyApplicationsUrl}/:application_id`,
|
||||
preValidation: [fastify.authenticate],
|
||||
handler: companyApplicationController.save.bind(companyApplicationController),
|
||||
});
|
||||
|
||||
//Application event triggered by a user
|
||||
fastify.route({
|
||||
method: "POST",
|
||||
|
||||
Reference in New Issue
Block a user