lib/asana/resources/project.rb in asana-0.0.6 vs lib/asana/resources/project.rb in asana-0.1.1

- old
+ new

@@ -1,28 +1,154 @@ +### WARNING: This file is auto-generated by the asana-api-meta repo. Do not +### edit it manually. + module Asana - class Project < Asana::Resource + module Resources + # A _project_ represents a prioritized list of tasks in Asana. It exists in a + # single workspace or organization and is accessible to a subset of users in + # that workspace or organization, depending on its permissions. + # + # Projects in organizations are shared with a single team. You cannot currently + # change the team of a project via the API. Non-organization workspaces do not + # have teams and so you should not specify the team of project in a + # regular workspace. + class Project < Resource - alias :create :method_not_allowed - alias :destroy :method_not_allowed + include EventSubscription - def self.all_by_task(*args) - parent_resources :task - all(*args) - end - def self.all_by_workspace(*args) - parent_resources :workspace - all(*args) - end + attr_reader :id - def tasks - Task.all_by_project(:params => { :project_id => self.id }) - end + class << self + # Returns the plural name of the resource. + def plural_name + 'projects' + end - def modify(modified_fields) - resource = Resource.new(modified_fields) - response = Project.put(self.id, nil, resource.to_json) - Project.new(connection.format.decode(response.body)) - end + # Creates a new project in a workspace or team. + # + # Every project is required to be created in a specific workspace or + # organization, and this cannot be changed once set. Note that you can use + # the `workspace` parameter regardless of whether or not it is an + # organization. + # + # If the workspace for your project _is_ an organization, you must also + # supply a `team` to share the project with. + # + # Returns the full record of the newly created project. + # + # workspace - [Id] The workspace or organization to create the project in. + # team - [Id] If creating in an organization, the specific team to create the + # project in. + # + # options - [Hash] the request I/O options. + # data - [Hash] the attributes to post. + def create(client, workspace: required("workspace"), team: nil, options: {}, **data) + with_params = data.merge(workspace: workspace, team: team).reject { |_,v| v.nil? || Array(v).empty? } + self.new(parse(client.post("/projects", body: with_params, options: options)).first, client: client) + end + # If the workspace for your project _is_ an organization, you must also + # supply a `team` to share the project with. + # + # Returns the full record of the newly created project. + # + # workspace - [Id] The workspace or organization to create the project in. + # options - [Hash] the request I/O options. + # data - [Hash] the attributes to post. + def create_in_workspace(client, workspace: required("workspace"), options: {}, **data) + + self.new(parse(client.post("/workspaces/#{workspace}/projects", body: data, options: options)).first, client: client) + end + + # Creates a project shared with the given team. + # + # Returns the full record of the newly created project. + # + # team - [Id] The team to create the project in. + # options - [Hash] the request I/O options. + # data - [Hash] the attributes to post. + def create_in_team(client, team: required("team"), options: {}, **data) + + self.new(parse(client.post("/teams/#{team}/projects", body: data, options: options)).first, client: client) + end + + # Returns the complete project record for a single project. + # + # id - [Id] The project to get. + # options - [Hash] the request I/O options. + def find_by_id(client, id, options: {}) + + self.new(parse(client.get("/projects/#{id}", options: options)).first, client: client) + end + + # Returns the compact project records for some filtered set of projects. + # Use one or more of the parameters provided to filter the projects returned. + # + # workspace - [Id] The workspace or organization to filter projects on. + # team - [Id] The team to filter projects on. + # archived - [Boolean] Only return projects whose `archived` field takes on the value of + # this parameter. + # + # per_page - [Integer] the number of records to fetch per page. + # options - [Hash] the request I/O options. + def find_all(client, workspace: nil, team: nil, archived: nil, per_page: 20, options: {}) + params = { workspace: workspace, team: team, archived: archived, limit: per_page }.reject { |_,v| v.nil? || Array(v).empty? } + Collection.new(parse(client.get("/projects", params: params, options: options)), type: self, client: client) + end + + # Returns the compact project records for all projects in the workspace. + # + # workspace - [Id] The workspace or organization to find projects in. + # archived - [Boolean] Only return projects whose `archived` field takes on the value of + # this parameter. + # + # per_page - [Integer] the number of records to fetch per page. + # options - [Hash] the request I/O options. + def find_by_workspace(client, workspace: required("workspace"), archived: nil, per_page: 20, options: {}) + params = { archived: archived, limit: per_page }.reject { |_,v| v.nil? || Array(v).empty? } + Collection.new(parse(client.get("/workspaces/#{workspace}/projects", params: params, options: options)), type: self, client: client) + end + + # Returns the compact project records for all projects in the team. + # + # team - [Id] The team to find projects in. + # archived - [Boolean] Only return projects whose `archived` field takes on the value of + # this parameter. + # + # per_page - [Integer] the number of records to fetch per page. + # options - [Hash] the request I/O options. + def find_by_team(client, team: required("team"), archived: nil, per_page: 20, options: {}) + params = { archived: archived, limit: per_page }.reject { |_,v| v.nil? || Array(v).empty? } + Collection.new(parse(client.get("/teams/#{team}/projects", params: params, options: options)), type: self, client: client) + end + end + + # A specific, existing project can be updated by making a PUT request on the + # URL for that project. Only the fields provided in the `data` block will be + # updated; any unspecified fields will remain unchanged. + # + # When using this method, it is best to specify only those fields you wish + # to change, or else you may overwrite changes made by another user since + # you last retrieved the task. + # + # Returns the complete updated project record. + # + # options - [Hash] the request I/O options. + # data - [Hash] the attributes to post. + def update(options: {}, **data) + + refresh_with(parse(client.put("/projects/#{id}", body: data, options: options)).first) + end + + # A specific, existing project can be deleted by making a DELETE request + # on the URL for that project. + # + # Returns an empty data record. + def delete() + + client.delete("/projects/#{id}") && true + end + + end end end