diff --git a/lib/wunderlist/api.rb b/lib/wunderlist/api.rb index fad31c1..420cf64 100644 --- a/lib/wunderlist/api.rb +++ b/lib/wunderlist/api.rb @@ -1,6 +1,8 @@ +require "wunderlist/folder" require "wunderlist/list" require "wunderlist/task" require "wunderlist/user" +require "wunderlist/membership" require "wunderlist/webhook" require "wunderlist/version" require 'faraday' @@ -28,20 +30,102 @@ def conn end end + def new_task(list_name, attrs = {}) + attrs.stringify_keys + list_name = [list_name] + list_id = get_list_ids(list_name)[0] + attrs['list_id'] = list_id + task = Wunderlist::Task.new(attrs) + task.api = self + + task + + end + + def new_folder(folder_name, list_names = []) + list_ids = get_list_ids(list_names) + attrs = {'title' => folder_name, 'list_ids' => list_ids} + folder = Wunderlist::Folder.new(attrs) + folder.api = self + + folder + end + def new_list(list_name) list = Wunderlist::List.new('title' => list_name) list.api = self list end + def new_membership(membership_attrs = {}) + membership = Wunderlist::Membership.new(membership_attrs) + membership.api = self + membership + end + + def members(list_id, status=["accepted"]) + res_memberships = self.request :get, "api/v1/memberships" + user_ids = [] + res_memberships.each do |f| + if status.include? f["state"] + user_ids << f["user_id"] + end + end + p user_ids + users(user_ids) + end + + def accept_membership(membership_id, membership_attrs = {}) + self.request :patch, "/api/v1/memberships/#{membership_id}", membership_attrs + end + + def folder(folder_name) + folder_name = [folder_name] + folder_ids = get_folder_ids(folder_name) + get_folders_by_ids(folder_ids)[0] + + end + def list(list_name) list_name = [list_name] - list_id = get_list_ids(list_name)[0] - res_list = self.request :get, "api/v1/lists/#{list_id}" - list = Wunderlist::List.new(res_list) - list.api = self + list_ids = get_list_ids(list_name) + get_lists_by_id(list_ids)[0] + end - list + def get_lists_by_ids(list_ids) + lists = [] + list_ids.each do |list_id| + res_list = self.request :get, "api/v1/lists/#{list_id}" + list = Wunderlist::List.new(res_list) + list.api = self + + lists << list + end + lists + end + + def get_folders_by_ids(folder_ids) + folders = [] + folder_ids.each do |folder_id| + res_folder = self.request :get, "api/v1/folders/#{folder_id}" + folder = Wunderlist::Folder.new(res_folder) + folder.api = self + + folders << folder + end + folders + end + + def folders + res_folders = self.request :get, 'api/v1/folders' + folders = [] + res_folders.each do |f| + folder = Wunderlist::Folder.new(f) + folder.api = self + folders << folder + end + + folders end @@ -87,6 +171,29 @@ def tasks(list_names = [], completed = false) end + def all_users + res_users = self.request :get, "api/v1/users" + users = [] + res_users.each do |u| + user = Wunderlist::User.new(u) + user.api = self + users << user + end + users + end + + def users(user_ids) + res_users = self.request :get, "api/v1/users" + users = [] + res_users.each do |u| + if user_ids.include? u["id"] + user = Wunderlist::User.new(u) + user.api = self + users << user + end + end + users + end def user() res_user = self.request :get, 'api/v1/user' @@ -108,6 +215,15 @@ def new_task(list_name, attrs = {}) end + def new_sub_task(attrs = {}) + attrs.stringify_keys + sub_task = Wunderlist::Subtask.new(attrs) + sub_task.api = self + + sub_task + + end + def new_webhook(list_name, attrs = {}) attrs.stringify_keys list_name = [list_name] @@ -125,6 +241,7 @@ def request(method, url, options = {}) when :get then self.get(url, options) when :post then self.post(url, options) when :put then self.put(url, options) + when :patch then self.patch(url, options) when :delete then self.delete(url, options) end end @@ -180,6 +297,22 @@ def put(url, options = {}) JSON.parse(response.body) end + def patch(url, options = {}) + + response = conn.patch do |req| + req.url url + req.body = options.to_json + req.headers = { + 'X-Access-Token' => self.access_token, + 'X-Client-ID' => self.client_id, + 'Content-Type' => 'application/json', + 'Content-Encoding' => 'UTF-8' + } + end + + JSON.parse(response.body) + end + def delete(url, options = {}) response = conn.delete do |req| @@ -206,5 +339,13 @@ def get_list_ids(list_names = []) lists.map{|list| list.id} end + def get_folder_ids(folder_names = []) + folders = self.folders + if !folder_names.empty? + folders = folders.select{|elm| folder_names.include?(elm.title)} + end + folders.map{|folder| folder.id} + end + end end diff --git a/lib/wunderlist/folder.rb b/lib/wunderlist/folder.rb new file mode 100644 index 0000000..7a88cf2 --- /dev/null +++ b/lib/wunderlist/folder.rb @@ -0,0 +1,39 @@ +require 'wunderlist/helper' + +module Wunderlist + class Folder + + include Wunderlist::Helper + + attr_accessor :id, :title, :api, :created_at, :revision, :list_ids + + def initialize(attrs = {}) + @api = attrs['api'] + @id = attrs['id'] + @title = attrs['title'] + @created_at = attrs['created_at'] + @revision = attrs['revision'] + @list_ids = attrs['list_ids'] + end + + def lists + self.api.get_lists_by_ids(self.list_ids) + end + + def webhooks + self.api.webhooks(self.title) + end + + private + + def set_attrs(attrs = {}) + self.api = attrs['api'] + self.id = attrs['id'] + self.title= attrs['title'] + self.created_at = attrs['created_at'] + self.revision = attrs['revision'] + self.list_ids = attrs['list_ids'] + end + + end +end diff --git a/lib/wunderlist/list.rb b/lib/wunderlist/list.rb index 05a85c9..8e2af53 100644 --- a/lib/wunderlist/list.rb +++ b/lib/wunderlist/list.rb @@ -23,15 +23,23 @@ def tasks(completed: false) self.api.tasks([self.title], completed) end + def members(status=["accepted"]) + self.api.members(self.id, status) + end + + def new_member(attrs) + attrs["list_id"] = self.id + self.api.new_membership(attrs) + end + def webhooks self.api.webhooks(self.title) end private def set_attrs(attrs = {}) - self.api = attrs['api'] self.id = attrs['id'] - self.title= attrs['content'] + self.title= attrs['title'] self.created_at = attrs['created_at'] self.revision = attrs['revision'] end diff --git a/lib/wunderlist/membership.rb b/lib/wunderlist/membership.rb new file mode 100644 index 0000000..2819012 --- /dev/null +++ b/lib/wunderlist/membership.rb @@ -0,0 +1,43 @@ +require 'wunderlist/helper' + +module Wunderlist + class Membership + + include Wunderlist::Helper + + attr_accessor :id, :list_id, :user_id, :state, :muted, :api, :revision, :email + + def initialize(attrs = {}) + @api = attrs['api'] + @id = attrs['id'] + @list_id = attrs['list_id'] + @user_id = attrs['user_id'] + @state = attrs['state'] + @muted = attrs['muted'] + @revision = attrs['revision'] + @email = attrs['email'] + end + + def webhooks + self.api.webhooks(self.title) + end + + def accept + self.state = "accepted" + accept_membership_attrs = {"state" => self.state, "revision" => self.revision} + self.api.accept_membership(self.id, accept_membership_attrs) + end + + private + + def set_attrs(attrs = {}) + self.id = attrs['id'] + self.list_id = attrs['list_id'] + self.user_id = attrs['user_id'] + self.state = attrs['state'] + self.muted = attrs['muted'] + self.revision = attrs['revision'] + end + + end +end