more api documentation

This commit is contained in:
Athou
2013-04-17 13:26:14 +02:00
parent ef3508f393
commit 4c927630a7
8 changed files with 87 additions and 21 deletions

View File

@@ -4,11 +4,18 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import com.wordnik.swagger.annotations.ApiClass;
import com.wordnik.swagger.annotations.ApiProperty;
@XmlRootElement @XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD) @XmlAccessorType(XmlAccessType.FIELD)
@ApiClass("Profile modification request")
public class ProfileModificationRequest { public class ProfileModificationRequest {
@ApiProperty(value = "changes email of the user, if specified")
private String email; private String email;
@ApiProperty(value = "changes password of the user, if specified")
private String password; private String password;
public String getEmail() { public String getEmail() {

View File

@@ -6,16 +6,31 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import com.wordnik.swagger.annotations.ApiClass;
import com.wordnik.swagger.annotations.ApiProperty;
@SuppressWarnings("serial") @SuppressWarnings("serial")
@XmlRootElement @XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD) @XmlAccessorType(XmlAccessType.FIELD)
@ApiClass("User information")
public class Subscription implements Serializable { public class Subscription implements Serializable {
@ApiProperty(value = "subscription id", required = true)
private Long id; private Long id;
@ApiProperty(value = "subscription name", required = true)
private String name; private String name;
@ApiProperty(value = "error message while fetching the feed", required = true)
private String message; private String message;
@ApiProperty(value = "error count", required = true)
private int errorCount; private int errorCount;
@ApiProperty(value = "this subscription's feed url", required = true)
private String feedUrl; private String feedUrl;
@ApiProperty(value = "unread count", required = true)
private long unread; private long unread;
public Long getId() { public Long getId() {

View File

@@ -6,16 +6,31 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import com.wordnik.swagger.annotations.ApiClass;
import com.wordnik.swagger.annotations.ApiProperty;
@SuppressWarnings("serial") @SuppressWarnings("serial")
@XmlRootElement @XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD) @XmlAccessorType(XmlAccessType.FIELD)
@ApiClass("User information")
public class UserModel implements Serializable { public class UserModel implements Serializable {
@ApiProperty(value = "user id", required = true)
private Long id; private Long id;
@ApiProperty(value = "user name", required = true)
private String name; private String name;
@ApiProperty("user email, if any")
private String email; private String email;
@ApiProperty(value = "user password, never returned by the api")
private String password; private String password;
@ApiProperty(value = "account status")
private boolean enabled; private boolean enabled;
@ApiProperty(value = "user is admin")
private boolean admin; private boolean admin;
public Long getId() { public Long getId() {

View File

@@ -9,7 +9,7 @@ import com.commafeed.backend.model.UserRole.Role;
import com.commafeed.frontend.SecurityCheck; import com.commafeed.frontend.SecurityCheck;
@SecurityCheck(Role.ADMIN) @SecurityCheck(Role.ADMIN)
@Path("admin/metrics") @Path("/admin/metrics")
public class AdminMetricsREST extends AbstractREST { public class AdminMetricsREST extends AbstractREST {
@Inject @Inject

View File

@@ -9,23 +9,31 @@ import com.commafeed.backend.model.ApplicationSettings;
import com.commafeed.backend.model.UserRole.Role; import com.commafeed.backend.model.UserRole.Role;
import com.commafeed.backend.services.ApplicationSettingsService; import com.commafeed.backend.services.ApplicationSettingsService;
import com.commafeed.frontend.SecurityCheck; import com.commafeed.frontend.SecurityCheck;
import com.google.common.base.Preconditions;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
@SecurityCheck(Role.ADMIN) @SecurityCheck(Role.ADMIN)
@Path("admin/settings") @Path("/admin/settings")
@Api(value = "/admin/settings", description = "Operations about application settings administration")
public class AdminSettingsREST { public class AdminSettingsREST {
@Inject @Inject
ApplicationSettingsService applicationSettingsService; ApplicationSettingsService applicationSettingsService;
@Path("get") @Path("/get")
@GET @GET
@ApiOperation(value = "Retrieve application settings", notes = "Retrieve application settings", responseClass = "com.commafeed.backend.model.ApplicationSettings")
public ApplicationSettings get() { public ApplicationSettings get() {
return applicationSettingsService.get(); return applicationSettingsService.get();
} }
@Path("save") @Path("/save")
@POST @POST
public void save(ApplicationSettings settings) { @ApiOperation(value = "Save application settings", notes = "Save application settings")
public void save(@ApiParam(required = true) ApplicationSettings settings) {
Preconditions.checkNotNull(settings);
applicationSettingsService.save(settings); applicationSettingsService.save(settings);
} }
} }

View File

@@ -23,14 +23,19 @@ import com.commafeed.frontend.model.UserModel;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
@SecurityCheck(Role.ADMIN) @SecurityCheck(Role.ADMIN)
@Path("admin/users") @Path("/admin/users")
@Api(value = "/admin/users", description = "Operations about application users administration")
public class AdminUsersREST extends AbstractREST { public class AdminUsersREST extends AbstractREST {
@Path("save") @Path("/save")
@POST @POST
public Response save(UserModel userModel) { @ApiOperation(value = "Manually save or update a user", notes = "Manually save or update a user. If the id is not specified, a new user will be created")
public Response save(@ApiParam(required = true) UserModel userModel) {
Preconditions.checkNotNull(userModel); Preconditions.checkNotNull(userModel);
Preconditions.checkNotNull(userModel.getName()); Preconditions.checkNotNull(userModel.getName());
@@ -86,9 +91,12 @@ public class AdminUsersREST extends AbstractREST {
} }
@Path("get") @Path("/get")
@GET @GET
public UserModel getUser(@QueryParam("id") Long id) { @ApiOperation(value = "Get user information", notes = "Get user information", responseClass = "com.commafeed.frontend.model.UserModel")
public UserModel getUser(
@ApiParam(value = "user id", required = true) @QueryParam("id") Long id) {
Preconditions.checkNotNull(id);
User user = userDAO.findById(id); User user = userDAO.findById(id);
UserModel userModel = new UserModel(); UserModel userModel = new UserModel();
userModel.setId(user.getId()); userModel.setId(user.getId());
@@ -102,8 +110,9 @@ public class AdminUsersREST extends AbstractREST {
return userModel; return userModel;
} }
@Path("getAll") @Path("/getAll")
@GET @GET
@ApiOperation(value = "Get all users", notes = "Get all users", responseClass = "List[com.commafeed.frontend.model.UserModel]")
public Collection<UserModel> getUsers() { public Collection<UserModel> getUsers() {
Map<Long, UserModel> users = Maps.newHashMap(); Map<Long, UserModel> users = Maps.newHashMap();
for (UserRole role : userRoleDAO.findAll()) { for (UserRole role : userRoleDAO.findAll()) {
@@ -124,9 +133,13 @@ public class AdminUsersREST extends AbstractREST {
return users.values(); return users.values();
} }
@Path("delete") @Path("/delete")
@GET @GET
public Response delete(@QueryParam("id") Long id) { @ApiOperation(value = "Delete a user", notes = "Delete a user, and all his subscriptions")
public Response delete(
@ApiParam(value = "user id", required = true) @QueryParam("id") Long id) {
Preconditions.checkNotNull(id);
User user = userDAO.findById(id); User user = userDAO.findById(id);
if (user == null) { if (user == null) {
return Response.status(Status.NOT_FOUND).build(); return Response.status(Status.NOT_FOUND).build();
@@ -135,8 +148,8 @@ public class AdminUsersREST extends AbstractREST {
return Response.status(Status.FORBIDDEN) return Response.status(Status.FORBIDDEN)
.entity("You cannot delete the admin user.").build(); .entity("You cannot delete the admin user.").build();
} }
feedEntryStatusDAO.delete(feedEntryStatusDAO.findAll(user, feedEntryStatusDAO.delete(feedEntryStatusDAO.findAll(user, false,
false, ReadingOrder.desc, false)); ReadingOrder.desc, false));
feedSubscriptionDAO.delete(feedSubscriptionDAO.findAll(user)); feedSubscriptionDAO.delete(feedSubscriptionDAO.findAll(user));
feedCategoryDAO.delete(feedCategoryDAO.findAll(user)); feedCategoryDAO.delete(feedCategoryDAO.findAll(user));
userSettingsDAO.delete(userSettingsDAO.findByUser(user)); userSettingsDAO.delete(userSettingsDAO.findByUser(user));

View File

@@ -12,12 +12,17 @@ import com.commafeed.backend.model.UserRole;
import com.commafeed.backend.model.UserRole.Role; import com.commafeed.backend.model.UserRole.Role;
import com.commafeed.frontend.model.ProfileModificationRequest; import com.commafeed.frontend.model.ProfileModificationRequest;
import com.commafeed.frontend.model.UserModel; import com.commafeed.frontend.model.UserModel;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
@Path("session") @Path("/session")
@Api(value = "/session", description = "Operations about user profile")
public class SessionREST extends AbstractREST { public class SessionREST extends AbstractREST {
@Path("get") @Path("/get")
@GET @GET
@ApiOperation(value = "Retrieve user's profile", responseClass = "com.commafeed.frontend.model.UserModel")
public UserModel get() { public UserModel get() {
User user = getUser(); User user = getUser();
UserModel userModel = new UserModel(); UserModel userModel = new UserModel();
@@ -33,9 +38,11 @@ public class SessionREST extends AbstractREST {
return userModel; return userModel;
} }
@Path("save") @Path("/save")
@POST @POST
public Response save(ProfileModificationRequest request) { @ApiOperation(value = "Save user's profile")
public Response save(
@ApiParam(required = true) ProfileModificationRequest request) {
User user = getUser(); User user = getUser();
user.setEmail(request.getEmail()); user.setEmail(request.getEmail());
if (StringUtils.isNotBlank(request.getPassword())) { if (StringUtils.isNotBlank(request.getPassword())) {

View File

@@ -41,7 +41,8 @@ public class SubscriptionsREST extends AbstractREST {
@GET @GET
@Path("/feed/fetch") @Path("/feed/fetch")
@ApiOperation(value = "Fetch a feed", notes = "Fetch a feed by its url", responseClass = "com.commafeed.backend.model.Feed") @ApiOperation(value = "Fetch a feed", notes = "Fetch a feed by its url", responseClass = "com.commafeed.backend.model.Feed")
public Feed fetchFeed(@QueryParam("url") String url) { public Feed fetchFeed(
@ApiParam(value = "the feed's url", required = true) @QueryParam("url") String url) {
Preconditions.checkNotNull(url); Preconditions.checkNotNull(url);
url = StringUtils.trimToEmpty(url); url = StringUtils.trimToEmpty(url);
url = prependHttp(url); url = prependHttp(url);