# 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 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'), 'recorder': fields.List(fields.Nested(api_room.model('room_recorder', {'id': fields.Integer(), 'name': fields.String(), 'ip': fields.String(), 'network_name': fields.String()})), required=False, description='Room members.') }) @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) 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) @api_room.marshal_with(room_model) def put(self, id): '''Update a task given its identifier''' num_rows_matched = Room.query.filter_by(id=id).update(api_room.payload) db.session.commit() # if room is not None: # app.logger.debug(room) # room.update(api_room.payload) # db.session.commit() # return room 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) 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, code=201) def post(self): 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