chore: 初始开源发布
iotlcm-openapi:对外 OpenAPI 网关(V3 接口 + 旧版兼容接口)。
- Go module:iotlcm-openapi → git.5iot.com/iotlcm-public/iotlcm-openapi(178 文件)
- 凭据与地址脱敏:JWT signingKey、MySQL DSN、Redis 口令、
RabbitMQ DSN 全部改为 ${*} 占位;私网 IP → 文档地址段
- 7 处真实手机号 → 合法 11 位编造号
- 启动 banner 统一 IOTLCM 方块字 + 社区惯例署名
- 移除内部资产:CI 触发器
- Dockerfile 改用公共基础镜像,移除 GOPRIVATE 内网设置
- README 重写(原为 GoFrame 模板占位文案),补 Apache-2.0 LICENSE,
LF 行尾 + .gitattributes
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
package workerdiagnostic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
"github.com/gogf/gf/v2/util/guid"
|
||||
|
||||
"git.5iot.com/iotlcm-public/iotlcm-openapi/internal/consts"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-openapi/internal/model"
|
||||
)
|
||||
|
||||
type Publisher func(ctx context.Context, queue string, data any) error
|
||||
|
||||
type Service struct {
|
||||
publisher Publisher
|
||||
}
|
||||
|
||||
type Result struct {
|
||||
TraceID string
|
||||
Queue string
|
||||
SentAt int64
|
||||
}
|
||||
|
||||
func New(publisher Publisher) *Service {
|
||||
return &Service{publisher: publisher}
|
||||
}
|
||||
|
||||
func (s *Service) Publish(ctx context.Context, message string) (*Result, error) {
|
||||
var (
|
||||
traceID = fmt.Sprintf("worker-test-%s", guid.S())
|
||||
sentAt = gtime.TimestampMilli()
|
||||
payload = model.WorkerDiagnosticMessage{
|
||||
TraceID: traceID,
|
||||
SentAt: sentAt,
|
||||
Message: message,
|
||||
}
|
||||
)
|
||||
if err := s.publisher(ctx, consts.QueueWorkerDiagnostic, payload); err != nil {
|
||||
return nil, gerror.Wrap(err, "publish worker diagnostic message failed")
|
||||
}
|
||||
return &Result{
|
||||
TraceID: traceID,
|
||||
Queue: consts.QueueWorkerDiagnostic,
|
||||
SentAt: sentAt,
|
||||
}, nil
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package workerdiagnostic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"git.5iot.com/iotlcm-public/iotlcm-openapi/internal/consts"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-openapi/internal/model"
|
||||
)
|
||||
|
||||
func TestPublish(t *testing.T) {
|
||||
var (
|
||||
publishedQueue string
|
||||
publishedPayload model.WorkerDiagnosticMessage
|
||||
)
|
||||
service := New(func(ctx context.Context, queue string, data any) error {
|
||||
publishedQueue = queue
|
||||
var ok bool
|
||||
publishedPayload, ok = data.(model.WorkerDiagnosticMessage)
|
||||
if !ok {
|
||||
t.Fatalf("unexpected payload type %T", data)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
result, err := service.Publish(context.Background(), "worker ping")
|
||||
if err != nil {
|
||||
t.Fatalf("Publish() error = %v", err)
|
||||
}
|
||||
if publishedQueue != consts.QueueWorkerDiagnostic {
|
||||
t.Fatalf("queue = %q, want %q", publishedQueue, consts.QueueWorkerDiagnostic)
|
||||
}
|
||||
if !strings.HasPrefix(result.TraceID, "worker-test-") {
|
||||
t.Fatalf("traceId = %q, want worker-test- prefix", result.TraceID)
|
||||
}
|
||||
if result.SentAt <= 0 {
|
||||
t.Fatalf("sentAt = %d, want positive timestamp", result.SentAt)
|
||||
}
|
||||
if result.Queue != consts.QueueWorkerDiagnostic {
|
||||
t.Fatalf("result queue = %q, want %q", result.Queue, consts.QueueWorkerDiagnostic)
|
||||
}
|
||||
if publishedPayload.TraceID != result.TraceID || publishedPayload.SentAt != result.SentAt {
|
||||
t.Fatalf("published identifiers = %+v, result = %+v", publishedPayload, result)
|
||||
}
|
||||
if publishedPayload.Message != "worker ping" {
|
||||
t.Fatalf("message = %q, want worker ping", publishedPayload.Message)
|
||||
}
|
||||
body, err := json.Marshal(publishedPayload)
|
||||
if err != nil {
|
||||
t.Fatalf("json.Marshal() error = %v", err)
|
||||
}
|
||||
wantJSON := `{"traceId":"` + result.TraceID + `","sentAt":` + fmt.Sprint(result.SentAt) + `,"message":"worker ping"}`
|
||||
if string(body) != wantJSON {
|
||||
t.Fatalf("JSON = %s, want %s", body, wantJSON)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPublishWrapsPublisherError(t *testing.T) {
|
||||
publishErr := errors.New("broker unavailable")
|
||||
service := New(func(ctx context.Context, queue string, data any) error {
|
||||
return publishErr
|
||||
})
|
||||
|
||||
result, err := service.Publish(context.Background(), "worker ping")
|
||||
if result != nil {
|
||||
t.Fatalf("result = %+v, want nil", result)
|
||||
}
|
||||
if err == nil {
|
||||
t.Fatal("Publish() error = nil, want error")
|
||||
}
|
||||
if !errors.Is(err, publishErr) {
|
||||
t.Fatalf("Publish() error = %v, want wrapped publisher error", err)
|
||||
}
|
||||
if !strings.Contains(err.Error(), "publish worker diagnostic message failed") {
|
||||
t.Fatalf("Publish() error = %v, want context", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user