diff --git a/app/controllers/order_controller.py b/app/controllers/order_controller.py index 6bcf2af1..43c2fa87 100644 --- a/app/controllers/order_controller.py +++ b/app/controllers/order_controller.py @@ -42,8 +42,8 @@ def create(request, user): return BaseController.send_error_api(None, result['message']) @staticmethod - def delete(id): - order = orderservice.delete(id) + def delete(id, user): + order = orderservice.delete(id, user) if order['error']: return BaseController.send_response_api(None, 'order not found') return BaseController.send_response_api(None, 'order with id: ' + id + ' has been succesfully deleted') diff --git a/app/controllers/order_verification_controller.py b/app/controllers/order_verification_controller.py index a006b138..cd14cbc6 100644 --- a/app/controllers/order_verification_controller.py +++ b/app/controllers/order_verification_controller.py @@ -37,7 +37,7 @@ def show(id, request): @staticmethod - def update(id, request): + def update(id, request, user): user_id = request.form['user_id'] if 'user_id' in request.form else None order_id = request.form['order_id'] if 'order_id' in request.form else None payment_proof = request.files['payment_proof'] if 'payment_proof' in request.files else None @@ -49,23 +49,23 @@ def update(id, request): } else: return BaseController.send_error_api(None, 'field is not complete') - result = orderverificationservice.update(id, payloads) + result = orderverificationservice.update(id, payloads, user) if not result['error']: return BaseController.send_response_api(result['data'], result['message']) else: return BaseController.send_error_api(result['data'], result['message']) @staticmethod - def delete(id): - data = orderverificationservice.delete(id) + def delete(id, user): + data = orderverificationservice.delete(id, user) if data['error']: return BaseController.send_error_api(data['data'], data['message']) return BaseController.send_response_api(data['data'], data['message']) @staticmethod - def verify(id, request): - data = orderverificationservice.verify(id) + def verify(id, request, User): + data = orderverificationservice.verify(id, User) if data['error']: return BaseController.send_error_api(data['data'], data['message']) return BaseController.send_response_api(data['data'], data['message']) diff --git a/app/controllers/payment_controller.py b/app/controllers/payment_controller.py index baf9538c..5150aac7 100644 --- a/app/controllers/payment_controller.py +++ b/app/controllers/payment_controller.py @@ -290,9 +290,9 @@ def authorize(request): return BaseController.send_response_api(result['data'], result['message']) @staticmethod - def status(id): + def status(id, user): - payment = paymentservice.update(id) + payment = paymentservice.update(id, user) if not payment['status_code'] == '404': return BaseController.send_response_api(payment, payment['data'], payment['message']) @@ -321,7 +321,7 @@ def card_number_validation(card_number): return ((sum % 10) == 0) @staticmethod - def confirm(request, user_id): + def confirm(request, user_id, User): transaction_id = request.json['transaction_id'] if 'transaction_id' in request.json else None order_id = request.json['order_id'] if 'order_id' in request.json else None if transaction_id and order_id: @@ -329,7 +329,7 @@ def confirm(request, user_id): 'transaction_id' : transaction_id, 'order_id' : order_id } - result = paymentservice.confirm(payload, user_id) + result = paymentservice.confirm(payload, user_id, User) if result['error']: return BaseController.send_error_api(result['data'], result['message']) return BaseController.send_response_api(result['data'], result['message']) diff --git a/app/models/logs.py b/app/models/logs.py new file mode 100644 index 00000000..6c20cace --- /dev/null +++ b/app/models/logs.py @@ -0,0 +1,20 @@ +import datetime + +from app.models import db +from app.models.base_model import BaseModel + + +class Logs(db.Model, BaseModel): + # table name + __tablename__ = 'logs' + + # visible fields + visible = ['id', 'description', 'created_at'] + + # columns definitions + id = db.Column(db.Integer, primary_key=True) + description = db.Column(db.Text) + created_at = db.Column(db.DateTime) + + def __init__(self): + self.created_at = datetime.datetime.now() diff --git a/app/routes/api.py b/app/routes/api.py index 8af97c2d..1b445cd3 100644 --- a/app/routes/api.py +++ b/app/routes/api.py @@ -185,10 +185,11 @@ def orders(*args, **kwargs): @api.route('/orders/', methods=['DELETE', 'GET']) @token_required def orders_id(id, *args, **kwargs): + user = kwargs['user'].as_dict() if(request.method == 'GET'): return OrderController.show(id) elif(request.method == 'DELETE'): - return OrderController.delete(id) + return OrderController.delete(id, user) @api.route('/orders//details', methods=['GET', 'POST']) @@ -566,15 +567,17 @@ def authorize_credit_card(*args, **kwargs): @api.route('/payments/status/', methods=['PATCH', 'PUT']) @token_required def status(id, *args, **kwargs): + user = kwargs['user'].as_dict() if (request.method == 'PATCH' or request.method == 'PUT'): - return PaymentController.status(id) + return PaymentController.status(id, user) @api.route('/payments/confirm', methods=['POST']) @token_required def confirm_payment(*args, **kwargs): + User = kwargs['user'].as_dict() user_id = kwargs['user'].id - return PaymentController.confirm(request, user_id) + return PaymentController.confirm(request, user_id, User) @api.route('/payments/', methods=['GET']) @@ -1011,20 +1014,21 @@ def order_verification_general (*args, **kwargs): @api.route('/order-verification/', methods=['PUT', 'PATCH', 'GET', 'DELETE']) @token_required def order_verification_id(id, *args, **kwargs): + user = kwargs['user'].as_dict() if (request.method == 'GET'): return OrderVerificationController.show(id, request) elif (request.method == 'PUT' or request.method == 'PATCH'): - return OrderVerificationController.update(id, request) + return OrderVerificationController.update(id, request, user) else: - return OrderVerificationController.delete(id) + return OrderVerificationController.delete(id, user) @api.route('/order-verification//verify', methods=['POST']) @token_required def verify_payment(id, *args, **kwargs): - user = kwargs['user'].as_dict() + User = kwargs['user'].as_dict() if user['role_id'] == ROLE['admin']: - return OrderVerificationController.verify(id, request) + return OrderVerificationController.verify(id, request, User) return 'Unauthorized' #Hackaton API diff --git a/app/services/logs_service.py b/app/services/logs_service.py new file mode 100644 index 00000000..6d6b5144 --- /dev/null +++ b/app/services/logs_service.py @@ -0,0 +1,23 @@ +import datetime +from app.models import db +from sqlalchemy.exc import SQLAlchemyError +from app.services.base_service import BaseService + +#import model class +from app.models.logs import Logs +from app.models.base_model import BaseModel +from app.builders.response_builder import ResponseBuilder + + +class LogsService(BaseService): + + def create_log(self, description): + response = ResponseBuilder() + self.log = Logs() + self.log.description = description + db.session.add(self.log) + try: + db.session.commit() + return response.set_message('Log has been create').set_data(None).build() + except SQLAlchemyError as e: + return response.set_message('Cant create log').set_data(e.orig.args).build() diff --git a/app/services/order_service.py b/app/services/order_service.py index 7f29b220..cd7ac0d0 100644 --- a/app/services/order_service.py +++ b/app/services/order_service.py @@ -4,6 +4,7 @@ import paypalrestsdk import datetime from sqlalchemy.exc import SQLAlchemyError +from app.services.logs_service import LogsService # import model class from app.models.order import Order from app.builders.response_builder import ResponseBuilder @@ -33,7 +34,7 @@ def __init__(self): # ticket = db.session.query(Ticket).filter_by(id=order['ticket_id']).first().as_dict() # item['name'] = ticket['ticket_type'] # item['quantity'] = str(order['count']) - # item['currency'] = payload['currency'] + # item['currency'] = "USD" # item['price'] = ticket['price'] # ord_det.append(item) @@ -45,8 +46,8 @@ def __init__(self): # }, # "transactions": [{ # "amount": { - # "currency":payload['currency'], - # "total": payload['gross_amount'] + # "currency":"USD", + # "total": 400000 # }, # "payee": { # "email": PAYPAL['payee'] @@ -63,6 +64,7 @@ def __init__(self): # result = payment.create() # if result: # self.get_paypal_detail(payment.id) + # print(payment.id) # else: # print(payment.error) # return payment @@ -148,10 +150,12 @@ def create(self, payloads, user): payment.transaction_time = datetime.datetime.now() payment.transaction_status = 'pending' db.session.add(payment) - db.session.commit() + db.session.commit() + + LogsService().create_log("Ticket id: " + ticket + " order from " + user['username'] + " has been created") - # if payloads['payment_type'] == 'paypal': - # self.paypalorder(payloads) + # if payloads['payment_type'] == 'paypal': + # self.paypalorder(payloads) # save all items return { 'error': False, @@ -165,7 +169,7 @@ def create(self, payloads, user): 'data': data } - def delete(self, id): + def delete(self, id, user): self.model_order = db.session.query(Order).filter_by(id=id) if self.model_order.first() is not None: self.model_order_details = db.session.query(OrderDetails).filter_by(order_id=self.model_order.first().id) @@ -174,6 +178,8 @@ def delete(self, id): self.model_order_payment.delete() db.session.commit() + LogsService().create_log("Ticket id: " + self.model_order_details['ticket_id'] + " order from " + user['username'] + " has been deleted") + # delete row self.model_order.delete() db.session.commit() diff --git a/app/services/order_verification_service.py b/app/services/order_verification_service.py index 84c4deff..66554cf0 100644 --- a/app/services/order_verification_service.py +++ b/app/services/order_verification_service.py @@ -15,6 +15,7 @@ from app.models.hacker_team import HackerTeam from app.models.user_hacker import UserHacker from app.services.base_service import BaseService +from app.services.logs_service import LogsService from app.builders.response_builder import ResponseBuilder from app.services.user_ticket_service import UserTicketService from app.services.redeem_code_service import RedeemCodeService @@ -83,7 +84,7 @@ def show(self, id): return response.set_error(True).set_message('data not found').set_data(None).build() - def update(self, id, payload): + def update(self, id, payload, user): response = ResponseBuilder() orderverification = db.session.query(OrderVerification).filter_by(id=id) data = orderverification.first().as_dict() if orderverification.first() else None @@ -101,13 +102,16 @@ def update(self, id, payload): 'updated_at': datetime.datetime.now() }) db.session.commit() + + LogsService().create_log(user['username'] + "'s payment from order id: " + payload['order_id'] + "has been updated") + data = orderverification.first() return response.set_data(data.as_dict()).build() except SQLAlchemyError as e: data = e.orig.args return response.set_error(True).set_data(data).build() - def delete(self, id): + def delete(self, id, user): response = ResponseBuilder() orderverification = db.session.query(OrderVerification).filter_by(id=id).first() if orderverification.payment_proof is not None: @@ -116,6 +120,9 @@ def delete(self, id): if orderverification.first() is not None: orderverification.delete() db.session.commit() + + LogsService().create_log(user['username'] + "'s payment from order id: " + orderverification['order_id'] + "has been Deleted") + return response.set_message('Order Verification entry was deleted').build() else: data = 'Entry not found' @@ -165,7 +172,7 @@ def create_hackaton (self, user): db.session.commit() return hacker_team.id - def verify(self, id): + def verify(self, id, User): response = ResponseBuilder() orderverification_query = db.session.query(OrderVerification).filter_by(id=id) orderverification = orderverification_query.first() @@ -220,6 +227,9 @@ def verify(self, id): }) db.session.commit() send_notification = FCMService().send_single_notification('Payment Status', 'Your payment has been verified', user.id, ROLE['admin']) + + LogsService().create_log(User['username'] + "'s payment from order id: " + items + "has been Verified") + return response.set_data(None).set_message('ticket purchased').build() else: return response.set_data(None).set_message('This payment has already verified').build() diff --git a/app/services/payment_service.py b/app/services/payment_service.py index 013f7b6b..0cdc3c6c 100644 --- a/app/services/payment_service.py +++ b/app/services/payment_service.py @@ -16,6 +16,7 @@ from app.models.user_ticket import UserTicket from app.services.user_ticket_service import UserTicketService from app.services.redeem_code_service import RedeemCodeService +from app.services.logs_service import LogsService from app.builders.response_builder import ResponseBuilder from app.services.fcm_service import FCMService from app.configs.constants import MIDTRANS_API_BASE_URL as url, SERVER_KEY @@ -459,7 +460,7 @@ def send_to_midtrans_api(self, payloads): message = payload['status_message'] if 'status_message' in payload else 'No message from payload' return response.set_data(payload).set_message(message).build() - def update(self, id): + def update(self, id, user): response = ResponseBuilder() # get the transaction id from payment table payment = db.session.query(Payment).filter_by(id=id).first() @@ -486,6 +487,7 @@ def update(self, id): }) db.session.commit() + LogsService().create_log(user['username'] + "'s payment has been Updated") if (payment.first().as_dict()['transaction_status'] == 'expire'): # on payment success self.save_paid_ticket(order) @@ -555,7 +557,7 @@ def get_paypal_detail(self, id): payment = False return payment - def confirm(self, payload, user_id): + def confirm(self, payload, user_id, User): response = ResponseBuilder() transaction_exist = db.session.query(Payment).filter_by(transaction_id=payload['transaction_id']).first() if transaction_exist: @@ -585,6 +587,9 @@ def confirm(self, payload, user_id): try: db.session.add(payment) db.session.commit() + + LogsService().create_log(User['username'] + "'s Payment has been " + payment.transaction_status) + except SQLAlchemyError as e: data = e.orig.args return response.set_data(None).set_message(data).set_error(True).build() @@ -640,6 +645,9 @@ def confirm(self, payload, user_id): }) db.session.commit() send_notification = FCMService().send_single_notification('Payment Status', 'Your payment has been confirmed', user.id, ROLE['admin']) + + LogsService().create_log(User['username'] + "'s Payment has been confirmed and allowed") + return response.set_data(None).set_message('Purchase Completed').build() else: return response.set_error(True).set_message('Paypal amount did not match').build() diff --git a/app/services/referal_service.py b/app/services/referal_service.py index df2a39d9..8182a838 100644 --- a/app/services/referal_service.py +++ b/app/services/referal_service.py @@ -6,6 +6,7 @@ from app.models.user import User from app.builders.response_builder import ResponseBuilder from app.services.user_ticket_service import UserTicketService +from app.services.logs_service import LogsService class ReferalService(): @@ -56,6 +57,9 @@ def reward_referal(self, user): }) db.session.commit() UserTicketService().create(payload) + + LogsService().create_log(user['username'] + " has been redeemed a reward ticket id: " + payload['ticket_id']) + return response.set_data(None).set_message('You have successfully redeemed your reward').build() diff --git a/app/services/user_service.py b/app/services/user_service.py index a32633aa..1c9d80bb 100644 --- a/app/services/user_service.py +++ b/app/services/user_service.py @@ -21,6 +21,7 @@ from app.configs.constants import ROLE # noqa from werkzeug.security import generate_password_hash from app.services.base_service import BaseService +from app.services.logs_service import LogsService from app.builders.response_builder import ResponseBuilder from app.models.base_model import BaseModel from app.services.user_ticket_service import UserTicketService @@ -87,6 +88,7 @@ def register(self, payloads): 'referal_count': referer.referal_count + 1 }) db.session.commit() + # checking referer add full day ticket if reach 10 counts if referer.referal_count > 0: referer_detail = db.session.query(User).filter_by(referal=payloads['referer']).first().as_dict() @@ -125,6 +127,9 @@ def register(self, payloads): self.model_user.hash_password(payloads['password']) db.session.add(self.model_user) db.session.commit() + + LogsService().create_log("A user named: " + payloads['username'] + " has just Registered") + data = self.model_user return data except SQLAlchemyError as e: diff --git a/migrations/versions/16aa39397e0e_create_logs_table.py b/migrations/versions/16aa39397e0e_create_logs_table.py new file mode 100644 index 00000000..1d76e47d --- /dev/null +++ b/migrations/versions/16aa39397e0e_create_logs_table.py @@ -0,0 +1,30 @@ +"""create logs table + + +Revision ID: 16aa39397e0e +Revises: 66237493cf86 +Create Date: 2017-10-18 15:05:16.692943 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '16aa39397e0e' +down_revision = '66237493cf86' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'logs', + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('description', sa.Text()), + sa.Column('created_at', sa.DateTime) + ) + + +def downgrade(): + op.drop_table('logs')