Received: from mail.netlandish.com (mail.netlandish.com [174.136.98.166])
	by code.netlandish.com (Postfix) with ESMTP id 35C65145
	for <~netlandish/links-dev@lists.code.netlandish.com>; Mon, 23 Mar 2026 19:03:49 +0000 (UTC)
Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=74.125.224.51; helo=mail-yx1-f51.google.com; envelope-from=peter@netlandish.com; receiver=<UNKNOWN> 
Authentication-Results: mail.netlandish.com;
	dkim=pass (1024-bit key; unprotected) header.d=netlandish.com header.i=@netlandish.com header.b=ddr5s1Tk
Received: from mail-yx1-f51.google.com (mail-yx1-f51.google.com [74.125.224.51])
	by mail.netlandish.com (Postfix) with ESMTP id 643EE1D80BE
	for <~netlandish/links-dev@lists.code.netlandish.com>; Mon, 23 Mar 2026 19:03:47 +0000 (UTC)
Received: by mail-yx1-f51.google.com with SMTP id 956f58d0204a3-64e9d72d5f4so555328d50.3
        for <~netlandish/links-dev@lists.code.netlandish.com>; Mon, 23 Mar 2026 12:03:47 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=netlandish.com; s=google; t=1774292626; x=1774897426; darn=lists.code.netlandish.com;
        h=content-transfer-encoding:mime-version:message-id:date:subject:cc
         :to:from:from:to:cc:subject:date:message-id:reply-to;
        bh=srQWAGS0adSTX/Sd7gALBW/swJ+R78jrg2A9RTqNP0g=;
        b=ddr5s1Tk9BgLpW11PNstyj5idzisDvbuIFkwRhu1ZjGPOt4e6mkl2StzqNx+/ME/gY
         PnTvNBqoXNgdueIjOik7tSI9PZ7ivjqAlDLYscl/AlZj5OVKukPBLKpOBY7XtEbWa5Nj
         rG59drnEwcC1Q8XTcVlwuGVl8MfWqIVhcGjjM=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20251104; t=1774292626; x=1774897426;
        h=content-transfer-encoding:mime-version:message-id:date:subject:cc
         :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
         :message-id:reply-to;
        bh=srQWAGS0adSTX/Sd7gALBW/swJ+R78jrg2A9RTqNP0g=;
        b=sGuQasrNrQSMXMX51TFCrkvQBgW1cBtQ4saTFNQVABDNFIumD9zIIswGaYJy9UiOfp
         BUUSGD47sFaxEh83GvibOnhx7Ht9aZhQEvHzUJ8wlfrY4i73yEYhlT4jB5IItpYkpuY6
         u4G/SIYjk7eeW/S+1Iikdng1VJKXVkDnbVO+SaAW2SmPf2IwgTRQ/W2oU31KgaXtHP3C
         Q423DIkBF6mh31YXa5uAVKuKF4zcaHMNRB6zTDsDRoqm5l6y6TqrxSTrXMwwSPttLkPn
         JTvkchoY9445ECrNWYQ6Hgb2F7yXzCMkez+CqF1R7EwcsRwEbOxVqFC7ftaGaCWRre0p
         nOcA==
X-Gm-Message-State: AOJu0YwjLXBF8/8Qrn3lr97zlQa2H+au6GClymsISnANAxUtmrsRkran
	/CSbynP/rJ7AlIfRSAm2qDn3gnp8aQLsnNZtE4ZuS5DFsJLIJbsstYXrSqOxxv9TOhObvCIldWV
	SxkU2vDE=
X-Gm-Gg: ATEYQzye4GKLvSIMXufNPT6MZI+GXgSkHqLq5v01Y/zwYo2YnJJQdtA+mdGGMHX5LLi
	Ra+ZLDZyifU4GYZINrqR98WIn9sPfVSrOL7X6xykMGo5JiaPGjoml2usSGZIDAyjjxnfdwuVsZj
	aF1GtS8mi7S+8UPmBdJ2hpU0MkeS1BCT4FwkdLm/HIREmc1istDaZsVaezfNqSU3MpOW0WRSsSX
	Etfl6D3HRcRtLmUuhGNjx57nYkqYN9twAmSVRKnU244RJaAE1AlQYY3qjXVGZlb86Uz8dSfFLoK
	RC8a1cOFfH2UJHp+Vbmr1dq3B95xw/yOYK7hI6Ky6K3YtLB8r90G+38qu3NIbRYIUay7vNiChaG
	yKWKM6CmxD2EtV6rs6ZcjbM+U8w34w03oYik6eTtoxjvAgFo0An4tWn/kjyC9LTDqJfF36OnnW9
	FnPqd0ZbNiDnspE8QbUMziiQ==
X-Received: by 2002:a53:ece0:0:b0:64d:600d:854d with SMTP id 956f58d0204a3-64eaa7e3f33mr9585039d50.53.1774292626427;
        Mon, 23 Mar 2026 12:03:46 -0700 (PDT)
Received: from localhost ([186.77.197.122])
        by smtp.gmail.com with ESMTPSA id 956f58d0204a3-64eabd44121sm6552464d50.1.2026.03.23.12.03.45
        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
        Mon, 23 Mar 2026 12:03:46 -0700 (PDT)
From: Peter Sanchez <peter@netlandish.com>
To: ~netlandish/links-dev@lists.code.netlandish.com
Cc: Peter Sanchez <peter@netlandish.com>
Subject: [PATCH links] api: return error when an invalid cursor is given
Date: Mon, 23 Mar 2026 13:03:21 -0600
Message-ID: <20260323190342.20723-1-peter@netlandish.com>
X-Mailer: git-send-email 2.52.0
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit

Changelog-updated: api will now return an error when an invalid cursor
 is given.
Changelog-updated: api version bumped to 0.11.3
---
Annoying abusers having fun sending me error emails

 api/graph/model/cursor.go     | 6 ++----
 api/graph/schema.resolvers.go | 2 +-
 2 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/api/graph/model/cursor.go b/api/graph/model/cursor.go
index 644c56e..3e04a20 100644
--- a/api/graph/model/cursor.go
+++ b/api/graph/model/cursor.go
@@ -29,10 +29,8 @@ func (c *Cursor) UnmarshalGQL(v any) error {
 	if plain == nil || err != nil {
 		return fmt.Errorf("Invalid cursor")
 	}
-	err = json.Unmarshal(plain, c)
-	if err != nil {
-		// This is guaranteed to be a programming error
-		panic(err)
+	if err = json.Unmarshal(plain, c); err != nil {
+		return fmt.Errorf("Invalid cursor")
 	}
 	return nil
 }
diff --git a/api/graph/schema.resolvers.go b/api/graph/schema.resolvers.go
index f4990c3..9610a1d 100644
--- a/api/graph/schema.resolvers.go
+++ b/api/graph/schema.resolvers.go
@@ -5127,7 +5127,7 @@ func (r *queryResolver) Version(ctx context.Context) (*model.Version, error) {
 	return &model.Version{
 		Major:           0,
 		Minor:           11,
-		Patch:           2,
+		Patch:           3,
 		DeprecationDate: nil,
 	}, nil
 }
-- 
2.52.0

