98 lines
3.3 KiB
Python
98 lines
3.3 KiB
Python
# 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('/<int:id>')
|
|
@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
|