From 41e7ae17dec7be7f592fc08409888a23578407c9 Mon Sep 17 00:00:00 2001 From: guoshijiang Date: Wed, 13 Mar 2024 13:30:05 +0800 Subject: [PATCH] finish airdrop api development --- airdrop/migrations/0001_initial.py | 10 +-- airdrop/models.py | 18 ++++- airdrop_api.md | 111 +++++++++++++++++++++++++++++ api/airdrop/api.sh | 4 -- api/airdrop/api_v1.py | 55 ++++++++++++-- api/urls.py | 4 ++ 6 files changed, 186 insertions(+), 16 deletions(-) create mode 100644 airdrop_api.md delete mode 100644 api/airdrop/api.sh diff --git a/airdrop/migrations/0001_initial.py b/airdrop/migrations/0001_initial.py index f3f8315..4217d5f 100644 --- a/airdrop/migrations/0001_initial.py +++ b/airdrop/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.1 on 2024-03-03 03:11 +# Generated by Django 4.1.1 on 2024-03-13 05:29 from django.db import migrations, models import django.db.models.deletion @@ -19,7 +19,9 @@ class Migration(migrations.Migration): ('uuid', models.CharField(blank=True, max_length=100, null=True, unique=True)), ('created_at', models.DateTimeField(auto_now_add=True, db_index=True)), ('updated_at', models.DateTimeField(auto_now=True, db_index=True)), - ('name', models.CharField(default='unknown', max_length=100, unique=True, verbose_name='用户名')), + ('name', models.CharField(default='unknown', max_length=100, verbose_name='用户名')), + ('invite_code', models.CharField(default='0000-0000-0000', max_length=100, unique=True, verbose_name='邀请码')), + ('invite_me_uuid', models.CharField(default='0000-0000-0000', max_length=100, verbose_name='邀请人')), ('photo', models.ImageField(blank=True, null=True, upload_to='symbol/%Y/%m/%d/')), ('address', models.CharField(max_length=100, unique=True, verbose_name='用户地址')), ('email', models.EmailField(blank=True, max_length=254, null=True)), @@ -41,8 +43,8 @@ class Migration(migrations.Migration): ('uuid', models.CharField(blank=True, max_length=100, null=True, unique=True)), ('created_at', models.DateTimeField(auto_now_add=True, db_index=True)), ('updated_at', models.DateTimeField(auto_now=True, db_index=True)), - ('address', models.CharField(max_length=100, unique=True, verbose_name='用户地址')), - ('type', models.CharField(choices=[('BridgeTransfer', 'BridgeTransfer'), ('BridgeStaking', 'BridgeStaking')], default='BridgeTransfer', max_length=100, verbose_name='交易类别')), + ('address', models.CharField(max_length=100, verbose_name='用户地址')), + ('type', models.CharField(choices=[('Invite', 'Invite'), ('BridgeTransfer', 'BridgeTransfer'), ('BridgeStaking', 'BridgeStaking')], default='BridgeTransfer', max_length=100, verbose_name='交易类别')), ('points', models.PositiveIntegerField(default=0, verbose_name='积分数量')), ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='airdrop_user', to='airdrop.airdropuser', verbose_name='收藏的商家')), ], diff --git a/airdrop/models.py b/airdrop/models.py index 5f86ca7..b26a372 100644 --- a/airdrop/models.py +++ b/airdrop/models.py @@ -2,16 +2,28 @@ from common.models import BaseModel, Asset -TypeChoice = [(x, x) for x in ['BridgeTransfer', 'BridgeStaking']] +TypeChoice = [(x, x) for x in ['Invite', 'BridgeTransfer', 'BridgeStaking']] class AirdropUser(BaseModel): name = models.CharField( default="unknown", max_length=100, - unique=True, + unique=False, verbose_name='用户名' ) + invite_code = models.CharField( + default="0000-0000-0000", + max_length=100, + unique=True, + verbose_name='邀请码' + ) + invite_me_uuid = models.CharField( + default="0000-0000-0000", + max_length=100, + unique=False, + verbose_name='邀请人' + ) photo = models.ImageField( upload_to='symbol/%Y/%m/%d/', blank=True, @@ -92,7 +104,7 @@ class PointsRecord(BaseModel): ) address = models.CharField( max_length=100, - unique=True, + unique=False, verbose_name='用户地址' ) type = models.CharField( diff --git a/airdrop_api.md b/airdrop_api.md new file mode 100644 index 0000000..ce6d3d2 --- /dev/null +++ b/airdrop_api.md @@ -0,0 +1,111 @@ +# 空投接口 + +## 1. 获取邀请码 + +接口请求 +``` +curl --location 'http://127.0.0.1:8000/api/get_invite_code_by_address' \ +--header 'Content-Type: application/json' \ +--data '{ + "address": "0xe3b4ECd2EC88026F84cF17fef8bABfD9184C94F0" +}' +``` +返回值 + +``` +{ + "ok": true, + "code": 200, + "result": { + "invite_code": "0000-0000-0000" + } +} +``` + + +## 2. 提交邀请信息 + +接口请求 +``` +curl --location 'http://127.0.0.1:8000/api/submit_invite_info' \ +--header 'Content-Type: application/json' \ +--data '{ + "invite_code": "0000-0000-0000", + "address": "0xe3b4ECd2EC88026F84cF17fef8bABfD9184C94F1" +}' +``` +返回值 + +``` +{ + "ok": true, + "code": 200, + "result": {} +} +``` + + +## 3. 获取个人信息和积分 + +接口请求 +``` +curl --location 'http://127.0.0.1:8000/api/get_points_by_address' \ +--header 'Content-Type: application/json' \ +--data '{ + "address": "0xe3b4ECd2EC88026F84cF17fef8bABfD9184C94F1" +}' +``` +返回值 + +``` +{ + "ok": true, + "code": 200, + "result": { + "id": 5, + "name": "unknown", + "photo": "", + "address": "0xe3b4ECd2EC88026F84cF17fef8bABfD9184C94F1", + "email": null, + "points": 0, + "x_twitter": "", + "discord": "", + "telegram": "", + "info": "" + } +} +``` + + +## 4. 根据地址获取积分记录 + +接口请求 +``` +curl --location 'http://127.0.0.1:8000/api/get_points_record_by_address' \ +--header 'Content-Type: application/json' \ +--data '{ + "address": "0xe3b4ECd2EC88026F84cF17fef8bABfD9184C94F0" +}' +``` +返回值 + +``` +{ + "ok": true, + "code": 200, + "result": { + "total": 1, + "points": [ + { + "id": 1, + "name": "0xe3b4ECd2EC88026F84cF17fef8bABfD9184C94F0", + "type": "BridgeTransfer", + "points": 1 + } + ] + } +} +``` + + + diff --git a/api/airdrop/api.sh b/api/airdrop/api.sh deleted file mode 100644 index 72d49bc..0000000 --- a/api/airdrop/api.sh +++ /dev/null @@ -1,4 +0,0 @@ -curl --location --request POST 'http://127.0.0.1:8000/api/get_points_by_address' --header 'Content-Type: application/json' --data-raw '{"address": "0xe3b4ECd2EC88026F84cF17fef8bABfD9184C94F0" }' - - -curl --location --request POST 'http://127.0.0.1:8000/api/get_points_record_by_address' --header 'Content-Type: application/json' --data-raw '{"address": "0xe3b4ECd2EC88026F84cF17fef8bABfD9184C94F0" }' \ No newline at end of file diff --git a/api/airdrop/api_v1.py b/api/airdrop/api_v1.py index b88d372..3bc77b5 100644 --- a/api/airdrop/api_v1.py +++ b/api/airdrop/api_v1.py @@ -1,15 +1,61 @@ -#encoding=utf-8 +# encoding=utf-8 import json +import uuid + from common.helpers import ( ok_json, error_json ) from airdrop.models import ( - AirdropUser, - PointsRecord + AirdropUser, + PointsRecord ) + +# @check_api_token +def get_invite_code_by_address(request): + params = json.loads(request.body.decode()) + address = params.get("address", None) + if address is not None: + airdrop_user = AirdropUser.objects.filter(address=address).first() + if airdrop_user is not None: + data = { + "invite_code": airdrop_user.invite_code, + } + return ok_json(data) + else: + return error_json("address is not exist", 4000) + else: + return error_json("address is none", 4000) + + +# @check_api_token +def submit_invite_info(request): + params = json.loads(request.body.decode()) + address = params.get("address", None) + invite_code = params.get("invite_code", None) + if address is None or invite_code is None: + return error_json("address or invite_code params is empty", 4000) + invite_user = AirdropUser.objects.filter(invite_code=invite_code).first() + if invite_user is None: + return error_json("This user is not exist", 4000) + AirdropUser.objects.create( + invite_code=uuid.uuid4(), + invite_me_uuid=invite_user.uuid, + address=address + ) + if invite_user.points < 10: + invite_user.points = invite_user.points + 2 + invite_user.save() + PointsRecord.objects.create( + user=invite_user, + address=invite_user.address, + type='Invite', + points=2 + ) + return ok_json({}) + # @check_api_token def get_points_by_address(request): params = json.loads(request.body.decode()) @@ -22,6 +68,7 @@ def get_points_by_address(request): else: return error_json("No this user address points", 4000) + # @check_api_token def get_points_record_by_address(request): params = json.loads(request.body.decode()) @@ -42,5 +89,3 @@ def get_points_record_by_address(request): "points": point_list, } return ok_json(data) - - diff --git a/api/urls.py b/api/urls.py index 8d73114..0e9293d 100644 --- a/api/urls.py +++ b/api/urls.py @@ -55,6 +55,8 @@ from api.airdrop.api_v1 import ( get_points_by_address, get_points_record_by_address, + get_invite_code_by_address, + submit_invite_info ) urlpatterns = [ @@ -105,6 +107,8 @@ path(r'get_tokens', get_tokens, name='get_tokens'), # airdrop + path(r'get_invite_code_by_address', get_invite_code_by_address, name='get_invite_code_by_address'), + path(r'submit_invite_info', submit_invite_info, name='submit_invite_info'), path(r'get_points_by_address', get_points_by_address, name='get_points_by_address'), path(r'get_points_record_by_address', get_points_record_by_address, name='get_points_record_by_address'), ] \ No newline at end of file