feat: extract odoo ticket number from reference branch

This commit is contained in:
Mandresy RABENJAHARISON 2025-08-25 13:46:37 +03:00
parent b7bc01b0a7
commit e27b7cc233
2 changed files with 48 additions and 6 deletions

View File

@ -1,7 +1,7 @@
name: 'create-odoo-timesheet'
description: 'Create an Odoo timesheet via FastAPI when time is added on a Gitea Issue.'
author: 'Mandresy RABENJAHARISON <mandresy.rabenjaharison@gmail.com>'
author: 'Mandresy RABENJAHARISON <mandresy.rabenjaharison@ethumada.com>'
branding:
icon: clock
color: blue
@ -19,7 +19,7 @@ runs:
ISSUE_NUMBER: ${{ gitea.event.issue.number }}
ISSUE_TITLE: ${{ gitea.event.issue.title }}
SENDER_LOGIN: ${{ gitea.event.sender.login }}
# Issue time tracking fields (from the event payload)
TRACKED_SECONDS: ${{ gitea.event.tracked_time.time }}
TRACKED_CREATED: ${{ gitea.event.tracked_time.created }}
EVENT_ACTION: ${{ gitea.event.action }}
BRANCH_REF: ${{ gitea.event.issue.ref }}

50
main.go
View File

@ -20,16 +20,54 @@ type TimesheetPayload struct {
TaskID int64 `json:"task_id"`
}
// parseOdooTicketID extracts the numeric ticket id from a ref formatted like
// "<prefix>/ticket-<number>". It scans path segments and picks the first segment
// that starts with "ticket-" (case-insensitive), then reads leading digits.
func parseOdooTicketID(ref string) (int64, error) {
if strings.TrimSpace(ref) == "" {
return 0, fmt.Errorf("empty ref")
}
parts := strings.Split(ref, "/")
for _, seg := range parts {
if seg == "" {
continue
}
lower := strings.ToLower(seg)
const pfx = "ticket-"
if strings.HasPrefix(lower, pfx) {
numPart := seg[len(pfx):]
// collect leading digits
var digits strings.Builder
for _, r := range numPart {
if r >= '0' && r <= '9' {
digits.WriteRune(r)
} else {
break
}
}
if digits.Len() == 0 {
return 0, fmt.Errorf("no digits after ticket- in segment: %s", seg)
}
id, err := strconv.ParseInt(digits.String(), 10, 64)
if err != nil {
return 0, err
}
return id, nil
}
}
return 0, fmt.Errorf("no ticket-<number> segment found in ref: %s", ref)
}
func main() {
baseURL := os.Getenv("BASE_URL")
issueNumber := os.Getenv("ISSUE_NUMBER")
branchRef := os.Getenv("BRANCH_REF")
sender := os.Getenv("SENDER_LOGIN")
title := os.Getenv("ISSUE_TITLE")
trackedSeconds := os.Getenv("TRACKED_SECONDS")
trackedCreated := os.Getenv("TRACKED_CREATED")
action := os.Getenv("EVENT_ACTION")
if baseURL == "" || issueNumber == "" || sender == "" || trackedSeconds == "" || trackedCreated == "" {
if baseURL == "" || branchRef == "" || sender == "" || trackedSeconds == "" || trackedCreated == "" {
fmt.Println("Some required environment variables are missing.")
os.Exit(1)
}
@ -48,8 +86,12 @@ func main() {
defer logFile.Close()
logger := log.New(io.MultiWriter(os.Stdout, logFile), "", log.LstdFlags)
var taskID int64
fmt.Sscanf(issueNumber, "%d", &taskID)
// Extract task ID from branch ref
taskID, err := parseOdooTicketID(branchRef)
if err != nil {
logger.Printf("Failed to parse Odoo ticket from BRANCH_REF '%s': %v\n", branchRef, err)
os.Exit(1)
}
seconds, err := strconv.ParseInt(trackedSeconds, 10, 64)
if err != nil {