def lambda_handler()

in source/backend/lambda_server_item/lambda_server_item.py [0:0]


def lambda_handler(event, context):

    if event['httpMethod'] == 'GET':
        if 'appid' in event['pathParameters']:
            resp = servers_table.query(
                    IndexName='app_id-index',
                    KeyConditionExpression=Key('app_id').eq(event['pathParameters']['appid'])
                )
            if resp['Count'] is not 0:
                return {'headers': {'Access-Control-Allow-Origin': '*'},
                        'body': json.dumps(resp['Items'])}
            else:
                return {'headers': {'Access-Control-Allow-Origin': '*'},
                        'statusCode': 400, 'body': 'App Id: ' + str(event['pathParameters']['appid']) + ' does not exist'}
        elif 'serverid' in event['pathParameters']:
            resp = servers_table.get_item(Key={'server_id': event['pathParameters']['serverid']})
            if 'Item' in resp:
                return {'headers': {'Access-Control-Allow-Origin': '*'},
                        'body': json.dumps(resp['Item'])}
            else:
                return {'headers': {'Access-Control-Allow-Origin': '*'},
                        'statusCode': 400, 'body': 'Server Id: ' + str(event['pathParameters']['serverid']) + ' does not exist'}

    elif event['httpMethod'] == 'PUT':
        auth = MFAuth()
        authResponse = auth.getUserAttributePolicy(event)
        if authResponse['action'] == 'allow':
                try:
                    body = json.loads(event['body'])
                    server_attributes = []
                    if "server_id" in body:
                        return {'headers': {'Access-Control-Allow-Origin': '*'},
                                'statusCode': 400, 'body': "You cannot modify server_id, it is managed by the system"}
                except Exception as e:
                    print(e)
                    return {'headers': {'Access-Control-Allow-Origin': '*'},
                            'statusCode': 400, 'body': 'malformed json input'}
                # check if server id exist
                existing_attr = servers_table.get_item(Key={'server_id': event['pathParameters']['serverid']})
                print(existing_attr)
                if 'Item' not in existing_attr:
                  return {'headers': {'Access-Control-Allow-Origin': '*'},
                          'statusCode': 400, 'body': 'server Id: ' + str(event['pathParameters']['serverid']) + ' does not exist'}

                # Check if there is a duplicate server_name
                servers = scan_dynamodb_server_table()
                for server in servers:
                  if 'server_name' in body:
                    if server['server_name'].lower() == str(body['server_name']).lower() and server['server_id'] != str(event['pathParameters']['serverid']):
                        return {'headers': {'Access-Control-Allow-Origin': '*'},
                                'statusCode': 400, 'body': 'server_name: ' +  body['server_name'] + ' already exist'}

                # Validate App_id
                if 'app_id' in body:
                    apps = scan_dynamodb_app_table()
                    check = False
                    for app in apps:
                        if app['app_id'] == str(body['app_id']):
                            check = True
                    if check == False:
                        message = 'app Id: ' + body['app_id'] + ' does not exist'
                        return {'headers': {'Access-Control-Allow-Origin': '*'},
                                'statusCode': 400, 'body': message}

                # Check if attribute is defined in the Server schema
                for server_schema in schema_table.scan()['Items']:
                    if server_schema['schema_name'] == "server":
                        server_attributes = server_schema['attributes']
                for key in body.keys():
                    check = False
                    for attribute in server_attributes:
                        if key == attribute['name']:
                           check = True
                    if check == False:
                        message = "Server attribute: " + key + " is not defined in the Server schema"
                        return {'headers': {'Access-Control-Allow-Origin': '*'},
                                'statusCode': 400, 'body': message}

                # Check if attribute in the body matches the list value defined in schema
                for attribute in server_attributes:
                    if 'listvalue' in attribute:
                        listvalue = attribute['listvalue'].split(',')
                        for key in body.keys():
                            if key == attribute['name']:
                                if body[key] not in listvalue:
                                    message = "Server attribute " + key + " for server " + body['server_name'] + " is '" + body[key] + "', does not match the list values '" + attribute['listvalue'] + "' defined in the Server schema"
                                    return {'headers': {'Access-Control-Allow-Origin': '*'},
                                            'statusCode': 400, 'body': message}

                # Merge new attributes with existing one
                for key in body.keys():
                    existing_attr['Item'][key] = body[key]
                new_attr = existing_attr
                keys = list(new_attr['Item'].keys())
                # Delete empty keys
                for key in keys:
                    if new_attr['Item'][key] == '':
                       del new_attr['Item'][key]
                       continue
                    if isinstance(new_attr['Item'][key], list):
                       if len(new_attr['Item'][key]) == 1 and new_attr['Item'][key][0] == '':
                            del new_attr['Item'][key]
                print(new_attr)
                resp = servers_table.put_item(
                Item=new_attr['Item']
                )
                return {'headers': {'Access-Control-Allow-Origin': '*'},
                        'body': json.dumps(resp)}
        else:
            return {'headers': {'Access-Control-Allow-Origin': '*'},
                    'statusCode': 401,
                    'body': json.dumps(authResponse)}

    elif event['httpMethod'] == 'DELETE':
        auth = MFAuth()
        authResponse = auth.getUserResourceCrationPolicy(event)
        if authResponse['action'] == 'allow':
            resp = servers_table.get_item(Key={'server_id': event['pathParameters']['serverid']})
            if 'Item' in resp:
                respdel = servers_table.delete_item(Key={'server_id': event['pathParameters']['serverid']})
                if respdel['ResponseMetadata']['HTTPStatusCode'] == 200:
                    return {'headers': {'Access-Control-Allow-Origin': '*'},
                            'statusCode': 200, 'body': "Server " + str(resp['Item']) + " was successfully deleted"}
                else:
                    return {'headers': {'Access-Control-Allow-Origin': '*'},
                            'statusCode': respdel['ResponseMetadata']['HTTPStatusCode'], 'body': json.dumps(respdel)}
            else:
                return {'headers': {'Access-Control-Allow-Origin': '*'},
                        'statusCode': 400, 'body': 'server Id: ' + str(event['pathParameters']['serverid']) + ' does not exist'}
        else:
            return {'headers': {'Access-Control-Allow-Origin': '*'},
                    'statusCode': 401,
                    'body': json.dumps(authResponse)}