From 652c855145e40fef14c814f51c4c08a9f9371798 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 8 Nov 2025 01:32:03 +0000 Subject: [PATCH] fix(api): return AlreadyExists error for duplicate memo IDs (AIP-133) Ensure AIP-133 compliance by returning codes.AlreadyExists when a duplicate memo ID is provided, rather than a generic database error. Handles unique constraint violations across all database drivers: - SQLite: "UNIQUE constraint failed" - PostgreSQL: "duplicate key" - MySQL: "Duplicate entry" This provides a clear, standardized error response per Google's API design guidelines (AIP-133 for Create methods). --- server/router/api/v1/memo_service.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/router/api/v1/memo_service.go b/server/router/api/v1/memo_service.go index 0fcc2d25a..308360bad 100644 --- a/server/router/api/v1/memo_service.go +++ b/server/router/api/v1/memo_service.go @@ -70,6 +70,13 @@ func (s *APIV1Service) CreateMemo(ctx context.Context, request *v1pb.CreateMemoR memo, err := s.Store.CreateMemo(ctx, create) if err != nil { + // Check for unique constraint violation (AIP-133 compliance) + errMsg := err.Error() + if strings.Contains(errMsg, "UNIQUE constraint failed") || + strings.Contains(errMsg, "duplicate key") || + strings.Contains(errMsg, "Duplicate entry") { + return nil, status.Errorf(codes.AlreadyExists, "memo with ID %q already exists", memoUID) + } return nil, err }