mirror of
https://github.com/pds-nest/nest.git
synced 2024-11-26 23:14:19 +00:00
240 lines
9.1 KiB
Python
240 lines
9.1 KiB
Python
from flask import render_template, abort, jsonify, request
|
|
from nest_backend.database import *
|
|
from flask_jwt_extended import jwt_required, get_jwt_identity
|
|
from nest_backend.gestione import *
|
|
from flask_cors import cross_origin
|
|
import datetime
|
|
from nest_backend.errors import *
|
|
|
|
|
|
@cross_origin()
|
|
@jwt_required()
|
|
def page_alert(aid):
|
|
"""
|
|
---
|
|
get:
|
|
summary: Get details about an alert.
|
|
parameters:
|
|
- in: path
|
|
schema: AlertParameterSchema
|
|
security:
|
|
- jwt: []
|
|
responses:
|
|
'200':
|
|
description: The details about the requested alert. The schema is incapsulated in Success.
|
|
content:
|
|
application/json:
|
|
schema: Alert
|
|
'404':
|
|
description: Could not find the requested repository.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
'403':
|
|
description: The user is not authorized.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
'401':
|
|
description: The user is not logged in.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
tags:
|
|
- alert-related
|
|
delete:
|
|
summary: Deletes an alert.
|
|
parameters:
|
|
- in: path
|
|
schema: AlertParameterSchema
|
|
security:
|
|
- jwt: []
|
|
responses:
|
|
'204':
|
|
description: The repository has been deleted successfully.
|
|
'404':
|
|
description: Could not find the requested repository.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
'403':
|
|
description: The user is not authorized.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
'401':
|
|
description: The user is not logged in.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
'500':
|
|
description: Could not delete the repository.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
tags:
|
|
- alert-related
|
|
patch:
|
|
summary: Updates an alert.
|
|
security:
|
|
- jwt: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema: Alert
|
|
parameters:
|
|
- in: path
|
|
schema: AlertParameterSchema
|
|
|
|
responses:
|
|
'200':
|
|
description: The alert has been updated successfully.
|
|
content:
|
|
application/json:
|
|
schema: Alert
|
|
'404':
|
|
description: Could not find the requested repository.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
'403':
|
|
description: The user is not authorized.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
'401':
|
|
description: The user is not logged in.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
tags:
|
|
- alert-related
|
|
put:
|
|
summary: Overrides an alert and the conditions.
|
|
security:
|
|
- jwt: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema: Alert
|
|
parameters:
|
|
- in: path
|
|
schema: AlertParameterSchema
|
|
|
|
responses:
|
|
'200':
|
|
description: The alert has been updated successfully.
|
|
content:
|
|
application/json:
|
|
schema: Alert
|
|
'404':
|
|
description: Could not find the requested repository.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
'403':
|
|
description: The user is not authorized.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
'401':
|
|
description: The user is not logged in.
|
|
content:
|
|
application/json:
|
|
schema: Error
|
|
tags:
|
|
- alert-related
|
|
"""
|
|
user = find_user(get_jwt_identity())
|
|
alert = Alert.query.filter_by(id=aid).first()
|
|
if not alert:
|
|
return json_error("Could not find alert.", ALERT_NOT_FOUND), 404
|
|
if alert.repository not in [a.repository for a in user.authorizations] + user.owner_of:
|
|
return json_error("You are not authorized to proceed.", USER_NOT_AUTHORIZED), 403
|
|
if request.method == "GET":
|
|
return json_success(alert.to_json()), 200
|
|
if alert.repository not in user.owner_of:
|
|
return json_error("You are not authorized to proceed.", REPOSITORY_NOT_OWNER), 403
|
|
if request.method == "PATCH":
|
|
if request.json is None:
|
|
return json_error("Missing json content.", GENERIC_NO_JSON), 400
|
|
|
|
if 'name' in request.json:
|
|
alert.name = request.json['name']
|
|
if 'limit' in request.json:
|
|
alert.limit = request.json['limit']
|
|
if 'window_size' in request.json:
|
|
alert.window_size = request.json['window_size']
|
|
if 'evaluation_mode' in request.json:
|
|
try:
|
|
alert.evaluation_mode = ConditionMode(request.json['evaluation_mode'])
|
|
except KeyError:
|
|
return json_error("Unknown `evaluation_mode` specified.", GENERIC_ENUM_INVALID), 400
|
|
except Exception as e:
|
|
return json_error("Unknown error:" + str(e), GENERIC_UFO), 400
|
|
ext.session.commit()
|
|
return json_success(alert.to_json()), 200
|
|
elif request.method == "DELETE":
|
|
try:
|
|
for elem in alert.conditions:
|
|
condition = elem.condition
|
|
ext.session.delete(elem)
|
|
ext.session.commit()
|
|
if not condition.repository_id:
|
|
ext.session.delete(condition)
|
|
ext.session.commit()
|
|
ext.session.delete(alert)
|
|
ext.session.commit()
|
|
except Exception as e:
|
|
return json_error("Something went wrong while deleting alert.", ALERT_DELETION_FAILURE), 500
|
|
return json_success("Deletion completed."), 204
|
|
elif request.method == "PUT":
|
|
if request.json is None:
|
|
return json_error("Missing json content.", GENERIC_NO_JSON), 400
|
|
|
|
if not json_request_authorizer(request.json, alert):
|
|
return json_error("Missing one or more parameters in alert json.", GENERIC_MISSING_FIELDS), 400
|
|
alert.limit = request.json['limit']
|
|
alert.name = request.json['name']
|
|
alert.window_size = request.json['window_size']
|
|
if (mode := request.json.get("evaluation_mode")) is not None:
|
|
try:
|
|
alert.evaluation_mode = ConditionMode(mode)
|
|
except KeyError:
|
|
return json_error("Unknown `evaluation_mode` specified.", GENERIC_ENUM_INVALID), 400
|
|
except Exception as e:
|
|
return json_error("Unknown error:" + str(e), GENERIC_UFO), 400
|
|
if request.json['conditions'] is not None:
|
|
# Wow very pythonic so much wow
|
|
# Obtain list of no longer needed connections
|
|
to_be_deleted = [c.cid for c in alert.conditions if
|
|
c.cid not in [json['id'] for json in request.json['conditions']]]
|
|
# RIP AND TEAR UNTIL ITS DONE
|
|
for elem in to_be_deleted:
|
|
conn = MadeOf.query.filter_by(cid=elem, aid=alert.id).first()
|
|
if conn:
|
|
ext.session.delete(conn)
|
|
ext.session.commit()
|
|
for c in request.json['conditions']:
|
|
if not c.get("id"):
|
|
if (type_ := c.get("type")) is None:
|
|
return json_error("Missing `type` parameter.", GENERIC_MISSING_FIELDS), 400
|
|
try:
|
|
type_ = ConditionType(type_)
|
|
except KeyError:
|
|
return json_error("Unknown `type` specified.", GENERIC_ENUM_INVALID), 400
|
|
except Exception as e:
|
|
return json_error("Unknown error: " + str(e)), 400
|
|
if not (content := c.get("content")):
|
|
return json_error("Missing `content` parameter.", GENERIC_MISSING_FIELDS), 400
|
|
if type_ == ConditionType.hashtag:
|
|
content = hashtag_validator(content)
|
|
con = Condition(content=content, type=type_, repository_id=alert.repository_id)
|
|
ext.session.add(con)
|
|
ext.session.commit()
|
|
conn = MadeOf(aid=alert.id, cid=con.id)
|
|
ext.session.add(conn)
|
|
ext.session.commit()
|
|
return json_success(alert.to_json()), 200
|