131 lines
3.0 KiB
Go
131 lines
3.0 KiB
Go
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 <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
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
|
|
}
|