# Copyright (c) 2019. Tobias Kurze """ This module provides functions related to authentication through the API. For example: listing of available auth providers or registration of users. Login through API does not start a new session, but instead returns JWT. """ from flask_jwt_extended import jwt_required from flask_restplus import fields, Resource from sqlalchemy import exc from backend import db, app from backend.api import api_room from backend.models.room_model import Room from backend.models.recorder_model import Recorder room_model = api_room.model('Room', { 'id': fields.String(required=False, description='The room\'s identifier'), 'created_at': fields.DateTime(required=False, description='Creation date of the room info'), 'name': fields.String(required=True, description='The room\'s name'), 'alternate_name': fields.String(required=False, description='The room\'s alternate name'), 'comment': fields.String(required=False, description='The room\'s comment'), 'number': fields.String(required=True, description='The room\'s number'), 'building_name': fields.String(required=False, description='The building\'s name'), 'building_number': fields.String(required=False, description='The building\'s number'), 'recorder': fields.Nested(api_room.model('room_recorder', {'id': fields.Integer(), 'name': fields.String(), 'ip': fields.String(), 'network_name': fields.String()}), allow_null=True, skip_none=False, required=False, description='Room recorder.'), }) @api_room.route('/') @api_room.response(404, 'Room not found') @api_room.param('id', 'The room identifier') class RoomResource(Resource): @jwt_required @api_room.doc('get_room') @api_room.marshal_with(room_model, skip_none=False) def get(self, id): """Fetch a user given its identifier""" room = Room.query.get(id) if room is not None: return room api_room.abort(404) @jwt_required @api_room.doc('delete_todo') @api_room.response(204, 'Todo deleted') def delete(self, id): '''Delete a task given its identifier''' room = Room.query.get(id) if room is not None: db.session.delete(room) db.session.commit() return '', 204 api_room.abort(404) @jwt_required @api_room.doc('update_room') @api_room.expect(room_model) def put(self, id): app.logger.debug(api_room.payload) '''Update a task given its identifier''' if "recorder_id" in api_room.payload: if api_room.payload["recorder_id"] is None: api_room.payload["recorder"] = None else: recorder = Recorder.query.get(api_room.payload["recorder_id"]) if recorder is not None: api_room.payload["recorder"] = recorder else: return "specified recorder (id: {}) does not exist!".format(api_room.payload["recorder_id"]), 404 room = Room.query.get(id) if room is not None: room.recorder = api_room.payload["recorder"] else: num_rows_matched = Room.query.filter_by(id=id).update(api_room.payload) db.session.commit() return "ok" api_room.abort(404) @api_room.route('') class RoomList(Resource): @jwt_required @api_room.doc('rooms') @api_room.marshal_list_with(room_model, skip_none=False) def get(self): """ List all rooms :return: rooms """ return Room.get_all() @jwt_required @api_room.doc('create_room') @api_room.expect(room_model) @api_room.marshal_with(room_model, skip_none=False, code=201) def post(self): if "recorder_id" in api_room.payload: if api_room.payload["recorder_id"] is None: api_room.payload["recorder"] = None else: recorder = Recorder.query.get(api_room.payload["recorder_id"]) if recorder is not None: api_room.payload["recorder"] = recorder else: return "specified recorder (id: {}) does not exist!".format(api_room.payload["recorder_id"]), 404 del api_room.payload["recorder_id"] room = Room(**api_room.payload) db.session.add(room) try: db.session.commit() return room except exc.IntegrityError as e: db.session.rollback() return str(e.detail), 400