package common /* * This file is part of Autogits. * * Copyright © 2024 SUSE LLC * * Autogits is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 2 of the License, or (at your option) any later * version. * * Autogits is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * Foobar. If not, see . */ import ( "encoding/json" "fmt" "io" "strings" "src.opensuse.org/autogits/common/gitea-generated/models" ) type Repository struct { Id uint Name string Full_Name string Fork bool Parent *Repository Owner *Organization Clone_Url string Ssh_Url string Default_Branch string Object_Format_Name string } type Organization struct { Id uint Username string } type User struct { Id int Username string } type RepositoryWebhookEvent struct { Action string Sender *User Organization *Organization Repository *Repository PrjGit string } func UserFromModel(user *models.User) *User { return &User { Id: int(user.ID), Username: user.UserName, } } func UsersFromModel(users []*models.User) []*User { u := make([]*User, len(users)) for i := range users { u[i] = UserFromModel(users[i]) } return u } func RepositoryFromModel(repo *models.Repository) *Repository { if repo == nil { return nil } return &Repository{ Id: uint(repo.ID), Name: repo.Name, Full_Name: repo.FullName, Fork: repo.Fork, Parent: RepositoryFromModel(repo.Parent), Owner: &Organization{ Id: uint(repo.Owner.ID), Username: repo.Owner.UserName, }, Clone_Url: repo.CloneURL, Ssh_Url: repo.SSHURL, Default_Branch: repo.DefaultBranch, Object_Format_Name: repo.ObjectFormatName, } } func (r *RepositoryWebhookEvent) GetAction() string { return r.Action } // TODO: sanity check values!!!! func (h *RequestHandler) parseRepositoryRequest(dataReader io.Reader) (data *RepositoryWebhookEvent, err error) { data = new(RepositoryWebhookEvent) if err = json.NewDecoder(dataReader).Decode(&data); err != nil { return nil, err } repoIdx := strings.LastIndex(data.Repository.Ssh_Url, "/") if repoIdx == -1 || data.Repository.Ssh_Url[repoIdx+1:] != data.Repository.Name+".git" { return nil, fmt.Errorf("Unexpected URL for SSH repository: %s", data.Repository.Name) } data.PrjGit = data.Repository.Ssh_Url[:repoIdx+1] + DefaultGitPrj + ".git" h.StdLogger.Printf("Request '%s' for repo: %s\n", data.Action, data.Repository.Full_Name) if len(data.Action) < 1 { return nil, fmt.Errorf("Request has no data.... skipping") } h.Request = &Request{ Data: data, Type: RequestType_Repository, } return data, nil }