Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion app/api_v1/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
def get_health():
return jsonify({"message": "ok"})


@api.route("/feature-flags", methods=["GET"])
@login_required
def get_feature_flags():
Expand Down
127 changes: 0 additions & 127 deletions app/api_v1/forms.py

This file was deleted.

175 changes: 162 additions & 13 deletions app/api_v1/integrations.py
Original file line number Diff line number Diff line change
@@ -1,36 +1,185 @@
from flask import (
current_app,
jsonify,
request
)
from . import api
from app.models import *
from app.utils.authorizer import Authorizer
from app.utils.decorators import login_required
from app.utils.integrations import api_get
from app.utils.integrations import api_get, api_post, api_put, api_delete
from app.utils.authorizer import Authorizer
from flask_login import current_user

# -------------------------
# Integration Endpoints
# -------------------------

@api.route("/integrations", methods=["GET"])
@login_required
def list_integrations():
response = api_get("integrations")
return jsonify(response)

@api.route("/deployments", methods=["GET"])
@api.route("/integrations/<string:id>", methods=["GET"])
@login_required
def list_deployments():
response = api_get("deployments")
def get_integration(id):
response = api_get(f"integrations/{id}")
return jsonify(response)

@api.route("/deployments/<string:id>", methods=["GET"])
@api.route("/integrations", methods=["POST"])
@login_required
def get_deployment(id):
response = api_get(f"deployments/{id}")
def create_integration():
data = request.get_json()
response = api_post(f"integrations", payload=data)
return jsonify(response)

@api.route("/deployments/<string:id>/violations", methods=["GET"])
# -------------------------
# Deployment Endpoints
# -------------------------

@api.route("/tenants/<string:tenant_id>/deployments", methods=["GET"])
@login_required
def list_violations_for_deployment(id):
response = api_get(f"deployments/{id}/violations")
def list_deployments(tenant_id):
Authorizer(current_user).can_user_manage_tenant(tenant_id)
response = api_get(f"tenants/{tenant_id}/deployments")
return jsonify(response)

@api.route("/tenants/<string:tenant_id>/deployments", methods=["POST"])
@login_required
def create_deployment(tenant_id):
Authorizer(current_user).can_user_manage_tenant(tenant_id)
data = request.get_json()
response = api_post(f"tenants/{tenant_id}/deployments", payload=data)
return jsonify(response)

@api.route("/tenants/<string:tenant_id>/deployments/<string:deployment_id>", methods=["PUT"])
@login_required
def update_deployment(tenant_id, deployment_id):
Authorizer(current_user).can_user_manage_tenant(tenant_id)
data = request.get_json()
response = api_put(f"tenants/{tenant_id}/deployments/{deployment_id}", data)
return jsonify(response)

@api.route("/tenants/<string:tenant_id>/deployments/<string:id>", methods=["GET"])
@login_required
def get_deployment(tenant_id, id):
Authorizer(current_user).can_user_manage_tenant(tenant_id)
response = api_get(f"tenants/{tenant_id}/deployments/{id}")
return jsonify(response)

@api.route("/tenants/<string:tenant_id>/deployments/<string:id>", methods=["DELETE"])
@login_required
def delete_deployment(tenant_id, id):
Authorizer(current_user).can_user_manage_tenant(tenant_id)
response = api_delete(f"tenants/{tenant_id}/deployments/{id}")
return jsonify(response)

@api.route("/tenants/<string:tenant_id>/deployments/<string:id>/violations", methods=["GET"])
@login_required
def list_violations_for_deployment(tenant_id, id):
Authorizer(current_user).can_user_manage_tenant(tenant_id)
response = api_get(f"tenants/{tenant_id}/deployments/{id}/violations")
return jsonify(response)

@api.route("/tenants/<string:tenant_id>/deployments/<string:id>/jobs", methods=["GET"])
@login_required
def list_jobs_for_deployment(tenant_id, id):
Authorizer(current_user).can_user_manage_tenant(tenant_id)
response = api_get(f"tenants/{tenant_id}/jobs", params={"deployment_id": id})
return jsonify(response)

@api.route("/tenants/<string:tenant_id>/deployments/<string:deployment_id>/jobs", methods=["POST"])
@login_required
def execute_manual_deployment(tenant_id, deployment_id):
Authorizer(current_user).can_user_manage_tenant(tenant_id)
response = api_get(f"tenants/{tenant_id}/deployments/{deployment_id}")
if response.get("schedule"):
return jsonify({"message": "deployment is not manual"})
response = api_post(f"tenants/{tenant_id}/jobs", {"deployment_id": deployment_id})
return jsonify(response)

# -------------------------
# Job Endpoints
# -------------------------

@api.route("/tenants/<string:tenant_id>/jobs", methods=["GET"])
@login_required
def list_jobs(tenant_id):
Authorizer(current_user).can_user_manage_tenant(tenant_id)
page = request.args.get("page", 1, type=int)
per_page = request.args.get("per_page", 20, type=int)
response = api_get(f"tenants/{tenant_id}/jobs?page={page}&per_page={per_page}")
return jsonify(response)

@api.route("/tenants/<string:tenant_id>/jobs/<string:job_id>", methods=["GET"])
@login_required
def get_job(tenant_id, job_id):
Authorizer(current_user).can_user_manage_tenant(tenant_id)
response = api_get(f"tenants/{tenant_id}/jobs/{job_id}")
return jsonify(response)

# -------------------------
# Violation Endpoints
# -------------------------

@api.route("/tenants/<string:tenant_id>/violations", methods=["GET"])
@login_required
def list_violations(tenant_id):
Authorizer(current_user).can_user_manage_tenant(tenant_id)
response = api_get(f"tenants/{tenant_id}/violations")
return jsonify(response)

# -------------------------
# Init Integrations
# -------------------------

@api.route("/init-integrations", methods=["POST"])
@login_required
def deploy_integrations():
response = api_post(f"init-integrations")
return jsonify(response)

# -------------------------
# Project Endpoints
# -------------------------
@api.route("/projects/<string:id>/deployments", methods=["GET"])
@login_required
def get_deployments_for_project(id):
result = Authorizer(current_user).can_user_edit_project(id)
tenant_id = result['extra']['project'].tenant.id
deployments = []
response = api_get(f"tenants/{tenant_id}/deployments")
for deployment in response:
if id in deployment.get("project_ids"):
deployments.append(deployment)
return jsonify(deployments)

@api.route("/projects/<string:id>/deployments", methods=["POST"])
@login_required
def update_deployments_for_project(id):
result = Authorizer(current_user).can_user_edit_project(id)
data = request.get_json()
if not data or 'deployment_ids' not in data:
return jsonify({'message': 'deployment_ids is required'}), 400

deployment_ids = data['deployment_ids']
if not isinstance(deployment_ids, list) or len(deployment_ids) == 0:
return jsonify({'message': 'deployment_ids must be a non-empty list'}), 400

payload = {"deployment_ids": deployment_ids}
response = api_post(f"/projects/{id}/deployments", payload=payload)
return jsonify(response)

@api.route("/projects/<string:id>/deployments", methods=["DELETE"])
@login_required
def delete_deployment_from_project(id):
result = Authorizer(current_user).can_user_edit_project(id)
data = request.get_json()
if not data or 'deployment_ids' not in data:
return jsonify({'message': 'deployment_ids is required'}), 400

deployment_ids = data['deployment_ids']
if not isinstance(deployment_ids, list) or len(deployment_ids) == 0:
return jsonify({'message': 'deployment_ids must be a non-empty list'}), 400

payload = {"deployment_ids": deployment_ids}
response = api_delete(f"/projects/{id}/deployments", payload=payload)
return jsonify(response)
Loading