mirror of
https://github.com/RoboSats/robosats.git
synced 2024-12-14 03:16:24 +00:00
Merge pull request #4 from Reckless-Satoshi/make-order-api-endpoint
Implement initial API with MakeOrder endpoint. Has Order model and post-only view.
This commit is contained in:
commit
d5d706b99d
2
.gitignore
vendored
2
.gitignore
vendored
@ -635,3 +635,5 @@ MigrationBackup/
|
|||||||
# Fody - auto-generated XML schema
|
# Fody - auto-generated XML schema
|
||||||
FodyWeavers.xsd
|
FodyWeavers.xsd
|
||||||
|
|
||||||
|
# Django
|
||||||
|
*migrations*
|
||||||
|
0
api/__init__.py
Normal file
0
api/__init__.py
Normal file
3
api/admin.py
Normal file
3
api/admin.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
6
api/apps.py
Normal file
6
api/apps.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class ApiConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'api'
|
0
api/migrations/__init__.py
Normal file
0
api/migrations/__init__.py
Normal file
71
api/models.py
Normal file
71
api/models.py
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
from django.db import models
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from django.core.validators import MaxValueValidator, MinValueValidator
|
||||||
|
|
||||||
|
#############################
|
||||||
|
# TODO
|
||||||
|
# Load hparams from .env file
|
||||||
|
|
||||||
|
min_satoshis_trade = 10*1000
|
||||||
|
max_satoshis_trade = 500*1000
|
||||||
|
|
||||||
|
class Order(models.Model):
|
||||||
|
|
||||||
|
class Types(models.IntegerChoices):
|
||||||
|
BUY = 0, 'BUY'
|
||||||
|
SELL = 1, 'SELL'
|
||||||
|
|
||||||
|
class Currencies(models.IntegerChoices):
|
||||||
|
USD = 1, 'USD'
|
||||||
|
EUR = 2, 'EUR'
|
||||||
|
ETH = 3, 'ETH'
|
||||||
|
|
||||||
|
class Status(models.TextChoices):
|
||||||
|
WFB = 0, 'Waiting for bond'
|
||||||
|
PUB = 1, 'Published in order book'
|
||||||
|
DEL = 2, 'Deleted from order book'
|
||||||
|
TAK = 3, 'Taken'
|
||||||
|
UCA = 4, 'Unilaterally cancelled'
|
||||||
|
RET = 5, 'Returned to order book' # Probably same as 1 in most cases.
|
||||||
|
WF2 = 6, 'Waiting for trade collateral and buyer invoice'
|
||||||
|
WTC = 7, 'Waiting only for trade collateral'
|
||||||
|
WBI = 8, 'Waiting only for buyer invoice'
|
||||||
|
EXF = 9, 'Exchanging fiat / In chat'
|
||||||
|
CCA = 10, 'Collaboratively cancelled'
|
||||||
|
FSE = 11, 'Fiat sent'
|
||||||
|
FCO = 12, 'Fiat confirmed'
|
||||||
|
SUC = 13, 'Sucessfully settled'
|
||||||
|
FAI = 14, 'Failed lightning network routing'
|
||||||
|
UPI = 15, 'Updated invoice'
|
||||||
|
DIS = 16, 'In dispute'
|
||||||
|
MLD = 17, 'Maker lost dispute'
|
||||||
|
TLD = 18, 'Taker lost dispute'
|
||||||
|
EXP = 19, 'Expired'
|
||||||
|
|
||||||
|
# order info, id = models.CharField(max_length=64, unique=True, null=False)
|
||||||
|
status = models.PositiveSmallIntegerField(choices=Status.choices, default=Status.WFB)
|
||||||
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
|
|
||||||
|
# order details
|
||||||
|
type = models.PositiveSmallIntegerField(choices=Types.choices, null=False)
|
||||||
|
currency = models.PositiveSmallIntegerField(choices=Currencies.choices, null=False)
|
||||||
|
amount = models.DecimalField(max_digits=9, decimal_places=4, validators=[MinValueValidator(0.00001)])
|
||||||
|
premium = models.DecimalField(max_digits=3, decimal_places=2, default=0, null=True, validators=[MinValueValidator(-100), MaxValueValidator(1000)])
|
||||||
|
satoshis = models.PositiveBigIntegerField(null=True, validators=[MinValueValidator(min_satoshis_trade), MaxValueValidator(max_satoshis_trade)])
|
||||||
|
|
||||||
|
# order participants
|
||||||
|
maker = models.ForeignKey(User, related_name='maker', on_delete=models.SET_NULL, null=True, default=None) # unique = True, a maker can only make one order
|
||||||
|
taker = models.ForeignKey(User, related_name='taker', on_delete=models.SET_NULL, null=True, default=None) # unique = True, a taker can only take one order
|
||||||
|
|
||||||
|
# order collateral
|
||||||
|
has_maker_bond = models.BooleanField(default=False, null=False)
|
||||||
|
has_taker_bond = models.BooleanField(default=False, null=False)
|
||||||
|
has_trade_collat = models.BooleanField(default=False, null=False)
|
||||||
|
|
||||||
|
maker_bond_secret = models.CharField(max_length=300, unique=False, null=True, default=None)
|
||||||
|
taker_bond_secret = models.CharField(max_length=300, unique=False, null=True, default=None)
|
||||||
|
trade_collat_secret = models.CharField(max_length=300, unique=False, null=True, default=None)
|
||||||
|
|
||||||
|
# buyer payment LN invoice
|
||||||
|
has_invoice = models.BooleanField(default=False, null=False) # has invoice and is valid
|
||||||
|
invoice = models.CharField(max_length=300, unique=False, null=True, default=None)
|
12
api/serializers.py
Normal file
12
api/serializers.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
from rest_framework import serializers
|
||||||
|
from .models import Order
|
||||||
|
|
||||||
|
class OrderSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Order
|
||||||
|
fields = ('id','status','created_at','type','currency','amount','premium','satoshis','maker')
|
||||||
|
|
||||||
|
class MakeOrderSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Order
|
||||||
|
fields = ('type','currency','amount','premium','satoshis')
|
3
api/tests.py
Normal file
3
api/tests.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
6
api/urls.py
Normal file
6
api/urls.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from django.urls import path
|
||||||
|
from .views import MakeOrder
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('make/', MakeOrder.as_view())
|
||||||
|
]
|
40
api/views.py
Normal file
40
api/views.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
from rest_framework import generics, status
|
||||||
|
from rest_framework.views import APIView
|
||||||
|
from rest_framework.response import Response
|
||||||
|
|
||||||
|
from .serializers import OrderSerializer, MakeOrderSerializer
|
||||||
|
from .models import Order
|
||||||
|
|
||||||
|
# Create your views here.
|
||||||
|
|
||||||
|
class MakeOrder(APIView):
|
||||||
|
serializer_class = MakeOrderSerializer
|
||||||
|
|
||||||
|
def post(self,request, format=None):
|
||||||
|
|
||||||
|
serializer = self.serializer_class(data=request.data)
|
||||||
|
print(serializer)
|
||||||
|
if serializer.is_valid():
|
||||||
|
otype = serializer.data.get('type')
|
||||||
|
currency = serializer.data.get('currency')
|
||||||
|
amount = serializer.data.get('amount')
|
||||||
|
premium = serializer.data.get('premium')
|
||||||
|
satoshis = serializer.data.get('satoshis')
|
||||||
|
|
||||||
|
#################
|
||||||
|
# TODO
|
||||||
|
# query if the user is already a maker or taker, return error
|
||||||
|
|
||||||
|
# Creates a new order in db
|
||||||
|
order = Order(
|
||||||
|
type=otype,
|
||||||
|
currency=currency,
|
||||||
|
amount=amount,
|
||||||
|
premium=premium,
|
||||||
|
satoshis=satoshis)
|
||||||
|
order.save()
|
||||||
|
|
||||||
|
if not serializer.is_valid():
|
||||||
|
return Response(status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
return Response(OrderSerializer(order).data, status=status.HTTP_201_CREATED)
|
@ -37,6 +37,8 @@ INSTALLED_APPS = [
|
|||||||
'django.contrib.sessions',
|
'django.contrib.sessions',
|
||||||
'django.contrib.messages',
|
'django.contrib.messages',
|
||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
|
'rest_framework',
|
||||||
|
'api',
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
@ -14,8 +14,9 @@ Including another URLconf
|
|||||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||||
"""
|
"""
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.urls import path
|
from django.urls import path, include
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
]
|
path('api/', include('api.urls')),
|
||||||
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user