Fix some verification and error reporting

This commit is contained in:
Corey 2024-05-03 06:51:09 +00:00
parent c9378ceb8c
commit 5de61c7a8a
3 changed files with 36 additions and 16 deletions

View File

@ -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:

View File

@ -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.")

View File

@ -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,