22# # Implementation of breeder-related API endpoints
33
44import std/ [httpclient, json, strutils, uri]
5- import yaml
5+ import yaml, yaml / tojson
66import client, types
77
88proc listBreeders * (client: GodonClient ): ApiResponse [seq [BreederSummary ]] =
@@ -18,10 +18,10 @@ proc createBreeder*(client: GodonClient, request: BreederCreateRequest): ApiResp
1818 # # Create a new breeder
1919 try :
2020 let url = client.baseUrl () & " /breeders"
21- # Convert config string to JsonNode
21+ # Config is already a JsonNode, no parsing needed
2222 var jsonData = %* {
2323 " name" : request.name,
24- " config" : parseJson ( request.config)
24+ " config" : request.config
2525 }
2626 echo " Sending JSON: " , $ jsonData
2727 client.httpClient.headers = newHttpHeaders ({" Content-Type" : " application/json" })
@@ -30,17 +30,24 @@ proc createBreeder*(client: GodonClient, request: BreederCreateRequest): ApiResp
3030 except CatchableError as e:
3131 result = ApiResponse [BreederSummary ](success: false , data: default (BreederSummary ), error: e.msg)
3232
33- proc parseBreederFromYaml * (yamlContent: string ): BreederCreateRequest =
34- # # Parse breeder configuration from YAML content using yaml library
33+ proc createBreederFromYamlWithName * (client: GodonClient , yamlContent: string , name: string ): ApiResponse [BreederSummary ] =
34+ # # Create a breeder from YAML content with explicit name parameter
35+ # # YAML contains only the config (no name field), name comes from parameter
3536 try :
36- result = yaml.loadAs [BreederCreateRequest ](yamlContent)
37- except CatchableError as e:
38- raise newException (ValueError , " Failed to parse YAML: " & e.msg)
37+ # Parse YAML and convert to JsonNode
38+ let jsonNodes = loadToJson (yamlContent)
3939
40- proc createBreederFromYaml * (client: GodonClient , yamlContent: string ): ApiResponse [BreederSummary ] =
41- # # Create a breeder from YAML content
42- try :
43- let request = parseBreederFromYaml (yamlContent)
40+ # Take the first document (should be only one)
41+ if jsonNodes.len == 0 :
42+ return ApiResponse [BreederSummary ](success: false , data: default (BreederSummary ), error: " No YAML documents found" )
43+
44+ let configNode = jsonNodes[0 ]
45+
46+ # Create BreederCreateRequest with name from parameter and config from YAML
47+ let request = BreederCreateRequest (
48+ name: name,
49+ config: configNode
50+ )
4451 result = client.createBreeder (request)
4552 except CatchableError as e:
4653 result = ApiResponse [BreederSummary ](success: false , data: default (BreederSummary ), error: e.msg)
@@ -58,7 +65,7 @@ proc updateBreeder*(client: GodonClient, request: BreederUpdateRequest): ApiResp
5865 # # Update an existing breeder
5966 try :
6067 let url = client.baseUrl () & " /breeders/" & encodeUrl (request.uuid)
61- # Convert config string to JsonNode
68+ # Config is a string (JSON), parse it first
6269 var jsonData = %* {
6370 " name" : request.name,
6471 " description" : request.description,
@@ -70,17 +77,32 @@ proc updateBreeder*(client: GodonClient, request: BreederUpdateRequest): ApiResp
7077 except CatchableError as e:
7178 result = ApiResponse [Breeder ](success: false , data: default (Breeder ), error: e.msg)
7279
73- proc parseBreederUpdateFromYaml * (yamlContent: string ): BreederUpdateRequest =
74- # # Parse breeder update configuration from YAML content
75- try :
76- result = yaml.loadAs [BreederUpdateRequest ](yamlContent)
77- except CatchableError as e:
78- raise newException (ValueError , " Failed to parse YAML: " & e.msg)
79-
8080proc updateBreederFromYaml * (client: GodonClient , yamlContent: string ): ApiResponse [Breeder ] =
8181 # # Update a breeder from YAML content
8282 try :
83- let request = parseBreederUpdateFromYaml (yamlContent)
83+ # Parse YAML and convert to JsonNode
84+ let jsonNodes = loadToJson (yamlContent)
85+
86+ # Take the first document (should be only one)
87+ if jsonNodes.len == 0 :
88+ return ApiResponse [Breeder ](success: false , data: default (Breeder ), error: " No YAML documents found" )
89+
90+ let yamlData = jsonNodes[0 ]
91+
92+ # Extract fields from YAML
93+ let uuid = if yamlData.hasKey (" uuid" ): yamlData[" uuid" ].getStr () else : " "
94+ let name = if yamlData.hasKey (" name" ): yamlData[" name" ].getStr () else : " "
95+ let description = if yamlData.hasKey (" description" ): yamlData[" description" ].getStr () else : " "
96+
97+ # Config should be a nested object - convert to JSON string
98+ let config = if yamlData.hasKey (" config" ): $ yamlData[" config" ] else : " {}"
99+
100+ let request = BreederUpdateRequest (
101+ uuid: uuid,
102+ name: name,
103+ description: description,
104+ config: config
105+ )
84106 result = client.updateBreeder (request)
85107 except CatchableError as e:
86108 result = ApiResponse [Breeder ](success: false , data: default (Breeder ), error: e.msg)
0 commit comments