haixunMaster/haixun-backend/internal/model/threads_account/usecase/publish_credentials.go

54 lines
1.6 KiB
Go

package usecase
import (
"context"
"strings"
app "haixun-backend/internal/library/errors"
"haixun-backend/internal/library/errors/code"
domusecase "haixun-backend/internal/model/threads_account/domain/usecase"
)
func (u *threadsAccountUseCase) ResolveMemberThreadsPublishCredential(
ctx context.Context,
tenantID, ownerUID string,
) (*domusecase.ThreadsPublishCredential, error) {
if err := requireActor(tenantID, ownerUID); err != nil {
return nil, err
}
member, err := u.members.GetByUID(ctx, tenantID, ownerUID)
if err != nil {
return nil, err
}
activeID := strings.TrimSpace(member.ActiveThreadsAccountID)
if activeID == "" {
return nil, app.For(code.ThreadsAccount).InputMissingRequired("請先選定經營帳號")
}
account, err := u.assertOwned(ctx, tenantID, ownerUID, activeID)
if err != nil {
return nil, err
}
secrets, err := u.secretsRepo.FindByAccountID(ctx, account.ID)
if err != nil {
return nil, err
}
token := ""
if secrets != nil {
token = strings.TrimSpace(secrets.APIAccessToken)
}
userID := strings.TrimSpace(account.ThreadsUserID)
apiConnected := token != "" && userID != ""
if !apiConnected {
return nil, app.For(code.ThreadsAccount).InputMissingRequired("請先完成 Threads API 連線後再發送留言")
}
prefs, _ := u.loadConnectionPrefs(ctx, account.ID)
if prefs.DevMode && !prefs.PublishViaApi {
return nil, app.For(code.ThreadsAccount).InputMissingRequired("開發模式請在連線設定啟用 API 發文,或改用手動貼上留言")
}
return &domusecase.ThreadsPublishCredential{
AccountID: account.ID,
ThreadsUserID: userID,
AccessToken: token,
}, nil
}