mirror of
				https://github.com/taigrr/wtf
				synced 2025-01-18 04:03:14 -08:00 
			
		
		
		
	First commit
This commit is contained in:
		
						commit
						176052c78f
					
				
							
								
								
									
										17
									
								
								bamboohr/bamboohr.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								bamboohr/bamboohr.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
package bamboohr
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Fetch() []Item {
 | 
			
		||||
	client := NewClient()
 | 
			
		||||
	result := client.Away("timeOff", today(), today())
 | 
			
		||||
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func today() string {
 | 
			
		||||
	localNow := time.Now().Local()
 | 
			
		||||
	return localNow.Format("2006-01-02")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								bamboohr/calendar.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								bamboohr/calendar.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,39 @@
 | 
			
		||||
package bamboohr
 | 
			
		||||
 | 
			
		||||
import ()
 | 
			
		||||
 | 
			
		||||
type Calendar struct {
 | 
			
		||||
	Items []Item `xml:"item"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* -------------------- Public Functions -------------------- */
 | 
			
		||||
 | 
			
		||||
func (calendar *Calendar) Holidays() []Item {
 | 
			
		||||
	return calendar.filteredItems("holiday")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (calendar *Calendar) ItemsByType(itemType string) []Item {
 | 
			
		||||
	if itemType == "timeOff" {
 | 
			
		||||
		return calendar.TimeOffs()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return calendar.Holidays()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (calendar *Calendar) TimeOffs() []Item {
 | 
			
		||||
	return calendar.filteredItems("timeOff")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* -------------------- Private Functions -------------------- */
 | 
			
		||||
 | 
			
		||||
func (calendar *Calendar) filteredItems(itemType string) []Item {
 | 
			
		||||
	items := []Item{}
 | 
			
		||||
 | 
			
		||||
	for _, item := range calendar.Items {
 | 
			
		||||
		if item.Type == itemType {
 | 
			
		||||
			items = append(items, item)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return items
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								bamboohr/client.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								bamboohr/client.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
			
		||||
package bamboohr
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/xml"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// A Client represents the data required to connect to the BambooHR API
 | 
			
		||||
type Client struct {
 | 
			
		||||
	apiBase   string
 | 
			
		||||
	apiKey    string
 | 
			
		||||
	subdomain string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewClient creates and returns a new BambooHR client
 | 
			
		||||
func NewClient() *Client {
 | 
			
		||||
	client := Client{
 | 
			
		||||
		apiBase:   "https://api.bamboohr.com/api/gateway.php",
 | 
			
		||||
		apiKey:    os.Getenv("WTF_BAMBOO_HR_TOKEN"),
 | 
			
		||||
		subdomain: os.Getenv("WTF_BAMBOO_HR_SUBDOMAIN"),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &client
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* -------------------- Public Functions -------------------- */
 | 
			
		||||
 | 
			
		||||
// Away returns a string representation of the people who are out of the office during the defined period
 | 
			
		||||
func (client *Client) Away(itemType, startDate, endDate string) []Item {
 | 
			
		||||
	calendar, _ := client.away(startDate, endDate)
 | 
			
		||||
	items := calendar.ItemsByType(itemType)
 | 
			
		||||
 | 
			
		||||
	return items
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* -------------------- Private Functions -------------------- */
 | 
			
		||||
 | 
			
		||||
// away is the private interface for retrieving structural data about who will be out of the office
 | 
			
		||||
// This method does the actual communication with BambooHR and returns the raw Go
 | 
			
		||||
// data structures used by the public interface
 | 
			
		||||
func (client *Client) away(startDate, endDate string) (cal Calendar, err error) {
 | 
			
		||||
	apiURL := fmt.Sprintf(
 | 
			
		||||
		"%s/%s/v1/time_off/whos_out?start=%s&end=%s",
 | 
			
		||||
		client.apiBase,
 | 
			
		||||
		client.subdomain,
 | 
			
		||||
		startDate,
 | 
			
		||||
		endDate,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	data, err := Request(client.apiKey, apiURL)
 | 
			
		||||
	err = xml.Unmarshal(data, &cal)
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								bamboohr/employee.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								bamboohr/employee.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
package bamboohr
 | 
			
		||||
 | 
			
		||||
import ()
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Note: this currently implements the minimum number of fields to fulfill the Away functionality.
 | 
			
		||||
* Undoubtedly there are more fields than this to an employee
 | 
			
		||||
 */
 | 
			
		||||
type Employee struct {
 | 
			
		||||
	ID   int    `xml:"id,attr"`
 | 
			
		||||
	Name string `xml:",chardata"`
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										42
									
								
								bamboohr/item.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								bamboohr/item.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
			
		||||
package bamboohr
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// DateFormat defines the format we expect to receive dates from BambooHR in
 | 
			
		||||
const DateFormat = "2006-01-02"
 | 
			
		||||
 | 
			
		||||
type Item struct {
 | 
			
		||||
	Employee Employee `xml:"employee"`
 | 
			
		||||
	End      string   `xml:"end"`
 | 
			
		||||
	Holiday  string   `xml:"holiday"`
 | 
			
		||||
	Start    string   `xml:"start"`
 | 
			
		||||
	Type     string   `xml:"type,attr"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (item *Item) String() string {
 | 
			
		||||
	return fmt.Sprintf("Item: %s, %s, %s, %s", item.Type, item.Employee.Name, item.Start, item.End)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* -------------------- Public Functions -------------------- */
 | 
			
		||||
 | 
			
		||||
func (item *Item) Name() string {
 | 
			
		||||
	if (item.Employee != Employee{}) {
 | 
			
		||||
		return item.Employee.Name
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return item.Holiday
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (item *Item) PrettyStart() string {
 | 
			
		||||
	newTime, _ := time.Parse(DateFormat, item.Start)
 | 
			
		||||
	return fmt.Sprint(newTime.Format("Jan 2, 2006"))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (item *Item) PrettyEnd() string {
 | 
			
		||||
	newTime, _ := time.Parse(DateFormat, item.End)
 | 
			
		||||
	end := fmt.Sprint(newTime.Format("Jan 2, 2006"))
 | 
			
		||||
	return end
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								bamboohr/request.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								bamboohr/request.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,39 @@
 | 
			
		||||
package bamboohr
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Request(apiKey string, apiURL string) ([]byte, error) {
 | 
			
		||||
	req, err := http.NewRequest("GET", apiURL, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	req.SetBasicAuth(apiKey, "x")
 | 
			
		||||
 | 
			
		||||
	client := &http.Client{}
 | 
			
		||||
	resp, err := client.Do(req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer resp.Body.Close()
 | 
			
		||||
 | 
			
		||||
	data, err := ParseBody(resp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return data, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ParseBody(resp *http.Response) ([]byte, error) {
 | 
			
		||||
	var buffer bytes.Buffer
 | 
			
		||||
	_, err := buffer.ReadFrom(resp.Body)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return buffer.Bytes(), nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								github/github.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								github/github.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
package wtfgithub
 | 
			
		||||
 | 
			
		||||
import ()
 | 
			
		||||
							
								
								
									
										42
									
								
								wtf.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								wtf.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"github.com/rivo/tview"
 | 
			
		||||
	"github.com/senorprogrammer/wtf/bamboohr"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	app := tview.NewApplication()
 | 
			
		||||
 | 
			
		||||
	grid := tview.NewGrid()
 | 
			
		||||
	grid.SetRows(10, 40)    // 10 high, 40 high
 | 
			
		||||
	grid.SetColumns(40, 40) // 40 wide, 40 wide
 | 
			
		||||
	grid.SetBorder(false)
 | 
			
		||||
 | 
			
		||||
	grid.AddItem(bambooView(), 0, 0, 1, 1, 0, 0, false)
 | 
			
		||||
 | 
			
		||||
	if err := app.SetRoot(grid, true).Run(); err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func bambooView() tview.Primitive {
 | 
			
		||||
	items := bamboohr.Fetch()
 | 
			
		||||
 | 
			
		||||
	bamboo := tview.NewTextView()
 | 
			
		||||
	bamboo.SetBorder(true)
 | 
			
		||||
	bamboo.SetDynamicColors(true)
 | 
			
		||||
	bamboo.SetTitle(" 🐨 Away ")
 | 
			
		||||
 | 
			
		||||
	data := ""
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		str := fmt.Sprintf("[green]%s[white]\n%s - %s\n\n", item.Name(), item.PrettyStart(), item.PrettyEnd())
 | 
			
		||||
		data = data + str
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(bamboo, "%s", data)
 | 
			
		||||
 | 
			
		||||
	return bamboo
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user