/****************************************************************************** * Copyright (c) 2011 GitHub Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Kevin Sawicki (GitHub Inc.) - initial API and implementation *****************************************************************************/ package org.eclipse.egit.github.core.service; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_EMAILS; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_FOLLOWERS; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_FOLLOWING; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_KEYS; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_USER; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_USERS; import static org.eclipse.egit.github.core.client.PagedRequest.PAGE_FIRST; import static org.eclipse.egit.github.core.client.PagedRequest.PAGE_SIZE; import com.google.gson.reflect.TypeToken; import java.io.IOException; import java.util.List; import org.eclipse.egit.github.core.Key; import org.eclipse.egit.github.core.User; import org.eclipse.egit.github.core.client.GitHubClient; import org.eclipse.egit.github.core.client.GitHubRequest; import org.eclipse.egit.github.core.client.PageIterator; import org.eclipse.egit.github.core.client.PagedRequest; /** * User service class. * * @see <a href="http://developer.github.com/v3/users">GitHub users API * documentation</a> * @see <a href="http://developer.github.com/v3/users/followers">GitHub * followers API documentation</a> * @see <a href="http://developer.github.com/v3/users/emails">GitHub user email * API documentation</a> * @see <a href="http://developer.github.com/v3/users/keys">GitHub user keys API * documentation</a> */ public class UserService extends GitHubService { /** * Create user service */ public UserService() { super(); } /** * Create user service * * @param client */ public UserService(GitHubClient client) { super(client); } /** * Get user with given login name * * @param login * @return user * @throws IOException */ public User getUser(String login) throws IOException { if (login == null) throw new IllegalArgumentException("Login name cannot be null"); //$NON-NLS-1$ if (login.length() == 0) throw new IllegalArgumentException("Login name cannot be empty"); //$NON-NLS-1$ GitHubRequest request = createRequest(); StringBuilder uri = new StringBuilder(SEGMENT_USERS); uri.append('/').append(login); request.setUri(uri); request.setType(User.class); return (User) client.get(request).getBody(); } /** * Get currently authenticated user * * @return user * @throws IOException */ public User getUser() throws IOException { GitHubRequest request = createRequest(); request.setUri(SEGMENT_USER); request.setType(User.class); return (User) client.get(request).getBody(); } /** * Edit given user * * @param user * @return edited user * @throws IOException */ public User editUser(User user) throws IOException { if (user == null) throw new IllegalArgumentException("User cannot be null"); //$NON-NLS-1$ return client.post(SEGMENT_USER, user, User.class); } /** * Create follower request * * @param start * @param size * @param user * @return request */ protected PagedRequest<User> createFollowersRequest(int start, int size, String user) { PagedRequest<User> request = createPagedRequest(start, size); if (user == null) request.setUri(SEGMENT_USER + SEGMENT_FOLLOWERS); else { StringBuilder uri = new StringBuilder(SEGMENT_USERS); uri.append('/').append(user); uri.append(SEGMENT_FOLLOWERS); request.setUri(uri); } request.setType(new TypeToken<List<User>>() { }.getType()); return request; } /** * Create following request * * @param start * @param size * @param user * @return request */ protected PagedRequest<User> createFollowingRequest(int start, int size, String user) { PagedRequest<User> request = createPagedRequest(start, size); if (user == null) request.setUri(SEGMENT_USER + SEGMENT_FOLLOWING); else { StringBuilder uri = new StringBuilder(SEGMENT_USERS); uri.append('/').append(user); uri.append(SEGMENT_FOLLOWING); request.setUri(uri); } request.setType(new TypeToken<List<User>>() { }.getType()); return request; } /** * Get all followers of the currently authenticated user * * @return list of followers * @throws IOException */ public List<User> getFollowers() throws IOException { return getAll(pageFollowers()); } /** * Page followers of the currently authenticated user * * @return page iterator */ public PageIterator<User> pageFollowers() { return pageFollowers(PAGE_SIZE); } /** * Page followers of the currently authenticated user * * @param size * @return page iterator */ public PageIterator<User> pageFollowers(final int size) { return pageFollowers(PAGE_FIRST, size); } /** * Page followers of the currently authenticated user * * @param start * @param size * @return page iterator */ public PageIterator<User> pageFollowers(final int start, final int size) { PagedRequest<User> request = createFollowersRequest(start, size, null); return createPageIterator(request); } /** * Get all followers of the given user * * @param user * @return list of followers * @throws IOException */ public List<User> getFollowers(final String user) throws IOException { return getAll(pageFollowers(user)); } /** * Page followers of the given user * * @param user * @return page iterator */ public PageIterator<User> pageFollowers(final String user) { return pageFollowers(user, PAGE_SIZE); } /** * Page followers of the given user * * @param size * @param user * @return page iterator */ public PageIterator<User> pageFollowers(final String user, final int size) { return pageFollowers(user, PAGE_FIRST, size); } /** * Page followers of the given user * * @param start * @param size * @param user * @return page iterator */ public PageIterator<User> pageFollowers(final String user, final int start, final int size) { if (user == null) throw new IllegalArgumentException("User cannot be null"); //$NON-NLS-1$ if (user.length() == 0) throw new IllegalArgumentException("User cannot be empty"); //$NON-NLS-1$ PagedRequest<User> request = createFollowersRequest(start, size, user); return createPageIterator(request); } /** * Get all users being followed by the currently authenticated user * * @return list of users being followed * @throws IOException */ public List<User> getFollowing() throws IOException { return getAll(pageFollowing()); } /** * Page users being followed by the currently authenticated user * * @return page iterator */ public PageIterator<User> pageFollowing() { return pageFollowing(PAGE_SIZE); } /** * Page users being followed by the currently authenticated user * * @param size * @return page iterator */ public PageIterator<User> pageFollowing(final int size) { return pageFollowing(PAGE_FIRST, size); } /** * Page users being followed by the currently authenticated user * * @param start * @param size * @return page iterator */ public PageIterator<User> pageFollowing(final int start, final int size) { PagedRequest<User> request = createFollowingRequest(start, size, null); return createPageIterator(request); } /** * Get all users being followed by the given user * * @param user * @return list of users being followed * @throws IOException */ public List<User> getFollowing(final String user) throws IOException { return getAll(pageFollowing(user)); } /** * Page users being followed by the given user * * @param user * @return page iterator */ public PageIterator<User> pageFollowing(final String user) { return pageFollowing(user, PAGE_SIZE); } /** * Page users being followed by the given user * * @param user * @param size * @return page iterator */ public PageIterator<User> pageFollowing(final String user, final int size) { return pageFollowing(user, PAGE_FIRST, size); } /** * Page users being followed by the given user * * @param user * @param start * @param size * @return page iterator */ public PageIterator<User> pageFollowing(final String user, final int start, final int size) { if (user == null) throw new IllegalArgumentException("User cannot be null"); //$NON-NLS-1$ if (user.length() == 0) throw new IllegalArgumentException("User cannot be empty"); //$NON-NLS-1$ PagedRequest<User> request = createFollowingRequest(start, size, user); return createPageIterator(request); } /** * Check if the currently authenticated user is following the given user * * @param user * @return true if following, false if not following * @throws IOException */ public boolean isFollowing(final String user) throws IOException { if (user == null) throw new IllegalArgumentException("User cannot be null"); //$NON-NLS-1$ if (user.length() == 0) throw new IllegalArgumentException("User cannot be empty"); //$NON-NLS-1$ StringBuilder uri = new StringBuilder(SEGMENT_USER + SEGMENT_FOLLOWING); uri.append('/').append(user); return check(uri.toString()); } /** * Follow the given user * * @param user * @throws IOException */ public void follow(final String user) throws IOException { if (user == null) throw new IllegalArgumentException("User cannot be null"); //$NON-NLS-1$ if (user.length() == 0) throw new IllegalArgumentException("User cannot be empty"); //$NON-NLS-1$ StringBuilder uri = new StringBuilder(SEGMENT_USER + SEGMENT_FOLLOWING); uri.append('/').append(user); client.put(uri.toString()); } /** * Unfollow the given user * * @param user * @throws IOException */ public void unfollow(final String user) throws IOException { if (user == null) throw new IllegalArgumentException("User cannot be null"); //$NON-NLS-1$ if (user.length() == 0) throw new IllegalArgumentException("User cannot be empty"); //$NON-NLS-1$ StringBuilder uri = new StringBuilder(SEGMENT_USER + SEGMENT_FOLLOWING); uri.append('/').append(user); client.delete(uri.toString()); } /** * Get all e-mail addresses for the currently authenticated user * * @return list of e-mail address * @throws IOException */ public List<String> getEmails() throws IOException { PagedRequest<String> request = createPagedRequest(); request.setUri(SEGMENT_USER + SEGMENT_EMAILS); request.setType(new TypeToken<List<String>>() { }.getType()); return getAll(request); } /** * Add one or more e-mail addresses to the currently authenticated user's * account * * @param emails * @throws IOException */ public void addEmail(String... emails) throws IOException { if (emails == null) throw new IllegalArgumentException("Emails cannot be null"); //$NON-NLS-1$ if (emails.length == 0) throw new IllegalArgumentException("Emails cannot be empty"); //$NON-NLS-1$ client.post(SEGMENT_USER + SEGMENT_EMAILS, emails, null); } /** * Remove one or more e-mail addresses from the currently authenticated * user's account * * @param emails * @throws IOException */ public void removeEmail(String... emails) throws IOException { if (emails == null) throw new IllegalArgumentException("Emails cannot be null"); //$NON-NLS-1$ if (emails.length == 0) throw new IllegalArgumentException("Emails cannot be empty"); //$NON-NLS-1$ client.delete(SEGMENT_USER + SEGMENT_EMAILS, emails); } /** * Get all public keys for currently authenticated user * * @return non-null list of public keys * @throws IOException */ public List<Key> getKeys() throws IOException { PagedRequest<Key> request = createPagedRequest(); request.setUri(SEGMENT_USER + SEGMENT_KEYS); request.setType(new TypeToken<List<Key>>() { }.getType()); return getAll(request); } /** * Get key with given id * * @param id * @return key * @throws IOException */ public Key getKey(int id) throws IOException { GitHubRequest request = createRequest(); StringBuilder uri = new StringBuilder(SEGMENT_USER + SEGMENT_KEYS); uri.append('/').append(id); request.setUri(uri); request.setType(Key.class); return (Key) client.get(request).getBody(); } /** * Create key for currently authenticated user * * @param key * @return created key * @throws IOException */ public Key createKey(Key key) throws IOException { return client.post(SEGMENT_USER + SEGMENT_KEYS, key, Key.class); } /** * Edit key for currently authenticated user * * @param key * @return edited key * @throws IOException */ public Key editKey(Key key) throws IOException { if (key == null) throw new IllegalArgumentException("Key cannot be null"); //$NON-NLS-1$ StringBuilder uri = new StringBuilder(SEGMENT_USER + SEGMENT_KEYS); uri.append('/').append(key.getId()); return client.post(uri.toString(), key, Key.class); } /** * Delete key with given id * * @param id * @throws IOException */ public void deleteKey(int id) throws IOException { StringBuilder uri = new StringBuilder(SEGMENT_USER + SEGMENT_KEYS); uri.append('/').append(id); client.delete(uri.toString()); } }