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:
MiFaZhan
2026-10-23 14:15:47 +08:00
commit 88dfe5c640
482 changed files with 34475 additions and 0 deletions
@@ -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)
}
}