mirror of https://github.com/cocosolos/ixion.git
Fix some verification and error reporting
This commit is contained in:
parent
c9378ceb8c
commit
5de61c7a8a
|
|
@ -35,6 +35,11 @@ class OptionalSchemeURLValidator(URLValidator):
|
||||||
super(OptionalSchemeURLValidator, self).__call__(value)
|
super(OptionalSchemeURLValidator, self).__call__(value)
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: Validation should be probably be moved to `clean` method instead of `save`.
|
||||||
|
# Currently the serializer handles ValidationError during input, and the only
|
||||||
|
# other thing calling `save` should be the management tasks which should already
|
||||||
|
# be validated so should be safe?
|
||||||
|
# https://docs.djangoproject.com/en/5.0/ref/models/instances/#validating-objects
|
||||||
class Server(models.Model):
|
class Server(models.Model):
|
||||||
name = models.CharField(max_length=255, null=True, editable=False)
|
name = models.CharField(max_length=255, null=True, editable=False)
|
||||||
url = models.CharField(
|
url = models.CharField(
|
||||||
|
|
@ -74,6 +79,11 @@ class Server(models.Model):
|
||||||
parsed_url = urlparse(self.url)
|
parsed_url = urlparse(self.url)
|
||||||
self.url = parsed_url.netloc.lower()
|
self.url = parsed_url.netloc.lower()
|
||||||
|
|
||||||
|
# Check if formatted server URL is unique
|
||||||
|
existing_server = Server.objects.filter(url=self.url).first()
|
||||||
|
if existing_server:
|
||||||
|
raise ValidationError("A server with this URL already exists.")
|
||||||
|
|
||||||
# Validate the server API
|
# Validate the server API
|
||||||
if not self.parse_server_api():
|
if not self.parse_server_api():
|
||||||
if not self.created:
|
if not self.created:
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,8 @@ class ServerDetailsViewSet(
|
||||||
def get_object(self):
|
def get_object(self):
|
||||||
queryset = self.filter_queryset(self.get_queryset())
|
queryset = self.filter_queryset(self.get_queryset())
|
||||||
url_param = self.request.query_params.get("url")
|
url_param = self.request.query_params.get("url")
|
||||||
if url_param is not None:
|
if url_param:
|
||||||
|
url_param = url_param.lower()
|
||||||
try:
|
try:
|
||||||
return queryset.get(url=url_param)
|
return queryset.get(url=url_param)
|
||||||
except Server.DoesNotExist:
|
except Server.DoesNotExist:
|
||||||
|
|
@ -66,34 +67,43 @@ class ServerDetailsViewSet(
|
||||||
return super().get_object()
|
return super().get_object()
|
||||||
|
|
||||||
def create_server(self, url_param):
|
def create_server(self, url_param):
|
||||||
try:
|
serializer = self.get_serializer(data={"url": url_param})
|
||||||
serializer = self.get_serializer(data={"url": url_param})
|
serializer.is_valid(raise_exception=True)
|
||||||
serializer.is_valid(raise_exception=True)
|
self.perform_create(serializer)
|
||||||
self.perform_create(serializer)
|
return serializer.instance
|
||||||
return serializer.instance
|
|
||||||
except ValidationError as e:
|
|
||||||
raise Http404(e.message)
|
|
||||||
|
|
||||||
def create(self, request, *args, **kwargs):
|
def create(self, request, *args, **kwargs):
|
||||||
url_param = request.data.get("url")
|
url_param = request.data.get("url")
|
||||||
if url_param:
|
if url_param:
|
||||||
|
url_param = url_param.lower()
|
||||||
try:
|
try:
|
||||||
server = Server.objects.get(url=url_param)
|
server = Server.objects.get(url=url_param)
|
||||||
serializer = self.get_serializer(server)
|
serializer = self.get_serializer(server)
|
||||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||||
except Server.DoesNotExist:
|
except Server.DoesNotExist:
|
||||||
instance = self.create_server(url_param)
|
try:
|
||||||
serializer = self.get_serializer(instance)
|
instance = self.create_server(url_param)
|
||||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
serializer = self.get_serializer(instance)
|
||||||
|
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||||
|
except ValidationError as e:
|
||||||
|
return Response(
|
||||||
|
{"url": e.messages}, status=status.HTTP_400_BAD_REQUEST
|
||||||
|
)
|
||||||
|
|
||||||
def list(self, request, *args, **kwargs):
|
def list(self, request, *args, **kwargs):
|
||||||
queryset = self.filter_queryset(self.get_queryset())
|
queryset = self.filter_queryset(self.get_queryset())
|
||||||
url_param = self.request.query_params.get("url")
|
url_param = self.request.query_params.get("url")
|
||||||
if url_param is not None:
|
if url_param:
|
||||||
|
url_param = url_param.lower()
|
||||||
queryset = queryset.filter(url=url_param)
|
queryset = queryset.filter(url=url_param)
|
||||||
if not queryset.exists():
|
if not queryset.exists():
|
||||||
instance = self.create_server(url_param)
|
try:
|
||||||
serializer = self.get_serializer(instance)
|
instance = self.create_server(url_param)
|
||||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
serializer = self.get_serializer(instance)
|
||||||
|
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||||
|
except ValidationError as e:
|
||||||
|
return Response(
|
||||||
|
{"url": e.messages}, status=status.HTTP_400_BAD_REQUEST
|
||||||
|
)
|
||||||
return self.retrieve(request, *args, **kwargs)
|
return self.retrieve(request, *args, **kwargs)
|
||||||
raise Http404("No URL provided.")
|
raise Http404("No URL provided.")
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ export const postData = async (inputText: string) => {
|
||||||
// bad url or duplicate
|
// bad url or duplicate
|
||||||
if (response.status === 400) {
|
if (response.status === 400) {
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
message = responseData.url;
|
message = responseData.url || responseData.detail;
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
message,
|
message,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue