@@ -9,7 +9,7 @@ import { unreachable } from "@std/assert";
9
9
import { assertNever } from "@std/assert/unstable-never" ;
10
10
import { Account } from "./account.ts" ;
11
11
import { Actor } from "./actor.ts" ;
12
- import { builder , Node } from "./builder.ts" ;
12
+ import { builder , Node , type ValuesOfEnumType } from "./builder.ts" ;
13
13
import { Reactable } from "./reactable.ts" ;
14
14
15
15
const PostVisibility = builder . enumType ( "PostVisibility" , {
@@ -22,6 +22,33 @@ const PostVisibility = builder.enumType("PostVisibility", {
22
22
] as const ,
23
23
} ) ;
24
24
25
+ const CreateNoteErrorKind = builder . enumType ( "CreateNoteErrorKind" , {
26
+ values : [
27
+ "NOT_AUTHENTICATED" ,
28
+ "REPLY_TARGET_NOT_FOUND" ,
29
+ "QUOTED_POST_NOT_FOUND" ,
30
+ "NOTE_CREATION_FAILED" ,
31
+ ] as const ,
32
+ } ) ;
33
+
34
+ class CreateNoteError extends Error {
35
+ public constructor (
36
+ public readonly kind : ValuesOfEnumType < typeof CreateNoteErrorKind > ,
37
+ ) {
38
+ super ( `Create note error - ${ kind } ` ) ;
39
+ }
40
+ }
41
+
42
+ builder . objectType ( CreateNoteError , {
43
+ name : "CreateNoteError" ,
44
+ fields : ( t ) => ( {
45
+ createNoteErrorKind : t . field ( {
46
+ type : CreateNoteErrorKind ,
47
+ resolve : ( error ) => error . kind ,
48
+ } ) ,
49
+ } ) ,
50
+ } ) ;
51
+
25
52
export const Post = builder . drizzleInterface ( "postTable" , {
26
53
variant : "Post" ,
27
54
interfaces : [ Reactable , Node ] ,
@@ -458,10 +485,16 @@ builder.relayMutationField(
458
485
} ) ,
459
486
} ,
460
487
{
488
+ errors : {
489
+ types : [ CreateNoteError ] ,
490
+ result : {
491
+ name : "CreateNoteSuccess" ,
492
+ } ,
493
+ } ,
461
494
async resolve ( _root , args , ctx ) {
462
495
const session = await ctx . session ;
463
496
if ( session == null ) {
464
- throw new Error ( "Not authenticated. ") ;
497
+ throw new CreateNoteError ( "NOT_AUTHENTICATED ") ;
465
498
}
466
499
const { visibility, content, language, replyTargetId, quotedPostId } =
467
500
args . input ;
@@ -472,7 +505,7 @@ builder.relayMutationField(
472
505
where : { id : replyTargetId . id } ,
473
506
} ) ;
474
507
if ( replyTarget == null ) {
475
- throw new Error ( "Reply target not found. ") ;
508
+ throw new CreateNoteError ( "REPLY_TARGET_NOT_FOUND ") ;
476
509
}
477
510
}
478
511
let quotedPost : schema . Post & { actor : schema . Actor } | undefined ;
@@ -482,7 +515,7 @@ builder.relayMutationField(
482
515
where : { id : quotedPostId . id } ,
483
516
} ) ;
484
517
if ( quotedPost == null ) {
485
- throw new Error ( "Quoted post not found. ") ;
518
+ throw new CreateNoteError ( "QUOTED_POST_NOT_FOUND ") ;
486
519
}
487
520
}
488
521
return await withTransaction ( ctx . fedCtx , async ( context ) => {
@@ -511,7 +544,7 @@ builder.relayMutationField(
511
544
{ replyTarget, quotedPost } ,
512
545
) ;
513
546
if ( note == null ) {
514
- throw new Error ( "Failed to create note. ") ;
547
+ throw new CreateNoteError ( "NOTE_CREATION_FAILED ") ;
515
548
}
516
549
return note ;
517
550
} ) ;
0 commit comments