Skip to content
Snippets Groups Projects
Select Git revision
  • 836896948b9abef2f32ec728116de560185c5407
  • main default protected
2 results

start_script.py

Blame
  • Forked from Ockenden, Samuel / CiS Projekt
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    main.py 3.63 KiB
    from fastapi import FastAPI, Request, Query, Response
    from fastapi.staticfiles import StaticFiles
    from fastapi.templating import Jinja2Templates
    from fastapi.encoders import jsonable_encoder
    from fastapi.responses import JSONResponse
    from common.query_parser import QueryParser
    from common.tsakorpus_query_parser import TsakorpusQueryParser
    from common.tsakorpus_response_parser import TsakorpusResponseParser
    from common.enums import *
    from common.diagnostics import Diagnostic
    from common.config import ResourceConfig, read_configs
    import json
    import os
    import re
    import uvicorn
    
    app = FastAPI()
    app.mount('/static', StaticFiles(directory='static'), name='static')
    templates = Jinja2Templates(directory='static')
    
    app.qp = QueryParser()
    app.qp_tsakorpus = TsakorpusQueryParser()
    app.rp_tsakorpus = TsakorpusResponseParser()
    app.configs = read_configs()
    
    
    @app.get('/')
    def root():
        return {"message": "Hello World"}
    
    
    @app.get('/fcs-endpoint/{corpusID}')
    def endpoint(
            request: Request,
            corpusID: str,
            operation: Operation = Operation.explain,
            version: SRUVersion = SRUVersion.v2_0,
            queryType: QueryType = QueryType.fcs,
            query: str = '',
            xFcsEndpointDescription: str = Query(
                default='',
                alias='x-fcs-endpoint-description'
            ),
            xFcsContext: str = Query(
                default='',
                alias='x-fcs-context'
            ),
            xFcsDataviews: str = Query(
                default='',
                alias='x-fcs-dataviews'
            ),
            xFcsRewritesAllowed: str = Query(
                default='',
                alias='x-fcs-rewrites-allowed'
            )
            ):
        if corpusID not in app.configs:
            message = 'No corpus with this ID (' + corpusID +') is served by this Endpoint. ' \
                      'Valid corpus IDs are: ' + '; '.join(cID for cID in sorted(app.configs)) + '.'
            diagBody = str(Diagnostic(DiagnosticTypes.sru, 235,
                           message=message))  # "Database does not exist"
            return Response(content=diagBody, media_type='application/xml')
        config = app.configs[corpusID]
        diagnostics = app.qp.validate_query(operation, version, queryType, query,
                                            xFcsEndpointDescription, xFcsContext,
                                            xFcsDataviews, xFcsRewritesAllowed)
        if any(d.is_fatal() for d in diagnostics):
            return '\n'.join(str(d) for d in diagnostics)
    
        if operation == Operation.searchRetrieve:
            if config.platform == CorpPlatform.tsakorpus:
                try:
                    strGetParams = app.qp_tsakorpus.translate_fcsql(query, config)
                    print(strGetParams)
                    res = app.qp_tsakorpus.send_query(strGetParams, config)
                except Diagnostic as diag:
                    print('diag', str(diag))
                    return Response(content=str(diag), media_type='application/xml')
                records, nHits = app.rp_tsakorpus.parse(res, config)
                records = [r.as_dict() for r in records]
                return templates.TemplateResponse('search_retrieve_response.xml',
                                                  {
                                                      'request': request,
                                                      'n_hits': nHits,
                                                      'records': records
                                                  })
                                                  # media_type='application/xml')
                # return str(res)
    
        return {'operation': operation, 'version': version}
    
    
    if __name__ == '__main__':
        uvicorn.run(
            'main:app',
            host='0.0.0.0',
            port=5000,
            reload=True
        )