Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions one-and-half-nibble/Backend/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#This is Backend
2 changes: 2 additions & 0 deletions one-and-half-nibble/Backend/fanex-admin-app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
flow.json
.env
10 changes: 10 additions & 0 deletions one-and-half-nibble/Backend/fanex-admin-app/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Flas app for admin panel of Dapp Rewards(Fanex)

## create virtual env
- `virtualenv -p python3 venv`
- `source /venv/bin/activate`
## install flow cli (mac)
- `brew install flow-cli`
## run flask project port 5000
- `python run.py`

11 changes: 11 additions & 0 deletions one-and-half-nibble/Backend/fanex-admin-app/app/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import os
from flask import Flask

project_dir = os.path.dirname(os.path.abspath(__file__))

app = Flask(__name__)


from app.rewards.controller import *
from app.social_rewards.controller import *
from app.airdrop.controller import *
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@

from flask import Response, request
from app.airdrop.service import AirDropService
from flask_restful import Resource, Api
from app import app
import json
from http import HTTPStatus

api = Api(app)

@api.resource('/airdrop')
class AirDropController(Resource):
def post(self):
request_json = request.json
print('airdrop request: ', request_json)

response = AirDropService().assign_token_to_wallet(request_json)
error_msg = {
"status": "error"
}
if response:

return Response(
response=json.dumps(response,sort_keys=True, default=str),
status=HTTPStatus.OK,
content_type='application/json')
else:
return Response(response=json.dumps(error_msg),
status=HTTPStatus.NOT_FOUND,
content_type='application/json')
16 changes: 16 additions & 0 deletions one-and-half-nibble/Backend/fanex-admin-app/app/airdrop/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from datetime import datetime
from app.db.mongo_db import MongoAPI
from bson.objectid import ObjectId
import uuid

db_data = {
"collection": "airdrop_audit"
}
class AirDropAudit:

def create(self, data):

mongo_api = MongoAPI(db_data)

response = mongo_api.write(data)
return response
50 changes: 50 additions & 0 deletions one-and-half-nibble/Backend/fanex-admin-app/app/airdrop/service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@

from app.airdrop.models import AirDropAudit
import subprocess
from datetime import datetime

db_data = {
"collection": "airdrop"
}

flow_cmd = """flow transactions send /Users/livspace/Documents/web3/Dapp-Rewards/SmartContract/transactions/add-token-to-vault.cdc {no_of_token} {wallet_address} --authorizer "my-testnet-account" --gas-limit 50 --payer "my-testnet-account" --proposer "my-testnet-account" -n testnet -f /Users/livspace/Documents/web3/Dapp-Rewards/backend/fanex-admin-app/flow.json"""

class AirDropService:
def audit_airdrop(self, data):
audit = AirDropAudit().create({"Document":data})
print('audit log:', audit)
return

def run_flow_cmd(self, flow_cmd):
"""
add token to wallet
cmd to run flow API from cli
"""
print('start flow cmd: ', datetime.now())
p1 = subprocess.run([flow_cmd], shell=True)
print('end flow cmd: ', datetime.now())

print(p1)

def assign_token_to_wallet(self, request_data):

wallet_address = request_data["wallet_address"]
no_of_token = request_data["no_of_token"]

try:

# audit log
self.audit_airdrop(request_data)

flow_cmd_modified = flow_cmd.format(no_of_token=no_of_token, wallet_address=wallet_address)

# call SDK
self.run_flow_cmd(flow_cmd_modified)

except Exception as e:
print('Exception in assign_token_to_wallet: ', e)
return

return {
"status": "success"
}
Empty file.
53 changes: 53 additions & 0 deletions one-and-half-nibble/Backend/fanex-admin-app/app/db/mongo_db.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# from logging import log
from pymongo import MongoClient
from settings import MONGO_URI, DB_NAME
import datetime
class MongoAPI:
def __init__(self, data):
self.client = MongoClient(MONGO_URI)

database = DB_NAME
collection = data['collection']
cursor = self.client[database]
self.collection = cursor[collection]
self.data = data


def delete(self, data):
filt = data['Document']
response = self.collection.delete_one(filt)
output = {'Status': 'Successfully Deleted' if response.deleted_count > 0 else "Document not found."}
return output

def update(self):
filt = self.data['Filter']
updated_data = {"$set": self.data['DataToBeUpdated']}
response = self.collection.update_one(filt, updated_data)
output = {'Status': 'Successfully Updated' if response.modified_count > 0 else "Nothing was updated."}
return output

def read_all(self, filter=None):
if filter:
print(filter)
documents = self.collection.find(filter)

else:
documents = self.collection.find()

list_documents = list(documents)
return list_documents

def read(self):
documents = self.collection.find()
print(documents)
output = [{item: data[item] for item in data if item != '_id'}
for data in documents]
return output

def write(self, data):
print('Writing Data')
new_document = data['Document']

response = self.collection.insert_one(new_document)

return response
Empty file.
27 changes: 27 additions & 0 deletions one-and-half-nibble/Backend/fanex-admin-app/app/rewards/const.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@

from enum import Enum

class RewardStatus(Enum):
REDEEMED = 1
NOT_REDEEMED = 2
IN_PROGRESS = 3
EXPIRED = 4

class Events(Enum):
ONBOARDING = 1
SOCIAL_MEDIA_TWITTER = 2
QR_SCAN = 3


ONBOARDING_EVENT = "ONBOARDING"
SOCIAL_MEDIA_TWITTER_EVENT = "SOCIAL_MEDIA_TWITTER"
QR_SCAN_EVENT = "QR_SCAN"
DEFAULT_EVENT = "DEFAULT_EVENT"


EVENTS_CONSTANT = {
'onboarding': ONBOARDING_EVENT,
'twitter': SOCIAL_MEDIA_TWITTER_EVENT,
'qr_scan': QR_SCAN_EVENT,
'default': DEFAULT_EVENT
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
from flask import Response, request
from app.rewards.service import RewardsService
from flask_restful import Resource, Api
from app import app
import json
from http import HTTPStatus

api = Api(app)

# TODO: add autherization
@api.resource('/reward')
class Reward(Resource):
def get(self, id):
print(id)
response = RewardsService().get_reward(id)
if response:
return Response(response=json.dumps(response),
status=HTTPStatus.OK,
content_type='application/json')
return Response(status=HTTPStatus.INTERNAL_SERVER_ERROR)

def get(self):
response = dict()
try:
response = RewardsService().get_all_rewards()
except Exception as e:
print("Exception in get all: ", e)
return Response(status=HTTPStatus.INTERNAL_SERVER_ERROR)

if response:
print('****', type(response))

return Response(
response=json.dumps(response,sort_keys=True, default=str),
status=HTTPStatus.OK,
content_type='application/json')
else:
return Response(response="No data found",
status=HTTPStatus.NOT_FOUND,
content_type='application/json')

def post(self):
"""
reward object: {
'reward_id': get_uuid(),
'created_at': datetime.now(),
'updated_at': datetime.now(),
'wallet_address': data['wallet_address'],
'no_of_tokens': data['no_of_tokens'],
'status': data['status'],
'event': data['event']
}
"""
# validate request
request_json = request.json

print('Reward request: ', request_json)

wallet_address = request_json.get("wallet_address")
expiry_datetime = request_json.get("expiry_datetime")
no_of_tokens = request_json.get("no_of_tokens")
event = request_json.get("event")

if (not all([wallet_address, expiry_datetime, no_of_tokens, event])):
return Response(status=HTTPStatus.BAD_REQUEST)

request_data = {
"wallet_address": wallet_address,
"no_of_tokens": no_of_tokens,
"expiry_datetime": expiry_datetime,
"event": event
}

response = RewardsService().create_reward(request_data)

if response:
return Response(response=json.dumps(response),
status=HTTPStatus.CREATED,
content_type='application/json')
return Response(status=HTTPStatus.INTERNAL_SERVER_ERROR)

# api.add_resource(Drop, '/drop/<int:id>', '/drop')
# api.add_resource(Drop, '/drop/<int:id>')
# api.add_resource(Drop, '/drop')
38 changes: 38 additions & 0 deletions one-and-half-nibble/Backend/fanex-admin-app/app/rewards/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from datetime import datetime
from app.db.mongo_db import MongoAPI
from bson.objectid import ObjectId
import uuid

class BaseModel:
# TODO: add common fields here date time etc
pass

def get_uuid():
return str(uuid.uuid4());

db_data = {
"collection": "rewards"
}

class Reward:

def create(self, data):
reward = {
'reward_id': get_uuid(),
'created_at': datetime.now(),
'updated_at': datetime.now(),
'expiry_datetime': data['expiry_datetime'],
'wallet_address': data['wallet_address'],
'no_of_tokens': data['no_of_tokens'],
'status': data['status'],
'event': data['event']
}
mongo_api = MongoAPI(db_data)
response = mongo_api.write({"Document": reward})
return response

def get(self, id):
print("id", id)
mongo_api = MongoAPI(db_data)
response = mongo_api.read_all({"reward_id": {"$eq": id}})
return response
44 changes: 44 additions & 0 deletions one-and-half-nibble/Backend/fanex-admin-app/app/rewards/service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from app.db.mongo_db import MongoAPI
from app.rewards.models import Reward
from app.rewards.const import RewardStatus, EVENTS_CONSTANT



db_data = {
"collection": "rewards"
}
class RewardsService:

# def __init__(self) -> None:
# MongoAPI(db_data)

def get_all_rewards(self):
obj1 = MongoAPI(db_data)
response = obj1.read_all()
print(response)
return response

def get_reward(self, id):
obj1 = MongoAPI(db_data)
db_data["id"] = id
response = obj1.read()
print(response)
return response



def create_reward(self, request_data):

status = RewardStatus.NOT_REDEEMED.name
event = EVENTS_CONSTANT.get(request_data['event'])
request_data['status'] = status
request_data['event'] = event if event else EVENTS_CONSTANT['default']

reward = Reward().create(request_data)

response = {
'status': 'Successfully Inserted',
'document_id': str(reward.inserted_id)
}

return response
Loading