{"record":{"id":"f87ad649ab54f0b2","repo":"Billionmail/BillionMail","slug":"not-suppliers-found","errorCode":null,"errorMessage":"Not suppliers found","messagePattern":"Not suppliers found","errorType":"http","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/internal/controller/askai/askai_v1_supplier.go","lineNumber":16,"sourceCode":"package askai\n\nimport (\n\tv1 \"billionmail-core/api/askai/v1\"\n\t\"billionmail-core/internal/service/askai\"\n\t\"billionmail-core/internal/service/public\"\n\t\"billionmail-core/utility/types/api_v1\"\n\t\"context\"\n\t\"errors\"\n)\n\nfunc (c *ControllerV1) List(ctx context.Context, req *v1.ListReq) (res *v1.ListRes, err error) {\n\tres = &v1.ListRes{}\n\tres.Data = askai.List()\n\tif res.Data == nil {\n\t\tres.SetError(errors.New(public.LangCtx(ctx, \"Not suppliers found\")))\n\t\treturn res, nil\n\t}\n\tres.SetSuccess(public.LangCtx(ctx, \"List of suppliers retrieved successfully\"))\n\treturn res, nil\n}\n\nfunc (c *ControllerV1) Models(ctx context.Context, req *v1.ModelsReq) (res *v1.ModelsRes, err error) {\n\tres = &v1.ModelsRes{}\n\tres.Data = askai.Models(req.SupplierName)\n\tres.SetSuccess(public.LangCtx(ctx, \"List of models retrieved successfully\"))\n\treturn res, nil\n}\n\nfunc (c *ControllerV1) AddModel(ctx context.Context, req *v1.AddModelReq) (res *v1.AddModelRes, err error) {\n\tres = &v1.AddModelRes{}\n\tres.Data = askai.AddModel(req.SupplierName, req.Title, req.ModelId, req.MaxTokens, req.Capability)\n\tres.SetSuccess(public.LangCtx(ctx, \"Model added successfully\"))\n\treturn res, nil","sourceCodeStart":1,"sourceCodeEnd":34,"githubUrl":"https://github.com/Billionmail/BillionMail/blob/fc36c76c050c3775c5e899faf7403cf0262d2744/core/internal/controller/askai/askai_v1_supplier.go#L1-L34","documentation":"modifyPostfixNetworksText scans a docker-compose.yml line-by-line to locate the postfix-billionmail service so it can rewrite its networks section. It throws this error when no line containing 'postfix-billionmail:' was found in the file, meaning the compose file has no Postfix service under that name. The function returns the original lines unchanged along with the error, so no modification is applied.","triggerScenarios":"modifyDockerComposeText is called with a docker-compose.yml that lacks a service key named 'postfix-billionmail' — e.g. a manually trimmed compose file, an override file, or a renamed service.","commonSituations":"Users replaced the BillionMail docker-compose.yml with a custom one, renamed the service during customization, or the tooling is pointed at the wrong compose file (e.g. an override or fragment file). Also happens with heavily reformatted files where the scanner's indentation assumptions break.","solutions":["Ensure the docker-compose.yml being modified contains a service named exactly 'postfix-billionmail:'","Verify the path passed to modifyDockerComposeText points to the full BillionMail compose file, not an override/fragment","If the service was intentionally renamed, update the hardcoded 'postfix-billionmail' key in config_manager.go or rename it back","Restore the original BillionMail docker-compose.yml and reapply customizations"],"exampleFix":"# before (custom compose file)\nservices:\n  my-mailer:\n    image: billionmail/postfix\n# after\nservices:\n  postfix-billionmail:\n    image: billionmail/postfix","handlingStrategy":"validation","validationCode":"data, _ := os.ReadFile(composePath)\nif !strings.Contains(string(data), \"postfix-billionmail:\") {\n\treturn fmt.Errorf(\"%s has no postfix-billionmail service; refusing multi-IP rewrite\", composePath)\n}","typeGuard":null,"tryCatchPattern":"lines, err := m.modifyDockerComposeText(path, configs)\nif err != nil {\n\tif strings.Contains(err.Error(), \"service not found\") {\n\t\t// restore stock compose file or abort with a clear user-facing message\n\t}\n\treturn err\n}","preventionTips":["Never hand-trim the BillionMail docker-compose.yml; keep the postfix-billionmail service block intact","Validate the compose file with 'docker compose config -q' before running multi-IP setup","Keep service names unchanged when customizing; add overrides instead of renaming","Log the compose path being edited so wrong-file mistakes are visible"],"tags":["docker-compose","multi-ip","config","yaml"],"backgroundTag":"service-not-found-in-compose","analyzedSha":"fc36c76c050c3775c5e899faf7403cf0262d2744","analyzedAt":"2026-09-05T21:28:54.019Z","contentChangedAt":"2026-09-05T21:28:54.019Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}