views.py 1.66 KB
import random
import json
import traceback
from io import StringIO
from logging import getLogger
from pyramid.view import view_config
from pyramid.response import Response
from cryptography.exceptions import InvalidSignature
from pyramid_snap.view import Base
from pyramid_snap.structure import (
    SERVICE_VA_CREATE,
    RC_UNKNOWN_ERROR,
    VA_FIELDS,
)
from pyramid_snap.decorator import (
    json_method,
    create_response,
)
from pyramid_snap.validation import BaseError


def exception_message():
    f = StringIO()
    traceback.print_exc(file=f)
    s = f.getvalue()
    f.close()
    return s


@view_config(context=Exception)
def view_exception(exc, request):
    log = getLogger('view_exception')
    log.error(exception_message())
    if isinstance(exc, BaseError):
        msg = exc[0]
    elif isinstance(exc, InvalidSignature):
        msg = 'Signature tidak valid'
    else:
        msg = 'Ada kesalahan yang belum dipahami'
    resp = create_response('00', RC_UNKNOWN_ERROR, msg)
    try:
        d = resp.json
    except json.decoder.JSONDecodeError:
        d = [resp.text]  # Agar tetap 1 baris
    log.error(
        'to %s headers %s response %s', request.client_addr,
        dict(resp.headers), d)
    return resp


def nomor_acak(jml: int) -> str:
    return '08899' + ''.join(
        str(random.randint(0, 9)) for _ in range(jml))


class API(Base):
    @json_method(
        route_name='create-va', service_code=SERVICE_VA_CREATE,
        fields=VA_FIELDS)
    def create_va(self, params: dict) -> dict:
        vacc = nomor_acak(10)
        vacc_data = params.copy()
        vacc_data['virtualAccountNo'] = vacc
        return dict(virtualAccountData=vacc_data)