Skip to content

Commit

Permalink
First version
Browse files Browse the repository at this point in the history
  • Loading branch information
tdaron committed Jan 31, 2021
1 parent 631abc4 commit 9cf4e2e
Show file tree
Hide file tree
Showing 113 changed files with 9,193 additions and 30 deletions.
12 changes: 12 additions & 0 deletions deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/bash
echo "Compiling..."
GOOS=linux CGO_ENABLED=0 go build main.go
upx main
echo "Zipping..."
zip functions.zip main
echo "Sending..."
aws lambda update-function-code \
--function-name TestFunction \
--zip-file fileb://functions.zip | jq ".LastUpdateStatus"
echo "Cleaning..."
rm main functions.zip
5 changes: 5 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,9 @@ go 1.15
require (
github.com/aws/aws-lambda-go v1.22.0
github.com/aws/aws-sdk-go v1.37.1 // indirect
github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b
github.com/llonchj/godoo v0.0.0-20180820064327-3289aff48f4a // indirect
github.com/mjibson/esc v0.2.0 // indirect
github.com/rakutentech/go-alertnotification v1.0.2 // indirect
github.com/spf13/cobra v1.1.1 // indirect
)
301 changes: 301 additions & 0 deletions go.sum

Large diffs are not rendered by default.

50 changes: 31 additions & 19 deletions jira/json.go
Original file line number Diff line number Diff line change
@@ -1,46 +1,58 @@
package jira

import "encoding/json"
import (
"encoding/json"
)


//Types for JSON Deserialization
type JiraWorklog struct {
type Worklog struct {
TimeSpentSeconds int `json:"timeSpentSeconds"`
Date string `json:"created"`
}

func (w *Worklog) GetDate() string {
return w.Date[0:10]
}

type JiraWorklogsField struct {
Worklogs []JiraWorklog `json:"worklogs"`
func (w *Worklog) GetHours() float64 {
return float64(w.TimeSpentSeconds) / 3600
}

type WorklogsField struct {
Worklogs []Worklog `json:"worklogs"`

}
type JiraRequestFields struct {
TimesheetCode string `json:"customfield_10101"`
Worklog JiraWorklogsField `json:"worklog"`
type RequestFields struct {
TimesheetCode string `json:"customfield_10101"` //CUSTOM FIELD WITH ODOO TIMESHEET CODE
Worklog WorklogsField `json:"worklog"`
}

type JiraUser struct {
type User struct {
Key string `json:"key"`
Email string `json:"emailAddress"`
}

type JiraIssue struct {
Key string `json:"key"`
Fields JiraRequestFields `json:"fields"`
type Issue struct {
Key string `json:"key"`
Fields RequestFields `json:"fields"`

}

type JiraRequest struct {
User JiraUser `json:"user"`
Issue JiraIssue `json:"issue"`
type Request struct {
User User `json:"user"`
Issue Issue `json:"issue"`

}

func NewWorklogRequest(body string) (JiraRequest, error) {
var jiraRequest JiraRequest
func NewWorklogRequest(body string) (Request, error) {
var jiraRequest Request
err := json.Unmarshal([]byte(body),&jiraRequest)
return jiraRequest, err
}

func (r *JiraRequest) GetLastWorklogTime() int {
func (r *Request) GetLastWorklog() Worklog {
var worklogs = r.Issue.Fields.Worklog.Worklogs
var lastWorklog = worklogs[len(worklogs)-1]
return lastWorklog.TimeSpentSeconds
var lastWorklog = worklogs[len(worklogs) -1]
return lastWorklog
}
Binary file added main
Binary file not shown.
68 changes: 57 additions & 11 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,74 @@ package main

import (
"context"
"encoding/json"
"errors"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"jira-timesheet/jira"
odoo "jira-timesheet/odoo"
"jira-timesheet/teamsnotifier"
"jira-timesheet/utils"
"os"
"strings"
)

func ErrorResponse(e error) events.APIGatewayProxyResponse {
teamsnotifier.Notify(e)

return events.APIGatewayProxyResponse{
StatusCode: 500,
Body: e.Error(),
}
}

func preventOdooCrash(){
if !odooCredsOk{
teamsnotifier.Notify(errors.New("Odoo connection error , please check your creds"))
}
}

var odooCredsOk = false


func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
jiraRequest, err := jira.NewWorklogRequest(request.Body)
if err != nil {
return ErrorResponse(err), nil
}

var odoo_whitelist = os.Getenv("ODOO_WHITELIST")
if odoo_whitelist != "" {
var white_projects = strings.Split(odoo_whitelist,",")
if !utils.SliceContains(white_projects, jiraRequest.Issue.Fields.TimesheetCode) {
return ErrorResponse(errors.New(jiraRequest.Issue.Fields.TimesheetCode+" is not in the whitelist ( "+odoo_whitelist+")")), nil
}
}



var lastWorklog = jiraRequest.GetLastWorklog()

defer preventOdooCrash() ////odoo panic if authentication fails, we have to notify user of bad creds

err = odoo.CreateTimesheetLine(
jiraRequest.Issue.Key,
jiraRequest.User.Email,
jiraRequest.Issue.Fields.TimesheetCode,
lastWorklog.GetHours(),
lastWorklog.GetDate())
odooCredsOk = true

if err != nil {
return events.APIGatewayProxyResponse{
StatusCode: 500,
Body: err.Error(),
}, nil
} else {
respString, _ := json.Marshal(jiraRequest)
return events.APIGatewayProxyResponse{
StatusCode: 200,
Body: string(respString),
}, nil
return ErrorResponse(err), nil
}

teamsnotifier.Notify(errors.New("SUCCESS"))
return events.APIGatewayProxyResponse{
StatusCode: 200,
Body: "OK",
}, nil


}


Expand Down
54 changes: 54 additions & 0 deletions odoo/odoo.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package odoo

import (
"errors"
odoo "jira-timesheet/odoo_api_wrapper"
"os"
)
func CreateTimesheetLine(name string, email string, timesheetCode string, hours float64, date string) error{
c, err := odoo.NewClient(&odoo.ClientConfig{
Admin: os.Getenv("ODOO_ADMIN"),
Password: os.Getenv("ODOO_PASSWORD"),
Database: os.Getenv("ODOO_DB"),
URL: os.Getenv("ODOO_URL"),
})
if err != nil {
return errors.New("Can't connect to Odoo, Error: "+err.Error())
}
var taskSearch = odoo.Criteria{}
taskSearch.Add("code","=",timesheetCode)
task, err := c.FindProjectTask(&taskSearch)
if err != nil || task == nil{
return errors.New("Can't find any Odoo task with "+timesheetCode+" code")
}


var employeeSearch = odoo.Criteria{}
employeeSearch.Add("work_email","=",email)
employee, err := c.FindHrEmployee(&employeeSearch)
if err != nil || employee == nil{
return errors.New("Can't find any Odoo employee with "+email+" as mail adress")
}



var accountAnalyticLine = odoo.AccountAnalyticLine{
EmployeeId: odoo.NewMany2One(employee.Id.Get(), employee.Name.Get()),
TaskId: odoo.NewMany2One(task.Id.Get(), task.Name.Get()),
ProjectId: task.ProjectId,
UnitAmount: odoo.NewFloat(hours),
UserId: employee.UserId,
Date: odoo.NewString(date),
Name: odoo.NewString(name),
}

_, err = c.CreateAccountAnalyticLine(&accountAnalyticLine)

if err != nil {
return errors.New("Can't create Analytic Line. Error: "+err.Error())
}
return nil



}
Loading

0 comments on commit 9cf4e2e

Please sign in to comment.