def get(self, record_id): try: record = model.get_one(table="record", field="id", value=record_id) if not record: return response(404) data = record_model.get_other_data(record) return response(200, data=data) except Exception as e: current_app.logger.error(f"{e}") return response(500)
def get(self): try: records = model.get_all("record") if not records: return response(404) records_detail = [] for record in records: detail = record_model.get_other_data(record) records_detail.append(detail) return response(200, data=records_detail) except Exception as e: current_app.logger.error(f"{e}") return response(500)
def get_other_data(zone): if zone is None: return user = model.get_one(table="user", field="id", value=zone["user_id"]) user = helpers.exclude_keys(user, {"created_at"}) records = record_model.get_records_by_zone(zone["zone"]) records_detail = [] for record in records: record_detail = record_model.get_other_data(record) record_detail = helpers.exclude_keys(record_detail, {"zone"}) records_detail.append(record_detail) data = { "zone_id": zone["id"], "zone": zone["zone"], "user": user, "records": records_detail, } return data
def post(self): """Add new record. note: Adding any record with other record is allowed. IETF best practice is not handled automatically. Knot didn't handle this too, and let the user know the standards themselves. See https://tools.ietf.org/html/rfc1912 """ parser = reqparse.RequestParser() parser.add_argument("zone", type=str, required=True) parser.add_argument("owner", type=str, required=True) parser.add_argument("rtype", type=str, required=True) parser.add_argument("rdata", type=str, required=True) parser.add_argument("ttl", type=str, required=True) args = parser.parse_args() owner = args["owner"].lower() rtype = args["rtype"].lower() rdata = args["rdata"] zone = args["zone"] ttl = args["ttl"] try: ttl_id = ttl_model.get_ttlid_by_ttl(ttl) type_id = type_model.get_typeid_by_rtype(rtype) zone_id = zone_model.get_zone_id(zone) except Exception as e: return response(404, message=f"{e}") try: rules.check_add(rtype, zone_id, type_id, owner, rdata, ttl_id) except Exception as e: return response(409, message=f"{e}") try: # rtype no need to be validated & no need to check its length # `get_typeid` will raise error for non existing rtype validator.validate(rtype, rdata) validator.validate("owner", owner) except Exception as e: return response(422, message=f"{e}") try: serial_resource = get_serial_resource(zone) check_serial_limit(serial_resource) except Exception as e: return response(429, message=f"{e}") try: data = { "owner": owner, "zone_id": zone_id, "type_id": type_id, "ttl_id": ttl_id, } record_id = model.insert(table="record", data=data) content_data = {"rdata": rdata, "record_id": record_id} model.insert(table="rdata", data=content_data) command.set_zone(record_id, "zone-set") # increment serial after adding new record rtype = type_model.get_type_by_recordid(record_id) if rtype != "SOA": update_serial(serial_resource) record = model.get_one(table="record", field="id", value=record_id) data = record_model.get_other_data(record) return response(201, data=data) except Exception as e: current_app.logger.error(f"{e}") return response(500)
def put(self, record_id): parser = reqparse.RequestParser() parser.add_argument("zone", type=str, required=True) parser.add_argument("owner", type=str, required=True) parser.add_argument("rtype", type=str, required=True) parser.add_argument("rdata", type=str, required=True) parser.add_argument("ttl", type=str, required=True) args = parser.parse_args() owner = args["owner"].lower() rtype = args["rtype"].lower() rdata = args["rdata"] zone = args["zone"] ttl = args["ttl"] try: ttl_id = ttl_model.get_ttlid_by_ttl(ttl) record_model.is_exists(record_id) type_id = type_model.get_typeid_by_rtype(rtype) zone_id = zone_model.get_zone_id(zone) except Exception as e: return response(404, message=f"{e}") try: rules.check_edit(rtype, zone_id, type_id, owner, rdata, ttl_id, record_id) except Exception as e: return response(409, message=f"{e}") try: validator.validate(rtype, rdata) validator.validate("owner", owner) except Exception as e: return response(422, message=f"{e}") try: serial_resource = get_serial_resource(zone) check_serial_limit(serial_resource) except Exception as e: return response(429, message=f"{e}") try: data = { "where": {"id": record_id}, "data": { "owner": owner, "zone_id": zone_id, "type_id": type_id, "ttl_id": ttl_id, }, } content_data = { "where": {"record_id": record_id}, "data": {"rdata": rdata, "record_id": record_id}, } command.set_zone(record_id, "zone-unset") model.update("rdata", data=content_data) model.update("record", data=data) command.set_zone(record_id, "zone-set") # increment serial after adding new record rtype = type_model.get_type_by_recordid(record_id) if rtype != "SOA": update_serial(serial_resource, "02") record = model.get_one(table="record", field="id", value=record_id) data_ = record_model.get_other_data(record) return response(200, data=data_) except Exception as e: current_app.logger.error(f"{e}") return response(500)