Ctrl K
ComunidadGuías…

graphvl/schema.py

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import graphene
import base64
import cv2

from fastapi import FastAPI
from starlette.graphql import GraphQLApp

from graphvl.scalar import Date
from graphvl.utils import utils, verification_utils
from graphvl.models.user import UserCreate
from graphvl.models.image import ImageCreate, ImageType
from graphvl import crud
from graphvl.db.session import db_session

from datetime import datetime


class User(graphene.ObjectType):
    country = graphene.String(required=True, description="Living country of user")
    date_of_birth = Date(
        required=True, description="Born date of user in format of dd-MM-yyyy"
    )
    name = graphene.String(required=True, description="Name of user")
    surname = graphene.String(required=True, description="Surname of user")
    user_id = graphene.String(description="Unique id defined by api")


class CreateUser(graphene.Mutation):
    class Arguments:
        country = graphene.String(required=True, description="Living country of user")
        date_of_birth = Date(
            required=True, description="Born date of user in format of dd-MM-yyyy"
        )
        name = graphene.String(required=True, description="Name of user")
        surname = graphene.String(required=True, description="Surname of user")

    ok = graphene.Boolean(description="Defines success or fail")
    user = graphene.Field(lambda: User, description="Details of user")

    def mutate(self, info, country, date_of_birth, name, surname):
        user_id = utils.create_user_id()
        user_in = UserCreate(
            user_id=user_id,
            name=name,
            surname=surname,
            date_of_birth=date_of_birth,
            country=country,
        )
        user = crud.user.create(db_session, user_in=user_in)
        ok = True
        return CreateUser(user=user, ok=ok)


class UserMutation(graphene.ObjectType):
    create_user = CreateUser.Field(
        description="Creates a new user with given parameters"
    )


class UserQuery(graphene.ObjectType):
    user = graphene.Field(
        User, user_id=graphene.String(), description="Query user by user id"
    )

    def resolve_user(self, info, user_id):
        return crud.user.get(db_session=db_session, user_id=user_id)


class Image(graphene.ObjectType):
    user_id = graphene.String(
        required=True, description="UserId created with a new user"
    )
    image_str = graphene.String(
        required=True, description="Base64 encoded binary string of image"
    )
    image_type = graphene.Int(
        required=True, description="Image file type identity = 1, profile = 2"
    )


class CreateImage(graphene.Mutation):
    class Arguments:
        user_id = graphene.String(
            required=True, description="UserId created with a new user"
        )
        image_str = graphene.String(
            required=True, description="Base64 encoded binary string of image"
        )
        image_type = graphene.Enum.from_enum(ImageType)(
            required=True, description="Image file type identity = 1, profile = 2"
        )

    ok = graphene.Boolean(description="Defines success or fail")
    image = graphene.Field(lambda: Image, description="Details of image")

    def mutate(self, info, user_id, image_str, image_type):
        image_in = ImageCreate(
            user_id=user_id, image_str=image_str, image_type=image_type
        )
        image = crud.image.create(db_session, image_in=image_in)
        ok = True
        return CreateImage(image=image, ok=ok)


class ImageMutation(graphene.ObjectType):
    create_image = CreateImage.Field(
        description="Uploads user image with given parameters"
    )


class ImageQuery(graphene.ObjectType):
    image = graphene.Field(
        Image, user_id=graphene.String(), description="Query image by user id"
    )

    def resolve_image(self, info, user_id):
        return crud.image.get(
            db_session=db_session, user_id=user_id, image_type=ImageType.identity
        )


class Verify(graphene.Mutation):
    class Arguments:
        user_id = graphene.String(
            required=True, description="UserId created with a new user"
        )
        language = graphene.String(
            required=True, description="Language model for verification"
        )

    ok = graphene.Boolean(description="Defines success or fail")
    verification_rate = graphene.Float(
        description="Value of verification between 0 and 1"
    )

    def mutate(self, info, user_id, language):
        user = crud.user.get(db_session, user_id=user_id)
        verification_utils.create_image_file(
            user_id=user_id, image_type=ImageType.identity
        )
        verification_utils.create_image_file(
            user_id=user_id, image_type=ImageType.profile
        )
        texts = verification_utils.get_texts(user_id=user_id)
        doc_text_label = verification_utils.get_doc(texts=texts, language=language)
        if not doc_text_label:
            ok = False
            return Verify(verification_rate=0, ok=ok)

        user_text_label = verification_utils.create_user_text_label(user)
        text_validation_point = verification_utils.validate_text_label(
            doc_text_label, user_text_label
        )
        print("text_validation_point: " + str(text_validation_point))
        names = verification_utils.recognize_face(user_id)
        if not names:
            ok = False
            return Verify(verification_rate=0, ok=ok)

        face_validation_point = verification_utils.point_on_recognition(names, user_id)
        print("face_validation_point: " + str(face_validation_point))
        verification_rate = text_validation_point + face_validation_point

        ok = True
        return Verify(verification_rate=verification_rate, ok=ok)


class VerifyMutation(graphene.ObjectType):
    verify = Verify.Field(description="Verify user identity with given parameters")


class VerifyQuery(graphene.ObjectType):
    verify = graphene.Field(Verify, description="Verify object")


class Query(UserQuery, ImageQuery, graphene.ObjectType):
    pass


class Mutation(UserMutation, ImageMutation, VerifyMutation, graphene.ObjectType):
    pass