Documentation
¶
Index ¶
- type Company
- type CompanyCreateRequest
- type CompanyCreateResponse
- type CompanyDeleteRequest
- type CompanyDeleteRequestPath
- type CompanyDeleteResponse
- type CompanyGetRequest
- type CompanyGetRequestPath
- type CompanyGetResponse
- type CompanyListRequest
- type CompanyListRequestFilters
- type CompanyListResponse
- type CompanyUpdateRequest
- type CompanyUpdateRequestPath
- type CompanyUpdateResponse
- type LegacyDate
- type LegacyNumber
- type LegacyUserGroups
- type Milestone
- type MilestoneCreateRequest
- type MilestoneCreateRequestPath
- type MilestoneCreateResponse
- type MilestoneDeleteRequest
- type MilestoneDeleteRequestPath
- type MilestoneDeleteResponse
- type MilestoneGetRequest
- type MilestoneGetRequestPath
- type MilestoneGetResponse
- type MilestoneListRequest
- type MilestoneListRequestFilters
- type MilestoneListRequestPath
- type MilestoneListResponse
- type MilestoneUpdateRequest
- type MilestoneUpdateRequestPath
- type MilestoneUpdateResponse
- type Project
- type ProjectCreateRequest
- type ProjectCreateResponse
- type ProjectDeleteRequest
- type ProjectDeleteRequestPath
- type ProjectDeleteResponse
- type ProjectGetRequest
- type ProjectGetRequestPath
- type ProjectGetResponse
- type ProjectListRequest
- type ProjectListRequestFilters
- type ProjectListResponse
- type ProjectMemberAddRequest
- type ProjectMemberAddRequestPath
- type ProjectMemberAddResponse
- type ProjectUpdateRequest
- type ProjectUpdateRequestPath
- type ProjectUpdateResponse
- type Tag
- type TagCreateRequest
- type TagCreateResponse
- type TagDeleteRequest
- type TagDeleteRequestPath
- type TagDeleteResponse
- type TagGetRequest
- type TagGetRequestPath
- type TagGetResponse
- type TagListRequest
- type TagListRequestFilters
- type TagListResponse
- type TagUpdateRequest
- type TagUpdateRequestPath
- type TagUpdateResponse
- type Task
- type TaskCreateRequest
- type TaskCreateRequestPath
- type TaskCreateResponse
- type TaskDeleteRequest
- type TaskDeleteRequestPath
- type TaskDeleteResponse
- type TaskGetRequest
- type TaskGetRequestPath
- type TaskGetResponse
- type TaskListRequest
- type TaskListRequestFilters
- type TaskListRequestPath
- type TaskListResponse
- type TaskUpdateRequest
- type TaskUpdateRequestPath
- type TaskUpdateResponse
- type Tasklist
- type TasklistCreateRequest
- type TasklistCreateRequestPath
- type TasklistCreateResponse
- type TasklistDeleteRequest
- type TasklistDeleteRequestPath
- type TasklistDeleteResponse
- type TasklistGetRequest
- type TasklistGetRequestPath
- type TasklistGetResponse
- type TasklistListRequest
- type TasklistListRequestFilters
- type TasklistListRequestPath
- type TasklistListResponse
- type TasklistUpdateRequest
- type TasklistUpdateRequestPath
- type TasklistUpdateResponse
- type User
- type UserCreateRequest
- type UserCreateResponse
- type UserDeleteRequest
- type UserDeleteRequestPath
- type UserDeleteResponse
- type UserGetMeRequest
- type UserGetMeResponse
- type UserGetRequest
- type UserGetRequestPath
- type UserGetResponse
- type UserGroups
- type UserListRequest
- type UserListRequestFilters
- type UserListRequestPath
- type UserListResponse
- type UserUpdateRequest
- type UserUpdateRequestPath
- type UserUpdateResponse
Examples ¶
- CompanyCreate
- CompanyDelete
- CompanyGet
- CompanyList
- CompanyUpdate
- MilestoneCreate
- MilestoneDelete
- MilestoneGet
- MilestoneList
- MilestoneUpdate
- ProjectCreate
- ProjectDelete
- ProjectGet
- ProjectList
- ProjectMemberAdd
- ProjectUpdate
- TagCreate
- TagDelete
- TagGet
- TagList
- TagUpdate
- TaskCreate
- TaskDelete
- TaskGet
- TaskList
- TaskUpdate
- TasklistCreate
- TasklistDelete
- TasklistGet
- TasklistList
- TasklistUpdate
- UserCreate
- UserDelete
- UserGet
- UserGetMe
- UserList
- UserUpdate
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Company ¶ added in v0.4.0
type Company struct {
// ID is the unique identifier of the company.
ID int64 `json:"id"`
// AddressOne is the first line of the company's address.
AddressOne string `json:"addressOne"`
// AddressTwo is the second line of the company's address.
AddressTwo string `json:"addressTwo"`
// City is the city where the company is located.
City string `json:"city"`
// CountryCode is the ISO 3166-1 alpha-2 country code where the company is
// located.
CountryCode string `json:"countryCode"`
// EmailOne is the primary email address of the company.
EmailOne string `json:"emailOne"`
// EmailTwo is the secondary email address of the company.
EmailTwo string `json:"emailTwo"`
// EmailThree is the tertiary email address of the company.
EmailThree string `json:"emailThree"`
// Fax is the fax number of the company.
Fax string `json:"fax"`
// Name is the name of the company.
Name string `json:"name"`
// Phone is the phone number of the company.
Phone string `json:"phone"`
// Profile is the profile text of the company.
Profile *string `json:"profileText"`
// State is the state or province where the company is located.
State string `json:"state"`
// Website is the website URL of the company.
Website string `json:"website"`
// Zip is the ZIP or postal code where the company is located.
Zip string `json:"zip"`
// ManagedBy is the user managing the company.
ManagedBy *twapi.Relationship `json:"clientManagedBy"`
// Industry is the industry the company belongs to.
Industry *twapi.Relationship `json:"industry"`
// Tags is a list of tags associated with the company.
Tags []twapi.Relationship `json:"tags"`
// CreatedAt is the date and time when the company was created.
CreatedAt *time.Time `json:"createdAt"`
// UpdatedAt is the date and time when the company was last updated.
UpdatedAt *time.Time `json:"updatedAt"`
// Status is the status of the company. Possible values are "active" or
// "deleted".
Status string `json:"status"`
}
Company represents a client/company in Teamwork.
type CompanyCreateRequest ¶ added in v0.4.0
type CompanyCreateRequest struct {
// AddressOne is the first line of the company's address.
AddressOne *string `json:"addressOne,omitempty"`
// AddressTwo is the second line of the company's address.
AddressTwo *string `json:"addressTwo,omitempty"`
// City is the city where the company is located.
City *string `json:"city,omitempty"`
// CountryCode is the ISO 3166-1 alpha-2 country code where the company is
// located.
CountryCode *string `json:"countrycode,omitempty"`
// EmailOne is the primary email address of the company.
EmailOne *string `json:"emailOne,omitempty"`
// EmailTwo is the secondary email address of the company.
EmailTwo *string `json:"emailTwo,omitempty"`
// EmailThree is the tertiary email address of the company.
EmailThree *string `json:"emailThree,omitempty"`
// Fax is the fax number of the company.
Fax *string `json:"fax,omitempty"`
// Name is the name of the company. This field is required.
Name string `json:"name"`
// Phone is the phone number of the company.
Phone *string `json:"phone,omitempty"`
// Profile is the profile text of the company.
Profile *string `json:"profile,omitempty"`
// State is the state or province where the company is located.
State *string `json:"state,omitempty"`
// Website is the website URL of the company.
Website *string `json:"website,omitempty"`
// Zip is the ZIP or postal code where the company is located.
Zip *string `json:"zip,omitempty"`
// ManagerID is the user ID of the user managing the company.
ManagerID *int64 `json:"clientManagedBy"`
// IndustryID is the industry ID the company belongs to.
IndustryID *int64 `json:"industryCatId,omitempty"`
// TagIDs is a list of tag IDs to associate with the company.
TagIDs []int64 `json:"tagIds,omitempty"`
}
CompanyCreateRequest represents the request body for creating a new client/company.
https://apidocs.teamwork.com/docs/teamwork/v3/companies/post-projects-api-v3-companies-json
func NewCompanyCreateRequest ¶ added in v0.4.0
func NewCompanyCreateRequest(name string) CompanyCreateRequest
NewCompanyCreateRequest creates a new CompanyCreateRequest with the provided name in a specific project.
func (CompanyCreateRequest) HTTPRequest ¶ added in v0.4.0
func (c CompanyCreateRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the CompanyCreateRequest.
type CompanyCreateResponse ¶ added in v0.4.0
type CompanyCreateResponse struct {
// Company is the created company.
Company Company `json:"company"`
}
CompanyCreateResponse represents the response body for creating a new client/company.
https://apidocs.teamwork.com/docs/teamwork/v3/companies/post-projects-api-v3-companies-json
func CompanyCreate ¶ added in v0.4.0
func CompanyCreate( ctx context.Context, engine *twapi.Engine, req CompanyCreateRequest, ) (*CompanyCreateResponse, error)
CompanyCreate creates a new client/company using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startCompanyServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
companyResponse, err := projects.CompanyCreate(ctx, engine, projects.CompanyCreateRequest{
Name: "Test Company",
Profile: twapi.Ptr("A company created via the API."),
})
if err != nil {
fmt.Printf("failed to create company: %s", err)
} else {
fmt.Printf("created company with identifier %d\n", companyResponse.Company.ID)
}
}
func startCompanyServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/companies", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("PATCH /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusNoContent)
})
mux.HandleFunc("GET /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/companies", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"companies":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: created company with identifier 12345
func (*CompanyCreateResponse) HandleHTTPResponse ¶ added in v0.4.0
func (c *CompanyCreateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the CompanyCreateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type CompanyDeleteRequest ¶ added in v0.4.0
type CompanyDeleteRequest struct {
// Path contains the path parameters for the request.
Path CompanyDeleteRequestPath
}
CompanyDeleteRequest represents the request body for deleting a client/company.
func NewCompanyDeleteRequest ¶ added in v0.4.0
func NewCompanyDeleteRequest(companyID int64) CompanyDeleteRequest
NewCompanyDeleteRequest creates a new CompanyDeleteRequest with the provided company ID.
func (CompanyDeleteRequest) HTTPRequest ¶ added in v0.4.0
func (c CompanyDeleteRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the CompanyDeleteRequest.
type CompanyDeleteRequestPath ¶ added in v0.4.0
type CompanyDeleteRequestPath struct {
// ID is the unique identifier of the company to be deleted.
ID int64
}
CompanyDeleteRequestPath contains the path parameters for deleting a client/company.
type CompanyDeleteResponse ¶ added in v0.4.0
type CompanyDeleteResponse struct{}
CompanyDeleteResponse represents the response body for deleting a client/company.
func CompanyDelete ¶ added in v0.4.0
func CompanyDelete( ctx context.Context, engine *twapi.Engine, req CompanyDeleteRequest, ) (*CompanyDeleteResponse, error)
CompanyDelete creates a new client/company using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startCompanyServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.CompanyDelete(ctx, engine, projects.NewCompanyDeleteRequest(12345))
if err != nil {
fmt.Printf("failed to delete company: %s", err)
} else {
fmt.Println("company deleted!")
}
}
func startCompanyServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/companies", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("PATCH /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusNoContent)
})
mux.HandleFunc("GET /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/companies", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"companies":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: company deleted!
func (*CompanyDeleteResponse) HandleHTTPResponse ¶ added in v0.4.0
func (c *CompanyDeleteResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the CompanyDeleteResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type CompanyGetRequest ¶ added in v0.4.0
type CompanyGetRequest struct {
// Path contains the path parameters for the request.
Path CompanyGetRequestPath
}
CompanyGetRequest represents the request body for loading a single client/company.
func NewCompanyGetRequest ¶ added in v0.4.0
func NewCompanyGetRequest(companyID int64) CompanyGetRequest
NewCompanyGetRequest creates a new CompanyGetRequest with the provided company ID. The ID is required to load a company.
func (CompanyGetRequest) HTTPRequest ¶ added in v0.4.0
HTTPRequest creates an HTTP request for the CompanyGetRequest.
type CompanyGetRequestPath ¶ added in v0.4.0
type CompanyGetRequestPath struct {
// ID is the unique identifier of the company to be retrieved.
ID int64 `json:"id"`
}
CompanyGetRequestPath contains the path parameters for loading a single company.
type CompanyGetResponse ¶ added in v0.4.0
type CompanyGetResponse struct {
Company Company `json:"company"`
}
CompanyGetResponse contains all the information related to a client/company.
func CompanyGet ¶ added in v0.4.0
func CompanyGet( ctx context.Context, engine *twapi.Engine, req CompanyGetRequest, ) (*CompanyGetResponse, error)
CompanyGet retrieves a single client/company using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startCompanyServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
companyResponse, err := projects.CompanyGet(ctx, engine, projects.NewCompanyGetRequest(12345))
if err != nil {
fmt.Printf("failed to retrieve company: %s", err)
} else {
fmt.Printf("retrieved company with identifier %d\n", companyResponse.Company.ID)
}
}
func startCompanyServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/companies", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("PATCH /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusNoContent)
})
mux.HandleFunc("GET /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/companies", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"companies":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved company with identifier 12345
func (*CompanyGetResponse) HandleHTTPResponse ¶ added in v0.4.0
func (c *CompanyGetResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the CompanyGetResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type CompanyListRequest ¶ added in v0.4.0
type CompanyListRequest struct {
// Filters contains the filters for loading multiple companies.
Filters CompanyListRequestFilters
}
CompanyListRequest represents the request body for loading multiple clients/companies.
https://apidocs.teamwork.com/docs/teamwork/v3/companies/get-projects-api-v3-companies-json
func NewCompanyListRequest ¶ added in v0.4.0
func NewCompanyListRequest() CompanyListRequest
NewCompanyListRequest creates a new CompanyListRequest with default values.
func (CompanyListRequest) HTTPRequest ¶ added in v0.4.0
HTTPRequest creates an HTTP request for the CompanyListRequest.
type CompanyListRequestFilters ¶ added in v0.4.0
type CompanyListRequestFilters struct {
// SearchTerm is an optional search term to filter clients/companies by name.
SearchTerm string
// TagIDs is an optional list of tag IDs to filter companies by tags.
TagIDs []int64
// MatchAllTags is an optional flag to indicate if all tags must match. If set
// to true, only companies matching all specified tags will be returned.
MatchAllTags *bool
// Page is the page number to retrieve. Defaults to 1.
Page int64
// PageSize is the number of companies to retrieve per page. Defaults to 50.
PageSize int64
}
CompanyListRequestFilters contains the filters for loading multiple clients/companies.
type CompanyListResponse ¶ added in v0.4.0
type CompanyListResponse struct {
Meta struct {
Page struct {
HasMore bool `json:"hasMore"`
} `json:"page"`
} `json:"meta"`
Companies []Company `json:"companies"`
// contains filtered or unexported fields
}
CompanyListResponse contains information by multiple clients/companies matching the request filters.
https://apidocs.teamwork.com/docs/teamwork/v3/companies/get-projects-api-v3-companies-json
func CompanyList ¶ added in v0.4.0
func CompanyList( ctx context.Context, engine *twapi.Engine, req CompanyListRequest, ) (*CompanyListResponse, error)
CompanyList retrieves multiple clients/companies using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startCompanyServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
companiesResponse, err := projects.CompanyList(ctx, engine, projects.CompanyListRequest{
Filters: projects.CompanyListRequestFilters{
SearchTerm: "John",
},
})
if err != nil {
fmt.Printf("failed to list companies: %s", err)
} else {
for _, company := range companiesResponse.Companies {
fmt.Printf("retrieved company with identifier %d\n", company.ID)
}
}
}
func startCompanyServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/companies", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("PATCH /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusNoContent)
})
mux.HandleFunc("GET /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/companies", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"companies":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved company with identifier 12345 retrieved company with identifier 12346
func (*CompanyListResponse) HandleHTTPResponse ¶ added in v0.4.0
func (c *CompanyListResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the CompanyListResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
func (*CompanyListResponse) Iterate ¶ added in v0.4.0
func (c *CompanyListResponse) Iterate() *CompanyListRequest
Iterate returns the request set to the next page, if available. If there are no more pages, a nil request is returned.
func (*CompanyListResponse) SetRequest ¶ added in v0.4.0
func (c *CompanyListResponse) SetRequest(req CompanyListRequest)
SetRequest sets the request used to load this response. This is used for pagination purposes, so the Iterate method can return the next page.
type CompanyUpdateRequest ¶ added in v0.4.0
type CompanyUpdateRequest struct {
// Path contains the path parameters for the request.
Path CompanyUpdateRequestPath `json:"-"`
// AddressOne is the first line of the company's address.
AddressOne *string `json:"addressOne,omitempty"`
// AddressTwo is the second line of the company's address.
AddressTwo *string `json:"addressTwo,omitempty"`
// City is the city where the company is located.
City *string `json:"city,omitempty"`
// CountryCode is the ISO 3166-1 alpha-2 country code where the company is
// located.
CountryCode *string `json:"countrycode,omitempty"`
// EmailOne is the primary email address of the company.
EmailOne *string `json:"emailOne,omitempty"`
// EmailTwo is the secondary email address of the company.
EmailTwo *string `json:"emailTwo,omitempty"`
// EmailThree is the tertiary email address of the company.
EmailThree *string `json:"emailThree,omitempty"`
// Fax is the fax number of the company.
Fax *string `json:"fax,omitempty"`
// Name is the name of the company.
Name *string `json:"name"`
// Phone is the phone number of the company.
Phone *string `json:"phone,omitempty"`
// Profile is the profile text of the company.
Profile *string `json:"profile,omitempty"`
// State is the state or province where the company is located.
State *string `json:"state,omitempty"`
// Website is the website URL of the company.
Website *string `json:"website,omitempty"`
// Zip is the ZIP or postal code where the company is located.
Zip *string `json:"zip,omitempty"`
// ManagerID is the user ID of the user managing the company.
ManagerID *int64 `json:"clientManagedBy"`
// IndustryID is the industry ID the company belongs to.
IndustryID *int64 `json:"industryCatId,omitempty"`
// TagIDs is a list of tag IDs to associate with the company.
TagIDs []int64 `json:"tagIds,omitempty"`
}
CompanyUpdateRequest represents the request body for updating a client/company. Besides the identifier, all other fields are optional. When a field is not provided, it will not be modified.
func NewCompanyUpdateRequest ¶ added in v0.4.0
func NewCompanyUpdateRequest(companyID int64) CompanyUpdateRequest
NewCompanyUpdateRequest creates a new CompanyUpdateRequest with the provided client/company ID. The ID is required to update a company.
func (CompanyUpdateRequest) HTTPRequest ¶ added in v0.4.0
func (c CompanyUpdateRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the CompanyUpdateRequest.
type CompanyUpdateRequestPath ¶ added in v0.4.0
type CompanyUpdateRequestPath struct {
// ID is the unique identifier of the company to be updated.
ID int64
}
CompanyUpdateRequestPath contains the path parameters for updating a client/company.
type CompanyUpdateResponse ¶ added in v0.4.0
type CompanyUpdateResponse struct {
// Company is the updated company.
Company Company `json:"company"`
}
CompanyUpdateResponse represents the response body for updating a client/company.
func CompanyUpdate ¶ added in v0.4.0
func CompanyUpdate( ctx context.Context, engine *twapi.Engine, req CompanyUpdateRequest, ) (*CompanyUpdateResponse, error)
CompanyUpdate updates a new client/company using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startCompanyServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.CompanyUpdate(ctx, engine, projects.CompanyUpdateRequest{
Path: projects.CompanyUpdateRequestPath{
ID: 12345,
},
Profile: twapi.Ptr("Updated profile"),
})
if err != nil {
fmt.Printf("failed to update company: %s", err)
} else {
fmt.Println("company updated!")
}
}
func startCompanyServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/companies", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("PATCH /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusNoContent)
})
mux.HandleFunc("GET /projects/api/v3/companies/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"company":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/companies", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"companies":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: company updated!
func (*CompanyUpdateResponse) HandleHTTPResponse ¶ added in v0.4.0
func (c *CompanyUpdateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the CompanyUpdateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type LegacyDate ¶
LegacyDate is a type alias for time.Time, used to represent legacy date values in the API.
func NewLegacyDate ¶ added in v0.3.0
func NewLegacyDate(t time.Time) LegacyDate
NewLegacyDate creates a new LegacyDate from a time.Time value.
func (LegacyDate) MarshalJSON ¶
func (d LegacyDate) MarshalJSON() ([]byte, error)
MarshalJSON encodes the LegacyDate as a string in the format "20060102".
func (*LegacyDate) UnmarshalJSON ¶
func (d *LegacyDate) UnmarshalJSON(data []byte) error
UnmarshalJSON decodes a JSON string into a LegacyDate type.
type LegacyNumber ¶
type LegacyNumber int64
LegacyNumber is a type alias for int64, used to represent numeric values in the API.
func NewLegacyNumber ¶ added in v0.3.0
func NewLegacyNumber(n int64) LegacyNumber
NewLegacyNumber creates a new LegacyNumber from an int64 value.
func (LegacyNumber) MarshalJSON ¶
func (n LegacyNumber) MarshalJSON() ([]byte, error)
MarshalJSON encodes the LegacyNumber as a string.
func (*LegacyNumber) UnmarshalJSON ¶
func (n *LegacyNumber) UnmarshalJSON(data []byte) error
UnmarshalJSON decodes a JSON string into a LegacyNumber type.
type LegacyUserGroups ¶ added in v0.3.0
LegacyUserGroups represents a collection of users, companies, and teams in a legacy format, where IDs are represented as strings.
func (LegacyUserGroups) IsEmpty ¶ added in v0.3.0
func (m LegacyUserGroups) IsEmpty() bool
IsEmpty checks if the LegacyUserGroups contains no IDs.
func (LegacyUserGroups) MarshalJSON ¶ added in v0.3.0
func (m LegacyUserGroups) MarshalJSON() ([]byte, error)
MarshalJSON encodes the LegacyUserGroups as a JSON object.
func (*LegacyUserGroups) UnmarshalJSON ¶ added in v0.3.0
func (m *LegacyUserGroups) UnmarshalJSON(data []byte) error
UnmarshalJSON decodes a JSON string into a LegacyUserGroups type.
type Milestone ¶ added in v0.3.0
type Milestone struct {
// ID is the unique identifier of the milestone.
ID int64 `json:"id"`
// Name is the name of the milestone.
Name string `json:"name"`
// Description is the description of the milestone.
Description string `json:"description"`
// DueAt is the due date of the milestone.
DueAt time.Time `json:"deadline"`
// Project is the project associated with the milestone.
Project twapi.Relationship `json:"project"`
// Tasklists is the list of tasklists associated with the milestone.
Tasklists []twapi.Relationship `json:"tasklists"`
// Tags is the list of tags associated with the milestone.
Tags []twapi.Relationship `json:"tags"`
// ResponsibleParties is the list of assingees (users, teams and
// clients/companies) responsible for the milestone.
ResponsibleParties []twapi.Relationship `json:"responsibleParties"`
// CreatedAt is the date and time when the milestone was created.
CreatedAt *time.Time `json:"createdOn"`
// UpdatedAt is the date and time when the milestone was last updated.
UpdatedAt *time.Time `json:"lastChangedOn"`
// DeletedAt is the date and time when the milestone was deleted, if it was
// deleted.
DeletedAt *time.Time `json:"deletedOn"`
// CompletedAt is the date and time when the milestone was completed, if it
// was completed.
CompletedAt *time.Time `json:"completedOn"`
// CompletedBy is the ID of the user who completed the milestone, if it was
// completed.
CompletedBy *int64 `json:"completedBy"`
// Completed indicates whether the milestone is completed or not.
Completed bool `json:"completed"`
// Status is the status of the milestone. It can be "new", "reopened",
// "completed" or "deleted".
Status string `json:"status"`
}
Milestone represents a milestone in Teamwork.
type MilestoneCreateRequest ¶ added in v0.3.0
type MilestoneCreateRequest struct {
// Path contains the path parameters for the request.
Path MilestoneCreateRequestPath `json:"-"`
// Name is the name of the milestone.
Name string `json:"title"`
// Description is an optional description of the milestone.
Description *string `json:"description,omitempty"`
// DueAt is the due date of the milestone.
DueAt LegacyDate `json:"deadline"`
// TasklistIDs is an optional list of tasklist IDs to associate with the
// milestone.
TasklistIDs []int64 `json:"tasklistIds,omitempty"`
// TagIDs is an optional list of tag IDs to associate with the milestone.
TagIDs []int64 `json:"tagIds,omitempty"`
// Assignees is a list of users, companies and teams responsible for the
// milestone.
Assignees LegacyUserGroups `json:"responsible-party-ids"`
}
MilestoneCreateRequest represents the request body for creating a new milestone.
https://apidocs.teamwork.com/docs/teamwork/v1/task-lists/post-projects-id-milestones-json
func NewMilestoneCreateRequest ¶ added in v0.3.0
func NewMilestoneCreateRequest( projectID int64, name string, dueAt LegacyDate, assignees LegacyUserGroups, ) MilestoneCreateRequest
NewMilestoneCreateRequest creates a new MilestoneCreateRequest with the provided required fields.
func (MilestoneCreateRequest) HTTPRequest ¶ added in v0.3.0
func (m MilestoneCreateRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the MilestoneCreateRequest.
type MilestoneCreateRequestPath ¶ added in v0.3.0
type MilestoneCreateRequestPath struct {
// ProjectID is the unique identifier of the project that will contain the
// milestone.
ProjectID int64
}
MilestoneUpdateRequestPath contains the path parameters for creating a milestone.
type MilestoneCreateResponse ¶ added in v0.3.0
type MilestoneCreateResponse struct {
// ID is the unique identifier of the created milestone.
ID LegacyNumber `json:"milestoneId"`
}
MilestoneCreateResponse represents the response body for creating a new milestone.
https://apidocs.teamwork.com/docs/teamwork/v1/task-lists/post-projects-id-milestones-json
func MilestoneCreate ¶ added in v0.3.0
func MilestoneCreate( ctx context.Context, engine *twapi.Engine, req MilestoneCreateRequest, ) (*MilestoneCreateResponse, error)
MilestoneCreate creates a new milestone using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
"time"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startMilestoneServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
milestone, err := projects.MilestoneCreate(ctx, engine, projects.MilestoneCreateRequest{
Path: projects.MilestoneCreateRequestPath{
ProjectID: 777,
},
Name: "New Milestone",
Description: twapi.Ptr("This is a new milestone created via the API."),
DueAt: projects.NewLegacyDate(time.Now()),
Assignees: projects.LegacyUserGroups{
UserIDs: []int64{456, 789},
},
})
if err != nil {
fmt.Printf("failed to create milestone: %s", err)
} else {
fmt.Printf("created milestone with identifier %d\n", milestone.ID)
}
}
func startMilestoneServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/{id}/milestones", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","milestoneId":"12345"}`)
})
mux.HandleFunc("PUT /milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"milestone":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/milestones", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"milestones":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: created milestone with identifier 12345
func (*MilestoneCreateResponse) HandleHTTPResponse ¶ added in v0.3.0
func (m *MilestoneCreateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the MilestoneCreateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type MilestoneDeleteRequest ¶ added in v0.3.0
type MilestoneDeleteRequest struct {
// Path contains the path parameters for the request.
Path MilestoneDeleteRequestPath
}
MilestoneDeleteRequest represents the request body for deleting a milestone.
https://apidocs.teamwork.com/docs/teamwork/v1/task-lists/delete-milestones-id-json
func NewMilestoneDeleteRequest ¶ added in v0.3.0
func NewMilestoneDeleteRequest(milestoneID int64) MilestoneDeleteRequest
NewMilestoneDeleteRequest creates a new MilestoneDeleteRequest with the provided milestone ID.
func (MilestoneDeleteRequest) HTTPRequest ¶ added in v0.3.0
func (m MilestoneDeleteRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the MilestoneDeleteRequest.
type MilestoneDeleteRequestPath ¶ added in v0.3.0
type MilestoneDeleteRequestPath struct {
// ID is the unique identifier of the milestone to be deleted.
ID int64
}
MilestoneDeleteRequestPath contains the path parameters for deleting a milestone.
type MilestoneDeleteResponse ¶ added in v0.3.0
type MilestoneDeleteResponse struct{}
MilestoneDeleteResponse represents the response body for deleting a milestone.
https://apidocs.teamwork.com/docs/teamwork/v1/task-lists/delete-milestones-id-json
func MilestoneDelete ¶ added in v0.3.0
func MilestoneDelete( ctx context.Context, engine *twapi.Engine, req MilestoneDeleteRequest, ) (*MilestoneDeleteResponse, error)
MilestoneDelete creates a new milestone using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startMilestoneServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.MilestoneDelete(ctx, engine, projects.NewMilestoneDeleteRequest(12345))
if err != nil {
fmt.Printf("failed to delete milestone: %s", err)
} else {
fmt.Println("milestone deleted!")
}
}
func startMilestoneServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/{id}/milestones", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","milestoneId":"12345"}`)
})
mux.HandleFunc("PUT /milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"milestone":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/milestones", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"milestones":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: milestone deleted!
func (*MilestoneDeleteResponse) HandleHTTPResponse ¶ added in v0.3.0
func (m *MilestoneDeleteResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the MilestoneDeleteResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type MilestoneGetRequest ¶ added in v0.3.0
type MilestoneGetRequest struct {
// Path contains the path parameters for the request.
Path MilestoneGetRequestPath
}
MilestoneGetRequest represents the request body for loading a single milestone.
func NewMilestoneGetRequest ¶ added in v0.3.0
func NewMilestoneGetRequest(milestoneID int64) MilestoneGetRequest
NewMilestoneGetRequest creates a new MilestoneGetRequest with the provided milestone ID. The ID is required to load a milestone.
func (MilestoneGetRequest) HTTPRequest ¶ added in v0.3.0
HTTPRequest creates an HTTP request for the MilestoneGetRequest.
type MilestoneGetRequestPath ¶ added in v0.3.0
type MilestoneGetRequestPath struct {
// ID is the unique identifier of the milestone to be retrieved.
ID int64 `json:"id"`
}
MilestoneGetRequestPath contains the path parameters for loading a single milestone.
type MilestoneGetResponse ¶ added in v0.3.0
type MilestoneGetResponse struct {
Milestone Milestone `json:"milestone"`
}
MilestoneGetResponse contains all the information related to a milestone.
func MilestoneGet ¶ added in v0.3.0
func MilestoneGet( ctx context.Context, engine *twapi.Engine, req MilestoneGetRequest, ) (*MilestoneGetResponse, error)
MilestoneGet retrieves a single milestone using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startMilestoneServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
milestoneResponse, err := projects.MilestoneGet(ctx, engine, projects.NewMilestoneGetRequest(12345))
if err != nil {
fmt.Printf("failed to retrieve milestone: %s", err)
} else {
fmt.Printf("retrieved milestone with identifier %d\n", milestoneResponse.Milestone.ID)
}
}
func startMilestoneServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/{id}/milestones", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","milestoneId":"12345"}`)
})
mux.HandleFunc("PUT /milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"milestone":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/milestones", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"milestones":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved milestone with identifier 12345
func (*MilestoneGetResponse) HandleHTTPResponse ¶ added in v0.3.0
func (m *MilestoneGetResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the MilestoneGetResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type MilestoneListRequest ¶ added in v0.3.0
type MilestoneListRequest struct {
// Path contains the path parameters for the request.
Path MilestoneListRequestPath
// Filters contains the filters for loading multiple milestones.
Filters MilestoneListRequestFilters
}
MilestoneListRequest represents the request body for loading multiple milestones.
https://apidocs.teamwork.com/docs/teamwork/v3/milestones/get-projects-api-v3-milestones-json https://apidocs.teamwork.com/docs/teamwork/v3/milestones/get-projects-api-v3-projects-project-id-milestones-json
func NewMilestoneListRequest ¶ added in v0.3.0
func NewMilestoneListRequest() MilestoneListRequest
NewMilestoneListRequest creates a new MilestoneListRequest with default values.
func (MilestoneListRequest) HTTPRequest ¶ added in v0.3.0
func (m MilestoneListRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the MilestoneListRequest.
type MilestoneListRequestFilters ¶ added in v0.3.0
type MilestoneListRequestFilters struct {
// SearchTerm is an optional search term to filter milestones by name.
SearchTerm string
// TagIDs is an optional list of tag IDs to filter milestones by tags.
TagIDs []int64
// MatchAllTags is an optional flag to indicate if all tags must match. If set
// to true, only milestones matching all specified tags will be returned.
MatchAllTags *bool
// Page is the page number to retrieve. Defaults to 1.
Page int64
// PageSize is the number of milestones to retrieve per page. Defaults to 50.
PageSize int64
}
MilestoneListRequestFilters contains the filters for loading multiple milestones.
type MilestoneListRequestPath ¶ added in v0.3.0
type MilestoneListRequestPath struct {
// ProjectID is the unique identifier of the project whose milestones are to
// be retrieved.
ProjectID int64
}
MilestoneListRequestPath contains the path parameters for loading multiple milestones.
type MilestoneListResponse ¶ added in v0.3.0
type MilestoneListResponse struct {
Meta struct {
Page struct {
HasMore bool `json:"hasMore"`
} `json:"page"`
} `json:"meta"`
Milestones []Milestone `json:"milestones"`
// contains filtered or unexported fields
}
MilestoneListResponse contains information by multiple milestones matching the request filters.
https://apidocs.teamwork.com/docs/teamwork/v3/milestones/get-projects-api-v3-milestones-json https://apidocs.teamwork.com/docs/teamwork/v3/milestones/get-projects-api-v3-projects-project-id-milestones-json
func MilestoneList ¶ added in v0.3.0
func MilestoneList( ctx context.Context, engine *twapi.Engine, req MilestoneListRequest, ) (*MilestoneListResponse, error)
MilestoneList retrieves multiple milestones using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startMilestoneServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
milestonesResponse, err := projects.MilestoneList(ctx, engine, projects.MilestoneListRequest{
Filters: projects.MilestoneListRequestFilters{
SearchTerm: "Example",
},
})
if err != nil {
fmt.Printf("failed to list milestones: %s", err)
} else {
for _, milestone := range milestonesResponse.Milestones {
fmt.Printf("retrieved milestone with identifier %d\n", milestone.ID)
}
}
}
func startMilestoneServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/{id}/milestones", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","milestoneId":"12345"}`)
})
mux.HandleFunc("PUT /milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"milestone":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/milestones", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"milestones":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved milestone with identifier 12345 retrieved milestone with identifier 12346
func (*MilestoneListResponse) HandleHTTPResponse ¶ added in v0.3.0
func (m *MilestoneListResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the MilestoneListResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
func (*MilestoneListResponse) Iterate ¶ added in v0.3.0
func (m *MilestoneListResponse) Iterate() *MilestoneListRequest
Iterate returns the request set to the next page, if available. If there are no more pages, a nil request is returned.
func (*MilestoneListResponse) SetRequest ¶ added in v0.3.0
func (m *MilestoneListResponse) SetRequest(req MilestoneListRequest)
SetRequest sets the request used to load this response. This is used for pagination purposes, so the Iterate method can return the next page.
type MilestoneUpdateRequest ¶ added in v0.3.0
type MilestoneUpdateRequest struct {
// Path contains the path parameters for the request.
Path MilestoneUpdateRequestPath `json:"-"`
// Name is the name of the milestone.
Name *string `json:"title,omitempty"`
// Description is an optional description of the milestone.
Description *string `json:"description,omitempty"`
// DueAt is the due date of the milestone.
DueAt *LegacyDate `json:"deadline,omitempty"`
// TasklistIDs is an optional list of tasklist IDs to associate with the
// milestone.
TasklistIDs []int64 `json:"tasklistIds,omitempty"`
// TagIDs is an optional list of tag IDs to associate with the milestone.
TagIDs []int64 `json:"tagIds,omitempty"`
// Assignees is a list of users, companies and teams responsible for the
// milestone.
Assignees *LegacyUserGroups `json:"responsible-party-ids,omitempty"`
}
MilestoneUpdateRequest represents the request body for updating a milestone. Besides the identifier, all other fields are optional. When a field is not provided, it will not be modified.
https://apidocs.teamwork.com/docs/teamwork/v1/task-lists/put-milestones-id-json
func NewMilestoneUpdateRequest ¶ added in v0.3.0
func NewMilestoneUpdateRequest(milestoneID int64) MilestoneUpdateRequest
NewMilestoneUpdateRequest creates a new MilestoneUpdateRequest with the provided milestone ID. The ID is required to update a milestone.
func (MilestoneUpdateRequest) HTTPRequest ¶ added in v0.3.0
func (m MilestoneUpdateRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the MilestoneUpdateRequest.
type MilestoneUpdateRequestPath ¶ added in v0.3.0
type MilestoneUpdateRequestPath struct {
// ID is the unique identifier of the milestone to be updated.
ID int64
}
MilestoneUpdateRequestPath contains the path parameters for updating a milestone.
type MilestoneUpdateResponse ¶ added in v0.3.0
type MilestoneUpdateResponse struct{}
MilestoneUpdateResponse represents the response body for updating a milestone.
https://apidocs.teamwork.com/docs/teamwork/v1/task-lists/put-milestones-id-json
func MilestoneUpdate ¶ added in v0.3.0
func MilestoneUpdate( ctx context.Context, engine *twapi.Engine, req MilestoneUpdateRequest, ) (*MilestoneUpdateResponse, error)
MilestoneUpdate updates a milestone using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startMilestoneServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.MilestoneUpdate(ctx, engine, projects.MilestoneUpdateRequest{
Path: projects.MilestoneUpdateRequestPath{
ID: 12345,
},
Description: twapi.Ptr("This is an updated description."),
})
if err != nil {
fmt.Printf("failed to update milestone: %s", err)
} else {
fmt.Println("milestone updated!")
}
}
func startMilestoneServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/{id}/milestones", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","milestoneId":"12345"}`)
})
mux.HandleFunc("PUT /milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/milestones/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"milestone":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/milestones", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"milestones":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: milestone updated!
func (*MilestoneUpdateResponse) HandleHTTPResponse ¶ added in v0.3.0
func (m *MilestoneUpdateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the MilestoneUpdateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type Project ¶ added in v0.0.3
type Project struct {
// ID is the unique identifier of the project.
ID int64 `json:"id"`
// Description is an optional description of the project.
Description *string `json:"description"`
// Name is the name of the project.
Name string `json:"name"`
// StartAt is the start date of the project.
StartAt *time.Time `json:"startAt"`
// EndAt is the end date of the project.
EndAt *time.Time `json:"endAt"`
// Company is the company associated with the project.
Company twapi.Relationship `json:"company"`
// Owner is the user who owns the project.
Owner *twapi.Relationship `json:"projectOwner"`
// Tags is a list of tags associated with the project.
Tags []twapi.Relationship `json:"tags"`
// CreatedAt is the date and time when the project was created.
CreatedAt *time.Time `json:"createdAt"`
// CreatedBy is the ID of the user who created the project.
CreatedBy *int64 `json:"createdBy"`
// UpdatedAt is the date and time when the project was last updated.
UpdatedAt *time.Time `json:"updatedAt"`
// UpdatedBy is the ID of the user who last updated the project.
UpdatedBy *int64 `json:"updatedBy"`
// CompletedAt is the date and time when the project was completed.
CompletedAt *time.Time `json:"completedAt"`
// CompletedBy is the ID of the user who completed the project.
CompletedBy *int64 `json:"completedBy"`
// Status is the status of the project. It can be "active", "inactive"
// (archived) or "deleted".
Status string `json:"status"`
// Type is the type of the project. It can be "normal", "tasklists-template",
// "projects-template", "personal", "holder-project", "tentative" or
// "global-messages".
Type string `json:"type"`
}
Project represents a project in Teamwork.
type ProjectCreateRequest ¶
type ProjectCreateRequest struct {
// Name is the name of the project.
Name string `json:"name"`
// Description is an optional description of the project.
Description *string `json:"description,omitempty"`
// StartAt is an optional start date for the project. By default it doesn't
// have a start date.
StartAt *LegacyDate `json:"start-date,omitempty"`
// EndAt is an optional end date for the project. By default it doesn't have
// an end date.
EndAt *LegacyDate `json:"end-date,omitempty"`
// CompanyID is an optional ID of the company/client associated with the
// project. By default it is the ID of the company of the logged user
// creating the project.
CompanyID int64 `json:"companyId"`
// OwnerID is an optional ID of the user who owns the project. By default it
// is the ID of the logged user creating the project.
OwnerID *int64 `json:"projectOwnerId,omitempty"`
// TagIDs is an optional list of tag IDs associated with the project.
TagIDs []int64 `json:"tagIds,omitempty"`
}
ProjectCreateRequest represents the request body for creating a new project.
https://apidocs.teamwork.com/docs/teamwork/v1/projects/post-projects-json
func NewProjectCreateRequest ¶ added in v0.0.6
func NewProjectCreateRequest(name string) ProjectCreateRequest
NewProjectCreateRequest creates a new ProjectCreateRequest with the provided name. The name is required to create a new project.
func (ProjectCreateRequest) HTTPRequest ¶
func (p ProjectCreateRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the ProjectCreateRequest.
type ProjectCreateResponse ¶
type ProjectCreateResponse struct {
// ID is the unique identifier of the created project.
ID LegacyNumber `json:"id"`
}
ProjectCreateResponse represents the response body for creating a new project.
https://apidocs.teamwork.com/docs/teamwork/v1/projects/post-projects-json
func ProjectCreate ¶
func ProjectCreate( ctx context.Context, engine *twapi.Engine, req ProjectCreateRequest, ) (*ProjectCreateResponse, error)
ProjectCreate creates a new project using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
"time"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startProjectServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
project, err := projects.ProjectCreate(ctx, engine, projects.ProjectCreateRequest{
Name: "New Project",
Description: twapi.Ptr("This is a new project created via the API."),
StartAt: twapi.Ptr(projects.LegacyDate(time.Now().AddDate(0, 0, 1))), // Start tomorrow
EndAt: twapi.Ptr(projects.LegacyDate(time.Now().AddDate(0, 0, 30))), // End in 30 days
CompanyID: 12345, // Replace with your company ID
OwnerID: twapi.Ptr(int64(67890)), // Replace with the owner user ID
TagIDs: []int64{11111, 22222}, // Replace with your tag IDs
})
if err != nil {
fmt.Printf("failed to create project: %s", err)
} else {
fmt.Printf("created project with identifier %d\n", project.ID)
}
}
func startProjectServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","id":"12345"}`)
})
mux.HandleFunc("PUT /projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"project":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/projects", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"projects":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: created project with identifier 12345
func (*ProjectCreateResponse) HandleHTTPResponse ¶
func (p *ProjectCreateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the ProjectCreateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type ProjectDeleteRequest ¶ added in v0.0.3
type ProjectDeleteRequest struct {
// Path contains the path parameters for the request.
Path ProjectDeleteRequestPath
}
ProjectDeleteRequest represents the request body for deleting a project.
https://apidocs.teamwork.com/docs/teamwork/v1/projects/delete-projects-id-json
func NewProjectDeleteRequest ¶ added in v0.0.6
func NewProjectDeleteRequest(projectID int64) ProjectDeleteRequest
NewProjectDeleteRequest creates a new ProjectDeleteRequest with the provided project ID.
func (ProjectDeleteRequest) HTTPRequest ¶ added in v0.0.3
func (p ProjectDeleteRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the ProjectDeleteRequest.
type ProjectDeleteRequestPath ¶ added in v0.0.6
type ProjectDeleteRequestPath struct {
// ID is the unique identifier of the project to be deleted.
ID int64
}
ProjectDeleteRequestPath contains the path parameters for deleting a project.
type ProjectDeleteResponse ¶ added in v0.0.3
type ProjectDeleteResponse struct{}
ProjectDeleteResponse represents the response body for deleting a project.
https://apidocs.teamwork.com/docs/teamwork/v1/projects/delete-projects-id-json
func ProjectDelete ¶ added in v0.0.3
func ProjectDelete( ctx context.Context, engine *twapi.Engine, req ProjectDeleteRequest, ) (*ProjectDeleteResponse, error)
ProjectDelete creates a new project using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startProjectServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.ProjectDelete(ctx, engine, projects.NewProjectDeleteRequest(12345))
if err != nil {
fmt.Printf("failed to delete project: %s", err)
} else {
fmt.Println("project deleted!")
}
}
func startProjectServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","id":"12345"}`)
})
mux.HandleFunc("PUT /projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"project":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/projects", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"projects":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: project deleted!
func (*ProjectDeleteResponse) HandleHTTPResponse ¶ added in v0.0.3
func (p *ProjectDeleteResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the ProjectDeleteResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type ProjectGetRequest ¶ added in v0.0.6
type ProjectGetRequest struct {
// Path contains the path parameters for the request.
Path ProjectGetRequestPath
}
ProjectGetRequest represents the request body for loading a single project.
https://apidocs.teamwork.com/docs/teamwork/v3/projects/get-projects-api-v3-projects-project-id-json
func NewProjectGetRequest ¶ added in v0.0.6
func NewProjectGetRequest(projectID int64) ProjectGetRequest
NewProjectGetRequest creates a new ProjectGetRequest with the provided project ID. The ID is required to load a project.
func (ProjectGetRequest) HTTPRequest ¶ added in v0.0.6
HTTPRequest creates an HTTP request for the ProjectGetRequest.
type ProjectGetRequestPath ¶ added in v0.0.6
type ProjectGetRequestPath struct {
// ID is the unique identifier of the project to be retrieved.
ID int64 `json:"id"`
}
ProjectGetRequestPath contains the path parameters for loading a single project.
type ProjectGetResponse ¶ added in v0.0.6
type ProjectGetResponse struct {
Project Project `json:"project"`
}
ProjectGetResponse contains all the information related to a project.
https://apidocs.teamwork.com/docs/teamwork/v3/projects/get-projects-api-v3-projects-project-id-json
func ProjectGet ¶ added in v0.0.6
func ProjectGet( ctx context.Context, engine *twapi.Engine, req ProjectGetRequest, ) (*ProjectGetResponse, error)
ProjectGet retrieves a single project using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startProjectServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
projectResponse, err := projects.ProjectGet(ctx, engine, projects.NewProjectGetRequest(12345))
if err != nil {
fmt.Printf("failed to retrieve project: %s", err)
} else {
fmt.Printf("retrieved project with identifier %d\n", projectResponse.Project.ID)
}
}
func startProjectServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","id":"12345"}`)
})
mux.HandleFunc("PUT /projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"project":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/projects", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"projects":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved project with identifier 12345
func (*ProjectGetResponse) HandleHTTPResponse ¶ added in v0.0.6
func (p *ProjectGetResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the ProjectGetResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type ProjectListRequest ¶ added in v0.0.6
type ProjectListRequest struct {
// Filters contains the filters for loading multiple projects.
Filters ProjectListRequestFilters
}
ProjectListRequest represents the request body for loading multiple projects.
https://apidocs.teamwork.com/docs/teamwork/v3/projects/get-projects-api-v3-projects-json
func NewProjectListRequest ¶ added in v0.0.6
func NewProjectListRequest() ProjectListRequest
NewProjectListRequest creates a new ProjectListRequest with default values.
func (ProjectListRequest) HTTPRequest ¶ added in v0.0.6
HTTPRequest creates an HTTP request for the ProjectListRequest.
type ProjectListRequestFilters ¶ added in v0.0.6
type ProjectListRequestFilters struct {
// SearchTerm is an optional search term to filter projects by name or
// description.
SearchTerm string
// TagIDs is an optional list of tag IDs to filter projects by tags.
TagIDs []int64
// MatchAllTags is an optional flag to indicate if all tags must match. If
// set to true, only projects matching all specified tags will be returned.
MatchAllTags *bool
// Page is the page number to retrieve. Defaults to 1.
Page int64
// PageSize is the number of projects to retrieve per page. Defaults to 50.
PageSize int64
}
ProjectListRequestFilters contains the filters for loading multiple projects.
type ProjectListResponse ¶ added in v0.0.6
type ProjectListResponse struct {
Meta struct {
Page struct {
HasMore bool `json:"hasMore"`
} `json:"page"`
} `json:"meta"`
Projects []Project `json:"projects"`
// contains filtered or unexported fields
}
ProjectListResponse contains information by multiple projects matching the request filters.
https://apidocs.teamwork.com/docs/teamwork/v3/projects/get-projects-api-v3-projects-json
func ProjectList ¶ added in v0.0.6
func ProjectList( ctx context.Context, engine *twapi.Engine, req ProjectListRequest, ) (*ProjectListResponse, error)
ProjectList retrieves multiple projects using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startProjectServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
projectsResponse, err := projects.ProjectList(ctx, engine, projects.ProjectListRequest{
Filters: projects.ProjectListRequestFilters{
SearchTerm: "Example",
},
})
if err != nil {
fmt.Printf("failed to list projects: %s", err)
} else {
for _, project := range projectsResponse.Projects {
fmt.Printf("retrieved project with identifier %d\n", project.ID)
}
}
}
func startProjectServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","id":"12345"}`)
})
mux.HandleFunc("PUT /projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"project":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/projects", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"projects":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved project with identifier 12345 retrieved project with identifier 12346
func (*ProjectListResponse) HandleHTTPResponse ¶ added in v0.0.6
func (p *ProjectListResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the ProjectListResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
func (*ProjectListResponse) Iterate ¶ added in v0.0.7
func (p *ProjectListResponse) Iterate() *ProjectListRequest
Iterate returns the request set to the next page, if available. If there are no more pages, a nil request is returned.
func (*ProjectListResponse) SetRequest ¶ added in v0.0.7
func (p *ProjectListResponse) SetRequest(req ProjectListRequest)
SetRequest sets the request used to load this response. This is used for pagination purposes, so the Iterate method can return the next page.
type ProjectMemberAddRequest ¶ added in v0.3.0
type ProjectMemberAddRequest struct {
// Path contains the path parameters for the request.
Path ProjectMemberAddRequestPath `json:"-"`
// UserIDs is a list of user IDs to add as project members.
UserIDs []int64 `json:"userIds"`
}
ProjectMemberAddRequest represents the request body for adding users as project members.
func NewProjectMemberAddRequest ¶ added in v0.3.0
func NewProjectMemberAddRequest(projectID int64, userIDs ...int64) ProjectMemberAddRequest
NewProjectMemberAddRequest creates a new ProjectMemberAddRequest with the provided project and user IDs.
func (ProjectMemberAddRequest) HTTPRequest ¶ added in v0.3.0
func (u ProjectMemberAddRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the ProjectMemberAddRequest.
type ProjectMemberAddRequestPath ¶ added in v0.3.0
type ProjectMemberAddRequestPath struct {
ProjectID int64 `json:"projectId"`
}
ProjectMemberAddRequestPath contains the path parameters for adding users as project members.
type ProjectMemberAddResponse ¶ added in v0.3.0
type ProjectMemberAddResponse struct{}
ProjectMemberAddResponse represents the response body for adding users as project members.
func ProjectMemberAdd ¶ added in v0.3.0
func ProjectMemberAdd( ctx context.Context, engine *twapi.Engine, req ProjectMemberAddRequest, ) (*ProjectMemberAddResponse, error)
ProjectMemberAdd adds users to a project.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startProjectMemberServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.ProjectMemberAdd(ctx, engine, projects.NewProjectMemberAddRequest(123, 456, 789))
if err != nil {
fmt.Printf("failed to add project members: %s", err)
} else {
fmt.Println("added users as project members")
}
}
func startProjectMemberServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("PUT /projects/api/v3/projects/{id}/people", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "123" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"usersAdded":[456],"usersAlreadyInProject":[789],"usersNotAdded":[]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: added users as project members
func (*ProjectMemberAddResponse) HandleHTTPResponse ¶ added in v0.3.0
func (u *ProjectMemberAddResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the ProjectMemberAddResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type ProjectUpdateRequest ¶ added in v0.0.3
type ProjectUpdateRequest struct {
// Path contains the path parameters for the request.
Path ProjectUpdateRequestPath
// Name is the name of the project.
Name *string `json:"name,omitempty"`
// Description is the project description.
Description *string `json:"description,omitempty"`
// StartAt is the start date for the project.
StartAt *LegacyDate `json:"start-date,omitempty"`
// EndAt is the end date for the project.
EndAt *LegacyDate `json:"end-date,omitempty"`
// CompanyID is the company/client associated with the project.
CompanyID *int64 `json:"companyId,omitempty"`
// OwnerID is the ID of the user who owns the project.
OwnerID *int64 `json:"projectOwnerId,omitempty"`
// TagIDs is the list of tag IDs associated with the project.
TagIDs []int64 `json:"tagIds,omitempty"`
}
ProjectUpdateRequest represents the request body for updating a project. Besides the identifier, all other fields are optional. When a field is not provided, it will not be modified.
https://apidocs.teamwork.com/docs/teamwork/v1/projects/put-projects-id-json
func NewProjectUpdateRequest ¶ added in v0.0.6
func NewProjectUpdateRequest(projectID int64) ProjectUpdateRequest
NewProjectUpdateRequest creates a new ProjectUpdateRequest with the provided project ID. The ID is required to update a project.
func (ProjectUpdateRequest) HTTPRequest ¶ added in v0.0.3
func (p ProjectUpdateRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the ProjectUpdateRequest.
type ProjectUpdateRequestPath ¶ added in v0.0.6
type ProjectUpdateRequestPath struct {
// ID is the unique identifier of the project to be updated.
ID int64
}
ProjectUpdateRequestPath contains the path parameters for updating a project.
type ProjectUpdateResponse ¶ added in v0.0.3
type ProjectUpdateResponse struct{}
ProjectUpdateResponse represents the response body for updating a project.
https://apidocs.teamwork.com/docs/teamwork/v1/projects/put-projects-id-json
func ProjectUpdate ¶ added in v0.0.3
func ProjectUpdate( ctx context.Context, engine *twapi.Engine, req ProjectUpdateRequest, ) (*ProjectUpdateResponse, error)
ProjectUpdate updates a project using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startProjectServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.ProjectUpdate(ctx, engine, projects.ProjectUpdateRequest{
Path: projects.ProjectUpdateRequestPath{
ID: 12345,
},
Description: twapi.Ptr("This is an updated description."),
})
if err != nil {
fmt.Printf("failed to update project: %s", err)
} else {
fmt.Println("project updated!")
}
}
func startProjectServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","id":"12345"}`)
})
mux.HandleFunc("PUT /projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/projects/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"project":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/projects", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"projects":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: project updated!
func (*ProjectUpdateResponse) HandleHTTPResponse ¶ added in v0.0.3
func (p *ProjectUpdateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the ProjectUpdateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type Tag ¶ added in v0.4.0
type Tag struct {
// ID is the unique identifier of the tag.
ID int64 `json:"id"`
// Name is the name of the tag.
Name string `json:"name"`
// Project is the project the tag belongs to.
Project *twapi.Relationship `json:"project"`
}
Tag represents a tag in Teamwork.
type TagCreateRequest ¶ added in v0.4.0
type TagCreateRequest struct {
// Name is the name of the tag. This field is required.
Name string `json:"name"`
// ProjectID is the unique identifier of the project the tag belongs to.
ProjectID *int64 `json:"projectId,omitempty"`
}
TagCreateRequest represents the request body for creating a new tag.
https://apidocs.teamwork.com/docs/teamwork/v3/tags/post-projects-api-v3-tags-json
func NewTagCreateRequest ¶ added in v0.4.0
func NewTagCreateRequest(name string) TagCreateRequest
NewTagCreateRequest creates a new TagCreateRequest with the provided name.
func (TagCreateRequest) HTTPRequest ¶ added in v0.4.0
HTTPRequest creates an HTTP request for the TagCreateRequest.
type TagCreateResponse ¶ added in v0.4.0
type TagCreateResponse struct {
// Tag is the created tag.
Tag Tag `json:"tag"`
}
TagCreateResponse represents the response body for creating a new tag.
https://apidocs.teamwork.com/docs/teamwork/v3/tags/post-projects-api-v3-tags-json
func TagCreate ¶ added in v0.4.0
func TagCreate( ctx context.Context, engine *twapi.Engine, req TagCreateRequest, ) (*TagCreateResponse, error)
TagCreate creates a new tag using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTagServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
tagResponse, err := projects.TagCreate(ctx, engine, projects.NewTagCreateRequest("Test Tag"))
if err != nil {
fmt.Printf("failed to create tag: %s", err)
} else {
fmt.Printf("created tag with identifier %d\n", tagResponse.Tag.ID)
}
}
func startTagServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/tags", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("PATCH /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusNoContent)
})
mux.HandleFunc("GET /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tags", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tags":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: created tag with identifier 12345
func (*TagCreateResponse) HandleHTTPResponse ¶ added in v0.4.0
func (t *TagCreateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TagCreateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type TagDeleteRequest ¶ added in v0.4.0
type TagDeleteRequest struct {
// Path contains the path parameters for the request.
Path TagDeleteRequestPath
}
TagDeleteRequest represents the request body for deleting a tag.
https://apidocs.teamwork.com/docs/teamwork/v3/tags/delete-projects-api-v3-tags-tag-id-json
func NewTagDeleteRequest ¶ added in v0.4.0
func NewTagDeleteRequest(tagID int64) TagDeleteRequest
NewTagDeleteRequest creates a new TagDeleteRequest with the provided tag ID.
func (TagDeleteRequest) HTTPRequest ¶ added in v0.4.0
HTTPRequest creates an HTTP request for the TagDeleteRequest.
type TagDeleteRequestPath ¶ added in v0.4.0
type TagDeleteRequestPath struct {
// ID is the unique identifier of the tag to be deleted.
ID int64
}
TagDeleteRequestPath contains the path parameters for deleting a tag.
type TagDeleteResponse ¶ added in v0.4.0
type TagDeleteResponse struct{}
TagDeleteResponse represents the response body for deleting a tag.
https://apidocs.teamwork.com/docs/teamwork/v1/tags/delete-tags-id-json
func TagDelete ¶ added in v0.4.0
func TagDelete( ctx context.Context, engine *twapi.Engine, req TagDeleteRequest, ) (*TagDeleteResponse, error)
TagDelete creates a new tag using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTagServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.TagDelete(ctx, engine, projects.NewTagDeleteRequest(12345))
if err != nil {
fmt.Printf("failed to delete tag: %s", err)
} else {
fmt.Println("tag deleted!")
}
}
func startTagServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/tags", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("PATCH /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusNoContent)
})
mux.HandleFunc("GET /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tags", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tags":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: tag deleted!
func (*TagDeleteResponse) HandleHTTPResponse ¶ added in v0.4.0
func (t *TagDeleteResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TagDeleteResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type TagGetRequest ¶ added in v0.4.0
type TagGetRequest struct {
// Path contains the path parameters for the request.
Path TagGetRequestPath
}
TagGetRequest represents the request body for loading a single tag.
https://apidocs.teamwork.com/docs/teamwork/v3/tags/get-projects-api-v3-tags-tag-id-json
func NewTagGetRequest ¶ added in v0.4.0
func NewTagGetRequest(tagID int64) TagGetRequest
NewTagGetRequest creates a new TagGetRequest with the provided tag ID. The ID is required to load a tag.
func (TagGetRequest) HTTPRequest ¶ added in v0.4.0
HTTPRequest creates an HTTP request for the TagGetRequest.
type TagGetRequestPath ¶ added in v0.4.0
type TagGetRequestPath struct {
// ID is the unique identifier of the tag to be retrieved.
ID int64 `json:"id"`
}
TagGetRequestPath contains the path parameters for loading a single tag.
type TagGetResponse ¶ added in v0.4.0
type TagGetResponse struct {
Tag Tag `json:"tag"`
}
TagGetResponse contains all the information related to a tag.
https://apidocs.teamwork.com/docs/teamwork/v3/tags/get-projects-api-v3-tags-tag-id-json
func TagGet ¶ added in v0.4.0
func TagGet( ctx context.Context, engine *twapi.Engine, req TagGetRequest, ) (*TagGetResponse, error)
TagGet retrieves a single tag using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTagServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
tagResponse, err := projects.TagGet(ctx, engine, projects.NewTagGetRequest(12345))
if err != nil {
fmt.Printf("failed to retrieve tag: %s", err)
} else {
fmt.Printf("retrieved tag with identifier %d\n", tagResponse.Tag.ID)
}
}
func startTagServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/tags", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("PATCH /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusNoContent)
})
mux.HandleFunc("GET /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tags", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tags":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved tag with identifier 12345
func (*TagGetResponse) HandleHTTPResponse ¶ added in v0.4.0
func (t *TagGetResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TagGetResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type TagListRequest ¶ added in v0.4.0
type TagListRequest struct {
// Filters contains the filters for loading multiple tags.
Filters TagListRequestFilters
}
TagListRequest represents the request body for loading multiple tags.
https://apidocs.teamwork.com/docs/teamwork/v3/tags/get-projects-api-v3-tags-json
func NewTagListRequest ¶ added in v0.4.0
func NewTagListRequest() TagListRequest
NewTagListRequest creates a new TagListRequest with default values.
func (TagListRequest) HTTPRequest ¶ added in v0.4.0
HTTPRequest creates an HTTP request for the TagListRequest.
type TagListRequestFilters ¶ added in v0.4.0
type TagListRequestFilters struct {
// SearchTerm is an optional search term to filter tags by name.
SearchTerm string
// ProjectIDs is an optional list of project IDs to filter tags by
// belonging to specific projects.
ProjectIDs []int64
// Page is the page number to retrieve. Defaults to 1.
Page int64
// PageSize is the number of tags to retrieve per page. Defaults to 50.
PageSize int64
}
TagListRequestFilters contains the filters for loading multiple tags.
type TagListResponse ¶ added in v0.4.0
type TagListResponse struct {
Meta struct {
Page struct {
HasMore bool `json:"hasMore"`
} `json:"page"`
} `json:"meta"`
Tags []Tag `json:"tags"`
// contains filtered or unexported fields
}
TagListResponse contains information by multiple tags matching the request filters.
https://apidocs.teamwork.com/docs/teamwork/v3/tags/get-projects-api-v3-tags-json
func TagList ¶ added in v0.4.0
func TagList( ctx context.Context, engine *twapi.Engine, req TagListRequest, ) (*TagListResponse, error)
TagList retrieves multiple tags using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTagServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
tagsResponse, err := projects.TagList(ctx, engine, projects.TagListRequest{
Filters: projects.TagListRequestFilters{
SearchTerm: "Q&A",
},
})
if err != nil {
fmt.Printf("failed to list tags: %s", err)
} else {
for _, tag := range tagsResponse.Tags {
fmt.Printf("retrieved tag with identifier %d\n", tag.ID)
}
}
}
func startTagServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/tags", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("PATCH /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusNoContent)
})
mux.HandleFunc("GET /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tags", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tags":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved tag with identifier 12345 retrieved tag with identifier 12346
func (*TagListResponse) HandleHTTPResponse ¶ added in v0.4.0
func (t *TagListResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TagListResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
func (*TagListResponse) Iterate ¶ added in v0.4.0
func (t *TagListResponse) Iterate() *TagListRequest
Iterate returns the request set to the next page, if available. If there are no more pages, a nil request is returned.
func (*TagListResponse) SetRequest ¶ added in v0.4.0
func (t *TagListResponse) SetRequest(req TagListRequest)
SetRequest sets the request used to load this response. This is used for pagination purposes, so the Iterate method can return the next page.
type TagUpdateRequest ¶ added in v0.4.0
type TagUpdateRequest struct {
// Path contains the path parameters for the request.
Path TagUpdateRequestPath `json:"-"`
// Name is the name of the tag.
Name *string `json:"name,omitempty"`
// ProjectID is the unique identifier of the project the tag belongs to.
ProjectID *int64 `json:"projectId,omitempty"`
}
TagUpdateRequest represents the request body for updating a tag. Besides the identifier, all other fields are optional. When a field is not provided, it will not be modified.
https://apidocs.teamwork.com/docs/teamwork/v3/tags/patch-projects-api-v3-tags-tag-id-json
func NewTagUpdateRequest ¶ added in v0.4.0
func NewTagUpdateRequest(tagID int64) TagUpdateRequest
NewTagUpdateRequest creates a new TagUpdateRequest with the provided tag ID. The ID is required to update a tag.
func (TagUpdateRequest) HTTPRequest ¶ added in v0.4.0
HTTPRequest creates an HTTP request for the TagUpdateRequest.
type TagUpdateRequestPath ¶ added in v0.4.0
type TagUpdateRequestPath struct {
// ID is the unique identifier of the tag to be updated.
ID int64
}
TagUpdateRequestPath contains the path parameters for updating a tag.
type TagUpdateResponse ¶ added in v0.4.0
type TagUpdateResponse struct {
// Tag is the updated tag.
Tag Tag `json:"tag"`
}
TagUpdateResponse represents the response body for updating a tag.
https://apidocs.teamwork.com/docs/teamwork/v1/tags/put-tags-id-json
func TagUpdate ¶ added in v0.4.0
func TagUpdate( ctx context.Context, engine *twapi.Engine, req TagUpdateRequest, ) (*TagUpdateResponse, error)
TagUpdate updates a tag using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTagServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.TagUpdate(ctx, engine, projects.TagUpdateRequest{
Path: projects.TagUpdateRequestPath{
ID: 12345,
},
Name: twapi.Ptr("Updated tag"),
})
if err != nil {
fmt.Printf("failed to update tag: %s", err)
} else {
fmt.Println("tag updated!")
}
}
func startTagServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/tags", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("PATCH /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusNoContent)
})
mux.HandleFunc("GET /projects/api/v3/tags/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tag":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tags", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tags":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: tag updated!
func (*TagUpdateResponse) HandleHTTPResponse ¶ added in v0.4.0
func (t *TagUpdateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TagUpdateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type Task ¶ added in v0.2.0
type Task struct {
// ID is the unique identifier of the task.
ID int64 `json:"id"`
// Name is the name of the task.
Name string `json:"name"`
// Description is the description of the task.
Description *string `json:"description"`
// DescriptionContentType is the content type of the description. It can be
// "TEXT" or "HTML".
DescriptionContentType *string `json:"descriptionContentType"`
// Priority is the priority of the task. It can be "none", "low", "medium" or
// "high".
Priority *string `json:"priority"`
// Progress is the progress of the task, in percentage (0-100).
Progress int64 `json:"progress"`
// StartAt is the date and time when the task is scheduled to start.
StartAt *time.Time `json:"startDate"`
// DueAt is the date and time when the task is scheduled to be completed.
DueAt *time.Time `json:"dueDate"`
// EstimatedMinutes is the estimated time to complete the task, in minutes.
EstimatedMinutes int64 `json:"estimateMinutes"`
// Tasklist is the relationship to the tasklist containing this task.
Tasklist twapi.Relationship `json:"tasklist"`
// Assignees is the list of users, teams or clients/companies assigned to this
// task.
Assignees []twapi.Relationship `json:"assignees"`
// Tags is the list of tags associated with this task.
Tags []twapi.Relationship `json:"tags"`
// CreatedBy is the ID of the user who created the task.
CreatedBy *int64 `json:"createdBy"`
// CreatedAt is the date and time when the task was created.
CreatedAt *time.Time `json:"createdAt"`
// UpdatedBy is the ID of the user who last updated the task.
UpdatedBy *int64 `json:"updatedBy"`
// UpdatedAt is the date and time when the task was last updated.
UpdatedAt time.Time `json:"updatedAt"`
// DeletedBy is the ID of the user who deleted the task, if it was deleted.
DeletedBy *int64 `json:"deletedBy"`
// DeletedAt is the date and time when the task was deleted, if it was
// deleted.
DeletedAt *time.Time `json:"deletedAt"`
// CompletedBy is the ID of the user who completed the task, if it was
// completed.
CompletedBy *int64 `json:"completedBy,omitempty"`
// CompletedAt is the date and time when the task was completed, if it was
// completed.
CompletedAt *time.Time `json:"completedAt,omitempty"`
// Status is the status of the task. It can be "new", "reopened", "completed"
// or "deleted".
Status string `json:"status"`
}
Task represents a task in Teamwork.
type TaskCreateRequest ¶ added in v0.2.0
type TaskCreateRequest struct {
// Path contains the path parameters for the request.
Path TaskCreateRequestPath `json:"-"`
// Name is the name of the task
Name string `json:"name"`
// Description is an optional description of the task.
Description *string `json:"description,omitempty"`
// Priority is the priority of the task. It can be "none", "low", "medium" or
// "high".
Priority *string `json:"priority,omitempty"`
// Progress is the progress of the task, in percentage (0-100).
Progress *int64 `json:"progress,omitempty"`
// StartAt is the date and time when the task is scheduled to start.
StartAt *twapi.Date `json:"startAt,omitempty"`
// DueAt is the date and time when the task is scheduled to be completed.
DueAt *twapi.Date `json:"dueAt,omitempty"`
// EstimatedMinutes is the estimated time to complete the task, in minutes.
EstimatedMinutes *int64 `json:"estimatedMinutes,omitempty"`
// Assignees is the list of users, teams or clients/companies assigned to this
// task.
Assignees *UserGroups `json:"assignees,omitempty"`
// TagIDs is the list of tag IDs associated with this task.
TagIDs []int64 `json:"tagIds,omitempty"`
}
TaskCreateRequest represents the request body for creating a new task.
func NewTaskCreateRequest ¶ added in v0.2.0
func NewTaskCreateRequest(tasklistID int64, name string) TaskCreateRequest
NewTaskCreateRequest creates a new TaskCreateRequest with the provided name in a specific tasklist.
func (TaskCreateRequest) HTTPRequest ¶ added in v0.2.0
HTTPRequest creates an HTTP request for the TaskCreateRequest.
type TaskCreateRequestPath ¶ added in v0.2.0
type TaskCreateRequestPath struct {
// TasklistID is the unique identifier of the tasklist that will contain the
// task.
TasklistID int64
}
TaskUpdateRequestPath contains the path parameters for creating a task.
type TaskCreateResponse ¶ added in v0.2.0
type TaskCreateResponse struct {
// Task is the created task.
Task Task `json:"task"`
}
TaskCreateResponse represents the response body for creating a new task.
func TaskCreate ¶ added in v0.2.0
func TaskCreate( ctx context.Context, engine *twapi.Engine, req TaskCreateRequest, ) (*TaskCreateResponse, error)
TaskCreate creates a new task using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTaskServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
taskResponse, err := projects.TaskCreate(ctx, engine, projects.TaskCreateRequest{
Path: projects.TaskCreateRequestPath{
TasklistID: 777,
},
Name: "New Task",
Description: twapi.Ptr("This is a new task created via the API."),
})
if err != nil {
fmt.Printf("failed to create task: %s", err)
} else {
fmt.Printf("created task with identifier %d\n", taskResponse.Task.ID)
}
}
func startTaskServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/tasklists/{id}/tasks", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("PUT /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"affected":{"taskIds":[12345]}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasks", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasks":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: created task with identifier 12345
func (*TaskCreateResponse) HandleHTTPResponse ¶ added in v0.2.0
func (t *TaskCreateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TaskCreateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type TaskDeleteRequest ¶ added in v0.2.0
type TaskDeleteRequest struct {
// Path contains the path parameters for the request.
Path TaskDeleteRequestPath
}
TaskDeleteRequest represents the request body for deleting a task.
https://apidocs.teamwork.com/docs/teamwork/v3/tasks/delete-projects-api-v3-tasks-task-id-json
func NewTaskDeleteRequest ¶ added in v0.2.0
func NewTaskDeleteRequest(taskID int64) TaskDeleteRequest
NewTaskDeleteRequest creates a new TaskDeleteRequest with the provided task ID.
func (TaskDeleteRequest) HTTPRequest ¶ added in v0.2.0
HTTPRequest creates an HTTP request for the TaskDeleteRequest.
type TaskDeleteRequestPath ¶ added in v0.2.0
type TaskDeleteRequestPath struct {
// ID is the unique identifier of the task to be deleted.
ID int64
}
TaskDeleteRequestPath contains the path parameters for deleting a task.
type TaskDeleteResponse ¶ added in v0.2.0
type TaskDeleteResponse struct{}
TaskDeleteResponse represents the response body for deleting a task.
https://apidocs.teamwork.com/docs/teamwork/v3/tasks/delete-projects-api-v3-tasks-task-id-json
func TaskDelete ¶ added in v0.2.0
func TaskDelete( ctx context.Context, engine *twapi.Engine, req TaskDeleteRequest, ) (*TaskDeleteResponse, error)
TaskDelete creates a new task using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTaskServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.TaskDelete(ctx, engine, projects.NewTaskDeleteRequest(12345))
if err != nil {
fmt.Printf("failed to delete task: %s", err)
} else {
fmt.Println("task deleted!")
}
}
func startTaskServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/tasklists/{id}/tasks", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("PUT /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"affected":{"taskIds":[12345]}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasks", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasks":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: task deleted!
func (*TaskDeleteResponse) HandleHTTPResponse ¶ added in v0.2.0
func (t *TaskDeleteResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TaskDeleteResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type TaskGetRequest ¶ added in v0.2.0
type TaskGetRequest struct {
// Path contains the path parameters for the request.
Path TaskGetRequestPath
}
TaskGetRequest represents the request body for loading a single task.
https://apidocs.teamwork.com/docs/teamwork/v3/tasks/get-projects-api-v3-tasks-task-id-json
func NewTaskGetRequest ¶ added in v0.2.0
func NewTaskGetRequest(taskID int64) TaskGetRequest
NewTaskGetRequest creates a new TaskGetRequest with the provided task ID. The ID is required to load a task.
func (TaskGetRequest) HTTPRequest ¶ added in v0.2.0
HTTPRequest creates an HTTP request for the TaskGetRequest.
type TaskGetRequestPath ¶ added in v0.2.0
type TaskGetRequestPath struct {
// ID is the unique identifier of the task to be retrieved.
ID int64 `json:"id"`
}
TaskGetRequestPath contains the path parameters for loading a single task.
type TaskGetResponse ¶ added in v0.2.0
type TaskGetResponse struct {
Task Task `json:"task"`
}
TaskGetResponse contains all the information related to a task.
https://apidocs.teamwork.com/docs/teamwork/v3/tasks/get-projects-api-v3-tasks-task-id-json
func TaskGet ¶ added in v0.2.0
func TaskGet( ctx context.Context, engine *twapi.Engine, req TaskGetRequest, ) (*TaskGetResponse, error)
TaskGet retrieves a single task using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTaskServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
taskResponse, err := projects.TaskGet(ctx, engine, projects.NewTaskGetRequest(12345))
if err != nil {
fmt.Printf("failed to retrieve task: %s", err)
} else {
fmt.Printf("retrieved task with identifier %d\n", taskResponse.Task.ID)
}
}
func startTaskServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/tasklists/{id}/tasks", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("PUT /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"affected":{"taskIds":[12345]}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasks", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasks":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved task with identifier 12345
func (*TaskGetResponse) HandleHTTPResponse ¶ added in v0.2.0
func (t *TaskGetResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TaskGetResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type TaskListRequest ¶ added in v0.2.0
type TaskListRequest struct {
// Path contains the path parameters for the request.
Path TaskListRequestPath
// Filters contains the filters for loading multiple tasks.
Filters TaskListRequestFilters
}
TaskListRequest represents the request body for loading multiple tasks.
https://apidocs.teamwork.com/docs/teamwork/v3/tasks/get-projects-api-v3-tasks-json https://apidocs.teamwork.com/docs/teamwork/v3/tasks/get-projects-api-v3-projects-project-id-tasks-json https://apidocs.teamwork.com/docs/teamwork/v3/tasks/get-projects-api-v3-tasklists-tasklist-id-tasks-json
func NewTaskListRequest ¶ added in v0.2.0
func NewTaskListRequest() TaskListRequest
NewTaskListRequest creates a new TaskListRequest with default values.
func (TaskListRequest) HTTPRequest ¶ added in v0.2.0
HTTPRequest creates an HTTP request for the TaskListRequest.
type TaskListRequestFilters ¶ added in v0.2.0
type TaskListRequestFilters struct {
// SearchTerm is an optional search term to filter tasks by name, description
// or tasklist's name.
SearchTerm string
// TagIDs is an optional list of tag IDs to filter tasks by tags.
TagIDs []int64
// MatchAllTags is an optional flag to indicate if all tags must match. If set
// to true, only tasks matching all specified tags will be returned.
MatchAllTags *bool
// Page is the page number to retrieve. Defaults to 1.
Page int64
// PageSize is the number of tasks to retrieve per page. Defaults to 50.
PageSize int64
}
TaskListRequestFilters contains the filters for loading multiple tasks.
type TaskListRequestPath ¶ added in v0.2.0
type TaskListRequestPath struct {
// ProjectID is the unique identifier of the project whose tasks are to be
// retrieved.
ProjectID int64
// TasklistID is the unique identifier of the tasklist whose tasks are to be
// retrieved. If provided, the ProjectID is ignored.
TasklistID int64
}
TaskListRequestPath contains the path parameters for loading multiple tasks.
type TaskListResponse ¶ added in v0.2.0
type TaskListResponse struct {
Meta struct {
Page struct {
HasMore bool `json:"hasMore"`
} `json:"page"`
} `json:"meta"`
Tasks []Task `json:"tasks"`
// contains filtered or unexported fields
}
TaskListResponse contains information by multiple tasks matching the request filters.
https://apidocs.teamwork.com/docs/teamwork/v3/tasks/get-projects-api-v3-tasks-json https://apidocs.teamwork.com/docs/teamwork/v3/tasks/get-projects-api-v3-projects-project-id-tasks-json https://apidocs.teamwork.com/docs/teamwork/v3/tasks/get-projects-api-v3-tasklists-tasklist-id-tasks-json
func TaskList ¶ added in v0.2.0
func TaskList( ctx context.Context, engine *twapi.Engine, req TaskListRequest, ) (*TaskListResponse, error)
TaskList retrieves multiple tasks using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTaskServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
tasksResponse, err := projects.TaskList(ctx, engine, projects.TaskListRequest{
Filters: projects.TaskListRequestFilters{
SearchTerm: "Example",
},
})
if err != nil {
fmt.Printf("failed to list tasks: %s", err)
} else {
for _, task := range tasksResponse.Tasks {
fmt.Printf("retrieved task with identifier %d\n", task.ID)
}
}
}
func startTaskServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/tasklists/{id}/tasks", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("PUT /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"affected":{"taskIds":[12345]}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasks", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasks":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved task with identifier 12345 retrieved task with identifier 12346
func (*TaskListResponse) HandleHTTPResponse ¶ added in v0.2.0
func (t *TaskListResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TaskListResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
func (*TaskListResponse) Iterate ¶ added in v0.2.0
func (t *TaskListResponse) Iterate() *TaskListRequest
Iterate returns the request set to the next page, if available. If there are no more pages, a nil request is returned.
func (*TaskListResponse) SetRequest ¶ added in v0.2.0
func (t *TaskListResponse) SetRequest(req TaskListRequest)
SetRequest sets the request used to load this response. This is used for pagination purposes, so the Iterate method can return the next page.
type TaskUpdateRequest ¶ added in v0.2.0
type TaskUpdateRequest struct {
// Path contains the path parameters for the request.
Path TaskUpdateRequestPath `json:"-"`
// Name is the name of the task
Name *string `json:"name,omitempty"`
// Description is an optional description of the task.
Description *string `json:"description,omitempty"`
// Priority is the priority of the task. It can be "none", "low", "medium" or
// "high".
Priority *string `json:"priority,omitempty"`
// Progress is the progress of the task, in percentage (0-100).
Progress *int64 `json:"progress,omitempty"`
// StartAt is the date and time when the task is scheduled to start.
StartAt *twapi.Date `json:"startAt,omitempty"`
// DueAt is the date and time when the task is scheduled to be completed.
DueAt *twapi.Date `json:"dueAt,omitempty"`
// EstimatedMinutes is the estimated time to complete the task, in minutes.
EstimatedMinutes *int64 `json:"estimatedMinutes,omitempty"`
// TasklistID is the identifier of the tasklist that will contain the task. If
// provided, the task will be moved to this tasklist.
TasklistID *int64 `json:"tasklistId,omitempty"`
// Assignees is the list of users, teams or clients/companies assigned to this
// task.
Assignees *UserGroups `json:"assignees,omitempty"`
// TagIDs is the list of tag IDs associated with this task.
TagIDs []int64 `json:"tagIds,omitempty"`
}
TaskUpdateRequest represents the request body for updating a task. Besides the identifier, all other fields are optional. When a field is not provided, it will not be modified.
https://apidocs.teamwork.com/docs/teamwork/v3/tasks/patch-projects-api-v3-tasks-task-id-json
func NewTaskUpdateRequest ¶ added in v0.2.0
func NewTaskUpdateRequest(taskID int64) TaskUpdateRequest
NewTaskUpdateRequest creates a new TaskUpdateRequest with the provided task ID. The ID is required to update a task.
func (TaskUpdateRequest) HTTPRequest ¶ added in v0.2.0
HTTPRequest creates an HTTP request for the TaskUpdateRequest.
type TaskUpdateRequestPath ¶ added in v0.2.0
type TaskUpdateRequestPath struct {
// ID is the unique identifier of the task to be updated.
ID int64
}
TaskUpdateRequestPath contains the path parameters for updating a task.
type TaskUpdateResponse ¶ added in v0.2.0
type TaskUpdateResponse struct {
// Task is the updated task.
Task Task `json:"task"`
}
TaskUpdateResponse represents the response body for updating a task.
https://apidocs.teamwork.com/docs/teamwork/v3/tasks/patch-projects-api-v3-tasks-task-id-json
func TaskUpdate ¶ added in v0.2.0
func TaskUpdate( ctx context.Context, engine *twapi.Engine, req TaskUpdateRequest, ) (*TaskUpdateResponse, error)
TaskUpdate updates a task using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTaskServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.TaskUpdate(ctx, engine, projects.TaskUpdateRequest{
Path: projects.TaskUpdateRequestPath{
ID: 12345,
},
Description: twapi.Ptr("This is an updated description."),
})
if err != nil {
fmt.Printf("failed to update task: %s", err)
} else {
fmt.Println("task updated!")
}
}
func startTaskServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/api/v3/tasklists/{id}/tasks", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("PUT /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("DELETE /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"affected":{"taskIds":[12345]}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasks/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"task":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasks", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasks":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: task updated!
func (*TaskUpdateResponse) HandleHTTPResponse ¶ added in v0.2.0
func (t *TaskUpdateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TaskUpdateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type Tasklist ¶ added in v0.1.0
type Tasklist struct {
// ID is the unique identifier of the tasklist.
ID int64 `json:"id"`
// Name is the name of the tasklist.
Name string `json:"name"`
// Description is the description of the tasklist.
Description string `json:"description"`
// Project is the project associated with the tasklist.
Project twapi.Relationship `json:"project"`
// Milestone is the milestone associated with the tasklist.
Milestone *twapi.Relationship `json:"milestone"`
// CreatedAt is the date and time when the tasklist was created.
CreatedAt *time.Time `json:"createdAt"`
// UpdatedAt is the date and time when the tasklist was last updated.
UpdatedAt *time.Time `json:"updatedAt"`
// Status is the status of the tasklist. It can be "new", "reopened",
// "completed" or "deleted".
Status string `json:"status"`
}
Tasklist represents a tasklist in Teamwork.
type TasklistCreateRequest ¶ added in v0.1.0
type TasklistCreateRequest struct {
// Path contains the path parameters for the request.
Path TasklistCreateRequestPath `json:"-"`
// Name is the name of the tasklist
Name string `json:"name"`
// Description is an optional description of the tasklist.
Description *string `json:"description,omitempty"`
// MilestoneID is an optional ID of the milestone associated with the
// tasklist.
MilestoneID *int64 `json:"milestone-Id,omitempty"`
}
TasklistCreateRequest represents the request body for creating a new tasklist.
https://apidocs.teamwork.com/docs/teamwork/v1/task-lists/post-projects-id-tasklists-json
func NewTasklistCreateRequest ¶ added in v0.1.0
func NewTasklistCreateRequest(projectID int64, name string) TasklistCreateRequest
NewTasklistCreateRequest creates a new TasklistCreateRequest with the provided name in a specific project.
func (TasklistCreateRequest) HTTPRequest ¶ added in v0.1.0
func (t TasklistCreateRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the TasklistCreateRequest.
type TasklistCreateRequestPath ¶ added in v0.1.0
type TasklistCreateRequestPath struct {
// ProjectID is the unique identifier of the project that will contain the
// tasklist.
ProjectID int64
}
TasklistUpdateRequestPath contains the path parameters for creating a tasklist.
type TasklistCreateResponse ¶ added in v0.1.0
type TasklistCreateResponse struct {
// ID is the unique identifier of the created tasklist.
ID LegacyNumber `json:"tasklistId"`
}
TasklistCreateResponse represents the response body for creating a new tasklist.
https://apidocs.teamwork.com/docs/teamwork/v1/task-lists/post-projects-id-tasklists-json
func TasklistCreate ¶ added in v0.1.0
func TasklistCreate( ctx context.Context, engine *twapi.Engine, req TasklistCreateRequest, ) (*TasklistCreateResponse, error)
TasklistCreate creates a new tasklist using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTasklistServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
tasklist, err := projects.TasklistCreate(ctx, engine, projects.TasklistCreateRequest{
Path: projects.TasklistCreateRequestPath{
ProjectID: 777,
},
Name: "New Tasklist",
Description: twapi.Ptr("This is a new tasklist created via the API."),
})
if err != nil {
fmt.Printf("failed to create tasklist: %s", err)
} else {
fmt.Printf("created tasklist with identifier %d\n", tasklist.ID)
}
}
func startTasklistServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/{id}/tasklists", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","tasklistId":"12345"}`)
})
mux.HandleFunc("PUT /tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasklist":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasklists", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasklists":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: created tasklist with identifier 12345
func (*TasklistCreateResponse) HandleHTTPResponse ¶ added in v0.1.0
func (t *TasklistCreateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TasklistCreateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type TasklistDeleteRequest ¶ added in v0.1.0
type TasklistDeleteRequest struct {
// Path contains the path parameters for the request.
Path TasklistDeleteRequestPath
}
TasklistDeleteRequest represents the request body for deleting a tasklist.
https://apidocs.teamwork.com/docs/teamwork/v1/task-lists/delete-tasklists-id-json
func NewTasklistDeleteRequest ¶ added in v0.1.0
func NewTasklistDeleteRequest(tasklistID int64) TasklistDeleteRequest
NewTasklistDeleteRequest creates a new TasklistDeleteRequest with the provided tasklist ID.
func (TasklistDeleteRequest) HTTPRequest ¶ added in v0.1.0
func (t TasklistDeleteRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the TasklistDeleteRequest.
type TasklistDeleteRequestPath ¶ added in v0.1.0
type TasklistDeleteRequestPath struct {
// ID is the unique identifier of the tasklist to be deleted.
ID int64
}
TasklistDeleteRequestPath contains the path parameters for deleting a tasklist.
type TasklistDeleteResponse ¶ added in v0.1.0
type TasklistDeleteResponse struct{}
TasklistDeleteResponse represents the response body for deleting a tasklist.
https://apidocs.teamwork.com/docs/teamwork/v1/task-lists/delete-tasklists-id-json
func TasklistDelete ¶ added in v0.1.0
func TasklistDelete( ctx context.Context, engine *twapi.Engine, req TasklistDeleteRequest, ) (*TasklistDeleteResponse, error)
TasklistDelete creates a new tasklist using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTasklistServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.TasklistDelete(ctx, engine, projects.NewTasklistDeleteRequest(12345))
if err != nil {
fmt.Printf("failed to delete tasklist: %s", err)
} else {
fmt.Println("tasklist deleted!")
}
}
func startTasklistServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/{id}/tasklists", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","tasklistId":"12345"}`)
})
mux.HandleFunc("PUT /tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasklist":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasklists", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasklists":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: tasklist deleted!
func (*TasklistDeleteResponse) HandleHTTPResponse ¶ added in v0.1.0
func (t *TasklistDeleteResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TasklistDeleteResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type TasklistGetRequest ¶ added in v0.1.0
type TasklistGetRequest struct {
// Path contains the path parameters for the request.
Path TasklistGetRequestPath
}
TasklistGetRequest represents the request body for loading a single tasklist.
https://apidocs.teamwork.com/docs/teamwork/v3/task-lists/get-projects-api-v3-tasklists-tasklist-id
func NewTasklistGetRequest ¶ added in v0.1.0
func NewTasklistGetRequest(tasklistID int64) TasklistGetRequest
NewTasklistGetRequest creates a new TasklistGetRequest with the provided tasklist ID. The ID is required to load a tasklist.
func (TasklistGetRequest) HTTPRequest ¶ added in v0.1.0
HTTPRequest creates an HTTP request for the TasklistGetRequest.
type TasklistGetRequestPath ¶ added in v0.1.0
type TasklistGetRequestPath struct {
// ID is the unique identifier of the tasklist to be retrieved.
ID int64 `json:"id"`
}
TasklistGetRequestPath contains the path parameters for loading a single tasklist.
type TasklistGetResponse ¶ added in v0.1.0
type TasklistGetResponse struct {
Tasklist Tasklist `json:"tasklist"`
}
TasklistGetResponse contains all the information related to a tasklist.
https://apidocs.teamwork.com/docs/teamwork/v3/task-lists/get-projects-api-v3-tasklists-tasklist-id
func TasklistGet ¶ added in v0.1.0
func TasklistGet( ctx context.Context, engine *twapi.Engine, req TasklistGetRequest, ) (*TasklistGetResponse, error)
TasklistGet retrieves a single tasklist using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTasklistServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
tasklistResponse, err := projects.TasklistGet(ctx, engine, projects.NewTasklistGetRequest(12345))
if err != nil {
fmt.Printf("failed to retrieve tasklist: %s", err)
} else {
fmt.Printf("retrieved tasklist with identifier %d\n", tasklistResponse.Tasklist.ID)
}
}
func startTasklistServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/{id}/tasklists", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","tasklistId":"12345"}`)
})
mux.HandleFunc("PUT /tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasklist":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasklists", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasklists":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved tasklist with identifier 12345
func (*TasklistGetResponse) HandleHTTPResponse ¶ added in v0.1.0
func (t *TasklistGetResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TasklistGetResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type TasklistListRequest ¶ added in v0.1.0
type TasklistListRequest struct {
// Path contains the path parameters for the request.
Path TasklistListRequestPath
// Filters contains the filters for loading multiple tasklists.
Filters TasklistListRequestFilters
}
TasklistListRequest represents the request body for loading multiple tasklists.
https://apidocs.teamwork.com/docs/teamwork/v3/task-lists/get-projects-api-v3-tasklists https://apidocs.teamwork.com/docs/teamwork/v3/task-lists/get-projects-api-v3-projects-project-id-tasklists
func NewTasklistListRequest ¶ added in v0.1.0
func NewTasklistListRequest() TasklistListRequest
NewTasklistListRequest creates a new TasklistListRequest with default values.
func (TasklistListRequest) HTTPRequest ¶ added in v0.1.0
HTTPRequest creates an HTTP request for the TasklistListRequest.
type TasklistListRequestFilters ¶ added in v0.1.0
type TasklistListRequestFilters struct {
// SearchTerm is an optional search term to filter tasklists by name.
SearchTerm string
// Page is the page number to retrieve. Defaults to 1.
Page int64
// PageSize is the number of tasklists to retrieve per page. Defaults to 50.
PageSize int64
}
TasklistListRequestFilters contains the filters for loading multiple tasklists.
type TasklistListRequestPath ¶ added in v0.1.0
type TasklistListRequestPath struct {
// ProjectID is the unique identifier of the project whose tasklists are to be
// retrieved.
ProjectID int64
}
TasklistListRequestPath contains the path parameters for loading multiple tasklists.
type TasklistListResponse ¶ added in v0.1.0
type TasklistListResponse struct {
Meta struct {
Page struct {
HasMore bool `json:"hasMore"`
} `json:"page"`
} `json:"meta"`
Tasklists []Tasklist `json:"tasklists"`
// contains filtered or unexported fields
}
TasklistListResponse contains information by multiple tasklists matching the request filters.
https://apidocs.teamwork.com/docs/teamwork/v3/task-lists/get-projects-api-v3-tasklists https://apidocs.teamwork.com/docs/teamwork/v3/task-lists/get-projects-api-v3-projects-project-id-tasklists
func TasklistList ¶ added in v0.1.0
func TasklistList( ctx context.Context, engine *twapi.Engine, req TasklistListRequest, ) (*TasklistListResponse, error)
TasklistList retrieves multiple tasklists using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTasklistServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
tasklistsResponse, err := projects.TasklistList(ctx, engine, projects.TasklistListRequest{
Filters: projects.TasklistListRequestFilters{
SearchTerm: "Example",
},
})
if err != nil {
fmt.Printf("failed to list tasklists: %s", err)
} else {
for _, tasklist := range tasklistsResponse.Tasklists {
fmt.Printf("retrieved tasklist with identifier %d\n", tasklist.ID)
}
}
}
func startTasklistServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/{id}/tasklists", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","tasklistId":"12345"}`)
})
mux.HandleFunc("PUT /tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasklist":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasklists", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasklists":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved tasklist with identifier 12345 retrieved tasklist with identifier 12346
func (*TasklistListResponse) HandleHTTPResponse ¶ added in v0.1.0
func (t *TasklistListResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TasklistListResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
func (*TasklistListResponse) Iterate ¶ added in v0.1.0
func (t *TasklistListResponse) Iterate() *TasklistListRequest
Iterate returns the request set to the next page, if available. If there are no more pages, a nil request is returned.
func (*TasklistListResponse) SetRequest ¶ added in v0.1.0
func (t *TasklistListResponse) SetRequest(req TasklistListRequest)
SetRequest sets the request used to load this response. This is used for pagination purposes, so the Iterate method can return the next page.
type TasklistUpdateRequest ¶ added in v0.1.0
type TasklistUpdateRequest struct {
// Path contains the path parameters for the request.
Path TasklistUpdateRequestPath `json:"-"`
// Name is the name of the tasklist.
Name *string `json:"name,omitempty"`
// Description is the tasklist description.
Description *string `json:"description,omitempty"`
// MilestoneID is the ID of the milestone associated with the tasklist.
MilestoneID *int64 `json:"milestone-Id,omitempty"`
}
TasklistUpdateRequest represents the request body for updating a tasklist. Besides the identifier, all other fields are optional. When a field is not provided, it will not be modified.
https://apidocs.teamwork.com/docs/teamwork/v1/task-lists/put-tasklists-id-json
func NewTasklistUpdateRequest ¶ added in v0.1.0
func NewTasklistUpdateRequest(tasklistID int64) TasklistUpdateRequest
NewTasklistUpdateRequest creates a new TasklistUpdateRequest with the provided tasklist ID. The ID is required to update a tasklist.
func (TasklistUpdateRequest) HTTPRequest ¶ added in v0.1.0
func (t TasklistUpdateRequest) HTTPRequest(ctx context.Context, server string) (*http.Request, error)
HTTPRequest creates an HTTP request for the TasklistUpdateRequest.
type TasklistUpdateRequestPath ¶ added in v0.1.0
type TasklistUpdateRequestPath struct {
// ID is the unique identifier of the tasklist to be updated.
ID int64
}
TasklistUpdateRequestPath contains the path parameters for updating a tasklist.
type TasklistUpdateResponse ¶ added in v0.1.0
type TasklistUpdateResponse struct{}
TasklistUpdateResponse represents the response body for updating a tasklist.
https://apidocs.teamwork.com/docs/teamwork/v1/task-lists/put-tasklists-id-json
func TasklistUpdate ¶ added in v0.1.0
func TasklistUpdate( ctx context.Context, engine *twapi.Engine, req TasklistUpdateRequest, ) (*TasklistUpdateResponse, error)
TasklistUpdate updates a tasklist using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startTasklistServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.TasklistUpdate(ctx, engine, projects.TasklistUpdateRequest{
Path: projects.TasklistUpdateRequestPath{
ID: 12345,
},
Description: twapi.Ptr("This is an updated description."),
})
if err != nil {
fmt.Printf("failed to update tasklist: %s", err)
} else {
fmt.Println("tasklist updated!")
}
}
func startTasklistServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /projects/{id}/tasklists", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "777" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","tasklistId":"12345"}`)
})
mux.HandleFunc("PUT /tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/tasklists/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasklist":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/tasklists", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"tasklists":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: tasklist updated!
func (*TasklistUpdateResponse) HandleHTTPResponse ¶ added in v0.1.0
func (t *TasklistUpdateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the TasklistUpdateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type User ¶ added in v0.3.0
type User struct {
// ID is the unique identifier of the user.
ID int64 `json:"id"`
// FirstName is the first name of the user.
FirstName string `json:"firstName"`
// LastName is the last name of the user.
LastName string `json:"lastName"`
// Title is the title of the user (e.g. "Senior Developer").
Title *string `json:"title"`
// Email is the email address of the user.
Email string `json:"email"`
// Admin indicates whether the user is an administrator.
Admin bool `json:"isAdmin"`
// Type is the type of user. Possible values are "account", "collaborator" or "contact".
Type string `json:"type"`
// Cost is the hourly cost, to your company, to employ this user.
Cost *twapi.Money `json:"userCost"`
// Rate is the individual's hourly rate. This is what you charge for someone's
// time on a project.
Rate *twapi.Money `json:"userRate"`
// Company is the client/company the user belongs to.
Company twapi.Relationship `json:"company"`
// JobRoles are the job roles assigned to the user.
JobRoles []twapi.Relationship `json:"jobRoles,omitempty"`
// Skills are the skills assigned to the user.
Skills []twapi.Relationship `json:"skills,omitempty"`
// Deleted indicates whether the user has been deleted.
Deleted bool `json:"deleted"`
// CreatedBy is the user who created this user.
CreatedBy *twapi.Relationship `json:"createdBy"`
// CreatedAt is the date and time when the user was created.
CreatedAt time.Time `json:"createdAt"`
// UpdatedBy is the user who last updated this user.
UpdatedBy *twapi.Relationship `json:"updatedBy"`
// UpdatedAt is the date and time when the user was last updated.
UpdatedAt *time.Time `json:"updatedAt"`
}
User represents a user in Teamwork.
type UserCreateRequest ¶ added in v0.3.0
type UserCreateRequest struct {
// FirstName is the first name of the user.
FirstName string `json:"first-name"`
// LastName is the last name of the user.
LastName string `json:"last-name"`
// Title is the title of the user (e.g. "Senior Developer").
Title *string `json:"title,omitempty"`
// Email is the email address of the user.
Email string `json:"email-address"`
// Admin indicates whether the user is an administrator. By default it is
// false.
Admin *bool `json:"administrator,omitempty"`
// Type is the type of user. Possible values are "account", "collaborator" or
// "contact". By default it is "account".
Type *string `json:"user-type,omitempty"`
// Company is the client/company the user belongs to. By default is the same
// from the logged user creating the new user.
CompanyID *int64 `json:"company-id,omitempty"`
}
UserCreateRequest represents the request body for creating a new user.
https://apidocs.teamwork.com/docs/teamwork/v1/people/post-people-json
func NewUserCreateRequest ¶ added in v0.3.0
func NewUserCreateRequest(firstName, lastName, email string) UserCreateRequest
NewUserCreateRequest creates a new UserCreateRequest with the provided name in a specific project.
func (UserCreateRequest) HTTPRequest ¶ added in v0.3.0
HTTPRequest creates an HTTP request for the UserCreateRequest.
type UserCreateResponse ¶ added in v0.3.0
type UserCreateResponse struct {
// ID is the unique identifier of the created user.
ID LegacyNumber `json:"id"`
}
UserCreateResponse represents the response body for creating a new user.
https://apidocs.teamwork.com/docs/teamwork/v1/people/post-people-json
func UserCreate ¶ added in v0.3.0
func UserCreate( ctx context.Context, engine *twapi.Engine, req UserCreateRequest, ) (*UserCreateResponse, error)
UserCreate creates a new user using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startUserServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
user, err := projects.UserCreate(ctx, engine, projects.UserCreateRequest{
FirstName: "John",
LastName: "Doe",
Email: "johndoe@example.com",
})
if err != nil {
fmt.Printf("failed to create user: %s", err)
} else {
fmt.Printf("created user with identifier %d\n", user.ID)
}
}
func startUserServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /people", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","id":"12345"}`)
})
mux.HandleFunc("PUT /people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"person":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/me", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"person":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/people", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"people":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: created user with identifier 12345
func (*UserCreateResponse) HandleHTTPResponse ¶ added in v0.3.0
func (u *UserCreateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the UserCreateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type UserDeleteRequest ¶ added in v0.3.0
type UserDeleteRequest struct {
// Path contains the path parameters for the request.
Path UserDeleteRequestPath
}
UserDeleteRequest represents the request body for deleting a user.
https://apidocs.teamwork.com/docs/teamwork/v1/people/delete-people-id-json
func NewUserDeleteRequest ¶ added in v0.3.0
func NewUserDeleteRequest(userID int64) UserDeleteRequest
NewUserDeleteRequest creates a new UserDeleteRequest with the provided user ID.
func (UserDeleteRequest) HTTPRequest ¶ added in v0.3.0
HTTPRequest creates an HTTP request for the UserDeleteRequest.
type UserDeleteRequestPath ¶ added in v0.3.0
type UserDeleteRequestPath struct {
// ID is the unique identifier of the user to be deleted.
ID int64
}
UserDeleteRequestPath contains the path parameters for deleting a user.
type UserDeleteResponse ¶ added in v0.3.0
type UserDeleteResponse struct{}
UserDeleteResponse represents the response body for deleting a user.
https://apidocs.teamwork.com/docs/teamwork/v1/people/delete-people-id-json
func UserDelete ¶ added in v0.3.0
func UserDelete( ctx context.Context, engine *twapi.Engine, req UserDeleteRequest, ) (*UserDeleteResponse, error)
UserDelete creates a new user using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startUserServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.UserDelete(ctx, engine, projects.NewUserDeleteRequest(12345))
if err != nil {
fmt.Printf("failed to delete user: %s", err)
} else {
fmt.Println("user deleted!")
}
}
func startUserServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /people", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","id":"12345"}`)
})
mux.HandleFunc("PUT /people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"person":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/me", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"person":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/people", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"people":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: user deleted!
func (*UserDeleteResponse) HandleHTTPResponse ¶ added in v0.3.0
func (u *UserDeleteResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the UserDeleteResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type UserGetMeRequest ¶ added in v0.3.0
type UserGetMeRequest struct {
}
UserGetMeRequest represents the request body for loading the logged user.
Not documented yet.
func NewUserGetMeRequest ¶ added in v0.3.0
func NewUserGetMeRequest() UserGetMeRequest
NewUserGetMeRequest creates a new UserGetMeRequest.
func (UserGetMeRequest) HTTPRequest ¶ added in v0.3.0
HTTPRequest creates an HTTP request for the UserGetMeRequest.
type UserGetMeResponse ¶ added in v0.3.0
type UserGetMeResponse struct {
User User `json:"person"`
}
UserGetMeResponse contains all the information related to the logged user.
Not documented yet.
func UserGetMe ¶ added in v0.3.0
func UserGetMe( ctx context.Context, engine *twapi.Engine, req UserGetMeRequest, ) (*UserGetMeResponse, error)
UserGetMe retrieves the logged user using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startUserServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
userResponse, err := projects.UserGetMe(ctx, engine, projects.NewUserGetMeRequest())
if err != nil {
fmt.Printf("failed to retrieve logged user: %s", err)
} else {
fmt.Printf("retrieved logged user with identifier %d\n", userResponse.User.ID)
}
}
func startUserServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /people", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","id":"12345"}`)
})
mux.HandleFunc("PUT /people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"person":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/me", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"person":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/people", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"people":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved logged user with identifier 12345
func (*UserGetMeResponse) HandleHTTPResponse ¶ added in v0.3.0
func (u *UserGetMeResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the UserGetMeResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type UserGetRequest ¶ added in v0.3.0
type UserGetRequest struct {
// Path contains the path parameters for the request.
Path UserGetRequestPath
}
UserGetRequest represents the request body for loading a single user.
https://apidocs.teamwork.com/docs/teamwork/v3/person/get-projects-api-v3-people-person-id-json
func NewUserGetRequest ¶ added in v0.3.0
func NewUserGetRequest(userID int64) UserGetRequest
NewUserGetRequest creates a new UserGetRequest with the provided user ID. The ID is required to load a user.
func (UserGetRequest) HTTPRequest ¶ added in v0.3.0
HTTPRequest creates an HTTP request for the UserGetRequest.
type UserGetRequestPath ¶ added in v0.3.0
type UserGetRequestPath struct {
// ID is the unique identifier of the user to be retrieved.
ID int64 `json:"id"`
}
UserGetRequestPath contains the path parameters for loading a single user.
type UserGetResponse ¶ added in v0.3.0
type UserGetResponse struct {
User User `json:"person"`
}
UserGetResponse contains all the information related to a user.
https://apidocs.teamwork.com/docs/teamwork/v3/person/get-projects-api-v3-people-person-id-json
func UserGet ¶ added in v0.3.0
func UserGet( ctx context.Context, engine *twapi.Engine, req UserGetRequest, ) (*UserGetResponse, error)
UserGet retrieves a single user using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startUserServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
userResponse, err := projects.UserGet(ctx, engine, projects.NewUserGetRequest(12345))
if err != nil {
fmt.Printf("failed to retrieve user: %s", err)
} else {
fmt.Printf("retrieved user with identifier %d\n", userResponse.User.ID)
}
}
func startUserServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /people", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","id":"12345"}`)
})
mux.HandleFunc("PUT /people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"person":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/me", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"person":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/people", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"people":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved user with identifier 12345
func (*UserGetResponse) HandleHTTPResponse ¶ added in v0.3.0
func (u *UserGetResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the UserGetResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
type UserGroups ¶ added in v0.2.0
type UserGroups struct {
UserIDs []int64 `json:"userIds"`
CompanyIDs []int64 `json:"companyIds"`
TeamIDs []int64 `json:"teamIds"`
}
UserGroups represents a collection of users, companies, and teams.
type UserListRequest ¶ added in v0.3.0
type UserListRequest struct {
// Path contains the path parameters for the request.
Path UserListRequestPath
// Filters contains the filters for loading multiple users.
Filters UserListRequestFilters
}
UserListRequest represents the request body for loading multiple users.
https://apidocs.teamwork.com/docs/teamwork/v3/people/get-projects-api-v3-people-json https://apidocs.teamwork.com/docs/teamwork/v3/people/get-projects-api-v3-projects-project-id-people-json
func NewUserListRequest ¶ added in v0.3.0
func NewUserListRequest() UserListRequest
NewUserListRequest creates a new UserListRequest with default values.
func (UserListRequest) HTTPRequest ¶ added in v0.3.0
HTTPRequest creates an HTTP request for the UserListRequest.
type UserListRequestFilters ¶ added in v0.3.0
type UserListRequestFilters struct {
// SearchTerm is an optional search term to filter users by name or e-mail.
SearchTerm string
// Type is an optional filter to load only users of a specific type. Possible
// values are "account", "collaborator" or "contact".
Type string
// Page is the page number to retrieve. Defaults to 1.
Page int64
// PageSize is the number of users to retrieve per page. Defaults to 50.
PageSize int64
}
UserListRequestFilters contains the filters for loading multiple users.
type UserListRequestPath ¶ added in v0.3.0
type UserListRequestPath struct {
// ProjectID is the unique identifier of the project whose members are to be
// retrieved.
ProjectID int64
}
UserListRequestPath contains the path parameters for loading multiple users.
type UserListResponse ¶ added in v0.3.0
type UserListResponse struct {
Meta struct {
Page struct {
HasMore bool `json:"hasMore"`
} `json:"page"`
} `json:"meta"`
Users []User `json:"people"`
// contains filtered or unexported fields
}
UserListResponse contains information by multiple users matching the request filters.
https://apidocs.teamwork.com/docs/teamwork/v3/people/get-projects-api-v3-people-json https://apidocs.teamwork.com/docs/teamwork/v3/people/get-projects-api-v3-projects-project-id-people-json
func UserList ¶ added in v0.3.0
func UserList( ctx context.Context, engine *twapi.Engine, req UserListRequest, ) (*UserListResponse, error)
UserList retrieves multiple users using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startUserServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
usersResponse, err := projects.UserList(ctx, engine, projects.UserListRequest{
Filters: projects.UserListRequestFilters{
SearchTerm: "John",
},
})
if err != nil {
fmt.Printf("failed to list users: %s", err)
} else {
for _, user := range usersResponse.Users {
fmt.Printf("retrieved user with identifier %d\n", user.ID)
}
}
}
func startUserServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /people", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","id":"12345"}`)
})
mux.HandleFunc("PUT /people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"person":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/me", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"person":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/people", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"people":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: retrieved user with identifier 12345 retrieved user with identifier 12346
func (*UserListResponse) HandleHTTPResponse ¶ added in v0.3.0
func (u *UserListResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the UserListResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.
func (*UserListResponse) Iterate ¶ added in v0.3.0
func (u *UserListResponse) Iterate() *UserListRequest
Iterate returns the request set to the next page, if available. If there are no more pages, a nil request is returned.
func (*UserListResponse) SetRequest ¶ added in v0.3.0
func (u *UserListResponse) SetRequest(req UserListRequest)
SetRequest sets the request used to load this response. This is used for pagination purposes, so the Iterate method can return the next page.
type UserUpdateRequest ¶ added in v0.3.0
type UserUpdateRequest struct {
// Path contains the path parameters for the request.
Path UserUpdateRequestPath `json:"-"`
// FirstName is the first name of the user.
FirstName *string `json:"first-name,omitempty"`
// LastName is the last name of the user.
LastName *string `json:"last-name,omitempty"`
// Title is the title of the user (e.g. "Senior Developer").
Title *string `json:"title,omitempty"`
// Email is the email address of the user.
Email *string `json:"email-address,omitempty"`
// Admin indicates whether the user is an administrator. By default it is
// false.
Admin *bool `json:"administrator,omitempty"`
// Type is the type of user. Possible values are "account", "collaborator" or
// "contact". By default it is "account".
Type *string `json:"user-type,omitempty"`
// Company is the client/company the user belongs to. By default is the same
// from the logged user creating the new user.
CompanyID *int64 `json:"company-id,omitempty"`
}
UserUpdateRequest represents the request body for updating a user. Besides the identifier, all other fields are optional. When a field is not provided, it will not be modified.
https://apidocs.teamwork.com/docs/teamwork/v1/people/put-people-id-json
func NewUserUpdateRequest ¶ added in v0.3.0
func NewUserUpdateRequest(userID int64) UserUpdateRequest
NewUserUpdateRequest creates a new UserUpdateRequest with the provided user ID. The ID is required to update a user.
func (UserUpdateRequest) HTTPRequest ¶ added in v0.3.0
HTTPRequest creates an HTTP request for the UserUpdateRequest.
type UserUpdateRequestPath ¶ added in v0.3.0
type UserUpdateRequestPath struct {
// ID is the unique identifier of the user to be updated.
ID int64
}
UserUpdateRequestPath contains the path parameters for updating a user.
type UserUpdateResponse ¶ added in v0.3.0
type UserUpdateResponse struct{}
UserUpdateResponse represents the response body for updating a user.
https://apidocs.teamwork.com/docs/teamwork/v1/people/put-people-id-json
func UserUpdate ¶ added in v0.3.0
func UserUpdate( ctx context.Context, engine *twapi.Engine, req UserUpdateRequest, ) (*UserUpdateResponse, error)
UserUpdate updates a user using the provided request and returns the response.
Example ¶
package main
import (
"context"
"fmt"
"net"
"net/http"
"strings"
twapi "github.com/teamwork/twapi-go-sdk"
"github.com/teamwork/twapi-go-sdk/projects"
"github.com/teamwork/twapi-go-sdk/session"
)
func main() {
address, stop, err := startUserServer() // mock server for demonstration purposes
if err != nil {
fmt.Printf("failed to start server: %s", err)
return
}
defer stop()
ctx := context.Background()
engine := twapi.NewEngine(session.NewBearerToken("your_token", fmt.Sprintf("http://%s", address)))
_, err = projects.UserUpdate(ctx, engine, projects.UserUpdateRequest{
Path: projects.UserUpdateRequestPath{
ID: 12345,
},
Title: twapi.Ptr("Software Engineer"),
})
if err != nil {
fmt.Printf("failed to update user: %s", err)
} else {
fmt.Println("user updated!")
}
}
func startUserServer() (string, func(), error) {
ln, err := net.Listen("tcp", "localhost:0")
if err != nil {
return "", nil, fmt.Errorf("failed to start server: %w", err)
}
mux := http.NewServeMux()
mux.HandleFunc("POST /people", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
w.WriteHeader(http.StatusCreated)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK","id":"12345"}`)
})
mux.HandleFunc("PUT /people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Content-Type") != "application/json" {
http.Error(w, "Unsupported Media Type", http.StatusUnsupportedMediaType)
return
}
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("DELETE /people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"STATUS":"OK"}`)
})
mux.HandleFunc("GET /projects/api/v3/people/{id}", func(w http.ResponseWriter, r *http.Request) {
if r.PathValue("id") != "12345" {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"person":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/me", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"person":{"id":12345}}`)
})
mux.HandleFunc("GET /projects/api/v3/people", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintln(w, `{"people":[{"id":12345},{"id":12346}]}`)
})
server := &http.Server{
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer your_token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
r.URL.Path = strings.TrimSuffix(r.URL.Path, ".json")
mux.ServeHTTP(w, r)
}),
}
stop := make(chan struct{})
go func() {
_ = server.Serve(ln)
}()
go func() {
<-stop
_ = server.Shutdown(context.Background())
}()
return ln.Addr().String(), func() {
close(stop)
}, nil
}
Output: user updated!
func (*UserUpdateResponse) HandleHTTPResponse ¶ added in v0.3.0
func (u *UserUpdateResponse) HandleHTTPResponse(resp *http.Response) error
HandleHTTPResponse handles the HTTP response for the UserUpdateResponse. If some unexpected HTTP status code is returned by the API, a twapi.HTTPError is returned.