예제 #1
0
class LaborApi:
    def __init__(self, loop=None, logger=None, state_file=None):
        self.loop = loop or asyncio.get_event_loop()
        self.logger = logger or logging.getLogger('labor-api')

        # setup rpc
        self.rpc = JsonRpc()

        self.rpc.add_topics(('room-state'), )

        self.rpc.add_methods(('', self.set_room_state), )

        # setup cache
        self.state_file = state_file

        self.cache = {
            'state': {
                'since': None,
                'open': None,
            },
            'archive': [],
            'responses': {
                'room': '',
                'room_archive': '',
            },
        }

        if not state_file:
            self.logger.debug('No state file.'
                              'rooms state will be closed by default')

            self._set_room_state(False)

        # setup app
        self.app = Application(loop=self.loop)

        # get room
        self.app.router.add_route('GET', '/api/room/', self.get_room)
        self.app.router.add_route('GET', '/api/room', self.get_room)

        # set room
        self.app.router.add_route('POST', '/api/room/', self.set_room)
        self.app.router.add_route('POST', '/api/room', self.set_room)

        # room archive
        self.app.router.add_route('GET', '/api/room_archive/',
                                  self.get_room_archive)

        self.app.router.add_route('GET', '/api/room_archive',
                                  self.get_room_archive)

        # websockets
        self.app.router.add_route('GET', '/api/rpc/', self.rpc)
        self.app.router.add_route('GET', '/api/rpc', self.rpc)

    def _set_room_state(self, open):
        self.logger.debug('set room state open=%s', open)

        state = {
            'since': int(time.time()),
            'open': bool(open),
        }

        self.cache['state'] = state

        self.cache['archive'].append({
            'lastchange': state['since'],
            'open': open,
        })

        self.cache['responses']['room'] = json.dumps(self.cache['state'])

        self.cache['responses']['room_archive'] = json.dumps(
            self.cache['archive'])

        # notify
        self.rpc.notify('room-state', state)

    def get_bool_from_str(self, str):
        if str.lower().strip() in ('1', 'true'):
            return True

        return False

    # methods
    async def set_room_state(self, request):
        self._set_room_state(request.params['open'])

        return self.cache['state']

    async def get_room(self, request):
        self.logger.debug('LaborApi.get_room(%s)', request)

        response = Response(text=self.cache['responses']['room'],
                            content_type='application/json')

        response.headers['Access-Control-Allow-Origin'] = '*'

        return response

    async def set_room(self, request):
        data = await request.post()

        self.logger.debug('LaborApi.set_room(%s(%s))', request, data)

        open = self.get_bool_from_str(data['open'])
        self._set_room_state(open=open)

        return Response(content_type='application/json',
                        text=json.dumps({
                            'success': True,
                            'status': '',
                        }))

    async def get_room_archive(self, request):
        self.logger.debug('LaborApi.get_room_archive(%s)', request)

        return Response(text=self.cache['responses']['room_archive'],
                        content_type='application/json')