Skip to content
Snippets Groups Projects
service.py 4.66 KiB
Newer Older
  • Learn to ignore specific revisions
  • David Trattnig's avatar
    David Trattnig committed
    #
    # Aura Engine API (https://gitlab.servus.at/aura/engine-api)
    #
    # Copyright (C) 2020 - The Aura Engine Team.
    #
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU Affero General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU Affero General Public License for more details.
    #
    # You should have received a copy of the GNU Affero General Public License
    # along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
    
    David Trattnig's avatar
    David Trattnig committed
    
    
    import datetime
    
    David Trattnig's avatar
    David Trattnig committed
    
    
    from enum import Enum
    
    David Trattnig's avatar
    David Trattnig committed
    from models import PlayLog, TrackSchema
    
    
    David Trattnig's avatar
    David Trattnig committed
    
    
    class NodeType(Enum):
        """
        Types of API Server deployment models.
        """
        MAIN = "main"
        SYNC = "sync"
    
    
    
    
    class ApiService():
        """
        Service handling API actions.
        """
    
        config = None
        logger = None
    
        node_type = None
        sync_host = None
        main_hosts = None
    
    
    
        def __init__(self, config, logger):
    
            """
            Initialize Service.
            """
    
            self.config = config
            self.logger = logger
    
    
            # Evaluate deployment mode
            node_type = config.get("node_type")
            if not node_type == NodeType.MAIN.value:
                self.node_type = NodeType.SYNC
                self.main_hosts = [ config.get("main_host_1"), config.get("main_host_2") ]
                self.logger.info("Running in 'SYNC' mode. Syncing data of '%s'" % (self.main_hosts))
    
            else:
                self.node_type = NodeType.MAIN
    
                # Validate sync host
                self.sync_host = config.get("sync_host")
                if not self.sync_host:
                    raise ValueError("Invalid sync_host '%s'!" % self.sync_host)    
    
                self.logger.info("Running in 'MAIN' mode. Pushing data to '%s'" % (self.sync_host))
    
    
    
        def current_track(self):  
            """
            Retrieves the currently playing track.  
    
            Returns:
                (PlayLogEntry)
            """
            track = PlayLog.select_current()
    
    David Trattnig's avatar
    David Trattnig committed
            track_schema = TrackSchema()
    
            return track_schema.dump(track)
    
    
    
    David Trattnig's avatar
    David Trattnig committed
        def list_tracks(self, page=None, size=None):  
    
    David Trattnig's avatar
    David Trattnig committed
            Lists track-service entries with pagination.
    
    David Trattnig's avatar
    David Trattnig committed
                page (Integer): The number of the page to return
                size (Integer): The numbers of items to return
    
    
            Returns:
                (List[PlayLogEntry])
            """
    
    David Trattnig's avatar
    David Trattnig committed
            if not size or size > 50 or size < 1: size = 20
    
            tracklist = PlayLog.paginate(page, size, None)
    
    David Trattnig's avatar
    David Trattnig committed
            tracklist_schema = TrackSchema(many=True)
            return tracklist_schema.dump(tracklist)
    
        def list_playlog(self, page=None, size=None, since_time=None):  
            """
            Get paginated playlog entries for since the given timestamp.  
    
            Args:
                page (Integer): The number of items to skip before starting to collect the result set
                size (Integer): The numbers of items to return per page
    
                since_time (datetime): Optionally, get entries after this timestamp (e.g. "2020-08-29T09:12:33.001Z")
    
    
            Returns:
                (List[PlayLogEntry])
            """
            tracklist = PlayLog.paginate(page, size, since_time)
            tracklist_schema = TrackSchema(many=True)
            return tracklist_schema.dump(tracklist)
    
    
    
        def store_playlog(self, data): 
    
            """
            Stores the passed playlog entry.
    
            Returns:
                (PlayLogEntry)
            """
    
            playlog = PlayLog(data)
            playlog.save()
    
        def clock_info(self):
            """
            Retrieves the currently playing playlist.  
            """
            return "current playlist"
    
    David Trattnig's avatar
    David Trattnig committed
    
    
        def activate_engine(self, engine_number):
            """
            Activates one engine and deactivates the other
    
            Args:
                engine_number (Integer): Number of the engine
            """
            return 'do some magic!'
    
    
        def get_active_engine(self):
            """
            Retrieves the status entry of the currently active engine
    
            Returns:
                StatusEntry
            """
            return 'do some magic!'
    
    
        def get_engine_health(self, engine_number):
            """
            Retrieves the most recent health info of the requested engine
    
            Args:
                engine_number (Integer): Number of the engine
    
    
            Returns:
                (HealthInfo)
            """
            return 'do some magic!'
    
    
        def log_engine_health(self, engine_number):
            """
            Logs another health entry for the given engine
    
            Args:
                engine_number (Integer): Number of the engine
    
            """
            return 'do some magic!'