feat: initial commit

This commit is contained in:
2025-02-22 09:42:15 +01:00
parent ee4a65b345
commit e6e5c9b04d
43 changed files with 1191 additions and 247 deletions

View File

@ -10,6 +10,7 @@ import (
"github.com/gorilla/sessions"
"github.com/markbates/goth"
"github.com/markbates/goth/gothic"
"github.com/markbates/goth/providers/gitea"
"github.com/markbates/goth/providers/github"
"github.com/markbates/goth/providers/google"
"github.com/markbates/goth/providers/openidConnect"
@ -79,6 +80,26 @@ func NewAuthHandlerFromConfig(ctx context.Context, conf *config.Config) (*auth.H
})
}
if conf.Auth.Providers.Gitea.Key != "" && conf.Auth.Providers.Gitea.Secret != "" {
giteaProvider := gitea.NewCustomisedURL(
conf.Auth.Providers.Gitea.Key,
conf.Auth.Providers.Gitea.Secret,
fmt.Sprintf("%s/auth/providers/gitea/callback", conf.HTTP.BaseURL),
conf.Auth.Providers.Gitea.AuthURL,
conf.Auth.Providers.Gitea.TokenURL,
conf.Auth.Providers.Gitea.ProfileURL,
conf.Auth.Providers.Gitea.Scopes...,
)
gothProviders = append(gothProviders, giteaProvider)
providers = append(providers, auth.Provider{
ID: giteaProvider.Name(),
Label: conf.Auth.Providers.Gitea.Label,
Icon: "fa-git-alt",
})
}
if conf.Auth.Providers.OIDC.Key != "" && conf.Auth.Providers.OIDC.Secret != "" {
oidcProvider, err := openidConnect.New(
conf.Auth.Providers.OIDC.Key,
@ -107,13 +128,6 @@ func NewAuthHandlerFromConfig(ctx context.Context, conf *config.Config) (*auth.H
auth.WithProviders(providers...),
}
if conf.Auth.DefaultAdmin.Email != "" && conf.Auth.DefaultAdmin.Provider != "" {
opts = append(opts, auth.WithDefaultAdmin(auth.DefaultAdmin{
Provider: conf.Auth.DefaultAdmin.Provider,
Email: conf.Auth.DefaultAdmin.Email,
}))
}
auth := auth.NewHandler(
sessionStore,
opts...,

View File

@ -4,9 +4,40 @@ import (
"context"
"forge.cadoles.com/wpetit/clearcase/internal/config"
"forge.cadoles.com/wpetit/clearcase/internal/core/model"
"forge.cadoles.com/wpetit/clearcase/internal/core/port"
"forge.cadoles.com/wpetit/clearcase/internal/core/service"
"forge.cadoles.com/wpetit/clearcase/internal/http/handler/webui/issue"
"github.com/pkg/errors"
)
func NewIssueHandlerFromConfig(ctx context.Context, conf *config.Config) (*issue.Handler, error) {
return issue.NewHandler(), nil
issueManager, err := NewIssueManagerFromConfig(ctx, conf)
if err != nil {
return nil, errors.WithStack(err)
}
return issue.NewHandler(issueManager), nil
}
type authProviderBasedForgeFactory struct {
provider string
create func(ctx context.Context, user *model.User) (port.Forge, error)
}
// Create implements service.ForgeFactory.
func (a *authProviderBasedForgeFactory) Create(ctx context.Context, user *model.User) (port.Forge, error) {
forge, err := a.create(ctx, user)
if err != nil {
return nil, errors.WithStack(err)
}
return forge, nil
}
// Match implements service.ForgeFactory.
func (a *authProviderBasedForgeFactory) Match(user *model.User) bool {
return user.Provider == a.provider
}
var _ service.ForgeFactory = &authProviderBasedForgeFactory{}

View File

@ -0,0 +1,60 @@
package setup
import (
"context"
"net/url"
"code.gitea.io/sdk/gitea"
giteaAdapter "forge.cadoles.com/wpetit/clearcase/internal/adapter/gitea"
"forge.cadoles.com/wpetit/clearcase/internal/config"
"forge.cadoles.com/wpetit/clearcase/internal/core/model"
"forge.cadoles.com/wpetit/clearcase/internal/core/port"
"forge.cadoles.com/wpetit/clearcase/internal/core/service"
"github.com/bornholm/genai/llm/provider"
"github.com/pkg/errors"
_ "github.com/bornholm/genai/llm/provider/openai"
_ "github.com/bornholm/genai/llm/provider/openrouter"
)
func NewIssueManagerFromConfig(ctx context.Context, conf *config.Config) (*service.IssueManager, error) {
llmCtx := provider.FromMap(ctx, "", map[string]string{
string(provider.ContextKeyAPIBaseURL): conf.LLM.Provider.BaseURL,
string(provider.ContextKeyAPIKey): conf.LLM.Provider.Key,
string(provider.ContextKeyModel): conf.LLM.Provider.Model,
})
client, err := provider.Create(llmCtx, provider.Name(conf.LLM.Provider.Name))
if err != nil {
return nil, errors.Wrapf(err, "could not create llm client '%s'", conf.LLM.Provider.Name)
}
forgeFactories := make([]service.ForgeFactory, 0)
if conf.Auth.Providers.Gitea.Key != "" && conf.Auth.Providers.Gitea.Secret != "" {
baseURL, err := url.Parse(conf.Auth.Providers.Gitea.AuthURL)
if err != nil {
return nil, errors.Wrapf(err, "could not parse gitea auth url '%s'", conf.Auth.Providers.Gitea.AuthURL)
}
baseURL.Path = ""
forgeFactories = append(forgeFactories, &authProviderBasedForgeFactory{
provider: "gitea",
create: func(ctx context.Context, user *model.User) (port.Forge, error) {
client, err := gitea.NewClient(baseURL.String(), gitea.SetToken(user.AccessToken))
if err != nil {
return nil, errors.WithStack(err)
}
forge := giteaAdapter.NewForge(client)
return forge, nil
},
})
}
issueManager := service.NewIssueManager(client, forgeFactories...)
return issueManager, nil
}

View File

@ -25,7 +25,7 @@ func NewWebUIHandlerFromConfig(ctx context.Context, conf *config.Config) (*webui
// Configure issue handler
issueHandler, err := NewIssueHandlerFromConfig(ctx, conf)
if err != nil {
return nil, errors.Wrap(err, "could not configure explorer handler from config")
return nil, errors.Wrap(err, "could not configure issue handler from config")
}
opts = append(opts, webui.WithMount("/", authMiddleware(issueHandler)))