Skip to content

Commit 78a68fa

Browse files
Kacper JawoszekKacper Jawoszek
Kacper Jawoszek
authored and
Kacper Jawoszek
committed
PostUser, DeleteUser and PutParticipant endpoints
1 parent 008eec2 commit 78a68fa

File tree

11 files changed

+468
-115
lines changed

11 files changed

+468
-115
lines changed

src/main/java/com/cdancy/bitbucket/rest/domain/pullrequest/User.java

+49-22
Original file line numberDiff line numberDiff line change
@@ -17,48 +17,75 @@
1717

1818
package com.cdancy.bitbucket.rest.domain.pullrequest;
1919

20-
import org.jclouds.json.SerializedNames;
21-
20+
import com.cdancy.bitbucket.rest.BitbucketUtils;
21+
import com.cdancy.bitbucket.rest.domain.common.Error;
22+
import com.cdancy.bitbucket.rest.domain.common.ErrorsHolder;
2223
import com.google.auto.value.AutoValue;
2324
import org.jclouds.javax.annotation.Nullable;
25+
import org.jclouds.json.SerializedNames;
26+
27+
import java.util.Collections;
28+
import java.util.List;
2429

2530
@AutoValue
26-
public abstract class User {
31+
public abstract class User implements ErrorsHolder {
2732

33+
@Nullable
2834
public abstract String name();
2935

3036
@Nullable
3137
public abstract String emailAddress();
3238

33-
public abstract int id();
39+
@Nullable
40+
public abstract Integer id();
3441

42+
@Nullable
3543
public abstract String displayName();
3644

37-
public abstract boolean active();
45+
@Nullable
46+
public abstract Boolean active();
3847

48+
@Nullable
3949
public abstract String slug();
4050

51+
@Nullable
4152
public abstract String type();
4253

54+
@Nullable
55+
public abstract String directoryName();
56+
57+
@Nullable
58+
public abstract Boolean deletable();
59+
60+
@Nullable
61+
public abstract Long lastAuthenticationTimestamp();
62+
63+
@Nullable
64+
public abstract Boolean mutableDetails();
65+
66+
@Nullable
67+
public abstract Boolean mutableGroups();
68+
4369
User() {
4470
}
4571

46-
@SerializedNames({ "name", "emailAddress", "id",
47-
"displayName", "active", "slug", "type" })
48-
public static User create(final String name,
49-
final String emailAddress,
50-
final int id,
51-
final String displayName,
52-
final boolean active,
53-
final String slug,
54-
final String type) {
55-
56-
return new AutoValue_User(name,
57-
emailAddress,
58-
id,
59-
displayName,
60-
active,
61-
slug,
62-
type);
72+
@SerializedNames({ "name", "emailAddress", "id", "displayName", "active", "slug", "type" })
73+
public static User create(final String name, final String emailAddress, final int id, final String displayName,
74+
final boolean active, final String slug, final String type) {
75+
76+
return new AutoValue_User(Collections.emptyList(), name, emailAddress, id, displayName, active, slug, type,
77+
null, null, null, null, null);
78+
}
79+
80+
@SerializedNames({ "errors", "name", "emailAddress", "id", "displayName", "active", "slug", "type", "directoryName",
81+
"deletable", "lastAuthenticationTimestamp", "mutableDetails", "mutableGroups" })
82+
public static User create(final List<Error> errors, final String name, final String emailAddress, final int id,
83+
final String displayName, final boolean active, final String slug, final String type,
84+
final String directoryName, final boolean deletable,
85+
final long lastAuthenticationTimestamp, final boolean mutableDetails,
86+
final boolean mutableGroups) {
87+
88+
return new AutoValue_User(BitbucketUtils.nullToEmpty(errors), name, emailAddress, id, displayName,
89+
active, slug, type, directoryName, deletable, lastAuthenticationTimestamp, mutableDetails, mutableGroups);
6390
}
6491
}

src/main/java/com/cdancy/bitbucket/rest/fallbacks/BitbucketFallbacks.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import com.cdancy.bitbucket.rest.domain.pullrequest.MergeStatus;
5252
import com.cdancy.bitbucket.rest.domain.pullrequest.PullRequest;
5353
import com.cdancy.bitbucket.rest.domain.pullrequest.PullRequestPage;
54+
import com.cdancy.bitbucket.rest.domain.pullrequest.User;
5455
import com.cdancy.bitbucket.rest.domain.repository.Hook;
5556
import com.cdancy.bitbucket.rest.domain.repository.HookPage;
5657
import com.cdancy.bitbucket.rest.domain.repository.HookSettings;
@@ -134,6 +135,16 @@ public Object createOrPropagate(final Throwable throwable) throws Exception {
134135
}
135136
}
136137

138+
public static final class UserOnError implements Fallback<Object> {
139+
@Override
140+
public Object createOrPropagate(final Throwable throwable) throws Exception {
141+
if (checkNotNull(throwable, "throwable") != null) {
142+
return createUserFromErrors(getErrors(throwable.getMessage()));
143+
}
144+
throw propagate(throwable);
145+
}
146+
}
147+
137148
public static final class ConditionOnError implements Fallback<Object> {
138149
@Override
139150
public Object createOrPropagate(final Throwable throwable) throws Exception {
@@ -478,6 +489,10 @@ public static UserPage createUserPageFromErrors(final List<Error> errors) {
478489
return UserPage.create(-1, -1, -1, -1, true, null, errors);
479490
}
480491

492+
public static User createUserFromErrors(final List<Error> errors) {
493+
return User.create(errors, null, null, -1, null, false, null, null, null, false, -1, false, false);
494+
}
495+
481496
public static Condition createConditionFromErrors(final List<Error> errors) {
482497
return Condition.create(null, null, null, null, null, null, errors);
483498
}
@@ -629,7 +644,7 @@ public static List<Error> getErrors(final String output) {
629644

630645
/**
631646
* Parse a single Error object from a given JsonObject.
632-
*
647+
*
633648
* @param obj the JsonObject to parse an Error from.
634649
* @return Error object derived from parsing the passed JsonObject.
635650
*/

src/main/java/com/cdancy/bitbucket/rest/features/AdminApi.java

+34-6
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,22 @@
1919

2020
import com.cdancy.bitbucket.rest.annotations.Documentation;
2121
import com.cdancy.bitbucket.rest.domain.admin.UserPage;
22+
import com.cdancy.bitbucket.rest.domain.common.RequestStatus;
23+
import com.cdancy.bitbucket.rest.domain.pullrequest.User;
2224
import com.cdancy.bitbucket.rest.fallbacks.BitbucketFallbacks;
2325
import com.cdancy.bitbucket.rest.filters.BitbucketAuthenticationFilter;
26+
import com.cdancy.bitbucket.rest.parsers.RequestStatusParser;
2427
import org.jclouds.javax.annotation.Nullable;
2528
import org.jclouds.rest.annotations.Fallback;
2629
import org.jclouds.rest.annotations.RequestFilters;
30+
import org.jclouds.rest.annotations.ResponseParser;
2731

2832
import javax.inject.Named;
2933
import javax.ws.rs.Consumes;
34+
import javax.ws.rs.DELETE;
3035
import javax.ws.rs.GET;
3136
import javax.ws.rs.Path;
37+
import javax.ws.rs.POST;
3238
import javax.ws.rs.Produces;
3339
import javax.ws.rs.QueryParam;
3440
import javax.ws.rs.core.MediaType;
@@ -46,17 +52,39 @@ public interface AdminApi {
4652
@Fallback(BitbucketFallbacks.UserPageOnError.class)
4753
@GET
4854
UserPage listUsersByGroup(@QueryParam("context") String context,
49-
@Nullable @QueryParam("filter") String filter,
50-
@Nullable @QueryParam("start") Integer start,
51-
@Nullable @QueryParam("limit") Integer limit);
52-
55+
@Nullable @QueryParam("filter") String filter,
56+
@Nullable @QueryParam("start") Integer start,
57+
@Nullable @QueryParam("limit") Integer limit);
58+
5359
@Named("admin:list-users")
5460
@Documentation({"https://developer.atlassian.com/static/rest/bitbucket-server/latest/bitbucket-rest.html#idm45588158982432"})
5561
@Consumes(MediaType.APPLICATION_JSON)
5662
@Path("/users")
5763
@Fallback(BitbucketFallbacks.UserPageOnError.class)
5864
@GET
5965
UserPage listUsers(@Nullable @QueryParam("filter") String filter,
60-
@Nullable @QueryParam("start") Integer start,
61-
@Nullable @QueryParam("limit") Integer limit);
66+
@Nullable @QueryParam("start") Integer start,
67+
@Nullable @QueryParam("limit") Integer limit);
68+
69+
@Named("admin:create-user")
70+
@Documentation({"https://developer.atlassian.com/static/rest/bitbucket-server/latest/bitbucket-rest.html#idm46358291368432"})
71+
@Consumes(MediaType.APPLICATION_JSON)
72+
@Path("/users")
73+
@Fallback(BitbucketFallbacks.RequestStatusOnError.class)
74+
@ResponseParser(RequestStatusParser.class)
75+
@POST
76+
RequestStatus createUser(@QueryParam("name") String name,
77+
@QueryParam("password") String password,
78+
@QueryParam("displayName") String displayName,
79+
@QueryParam("emailAddress") String emailAddress,
80+
@Nullable @QueryParam("addToDefaultGroup") Boolean addToDefaultGroup,
81+
@Nullable @QueryParam("notify") String notify);
82+
83+
@Named("admin:delete-user")
84+
@Documentation({"https://developer.atlassian.com/static/rest/bitbucket-server/latest/bitbucket-rest.html#idm46358291356736"})
85+
@Consumes(MediaType.APPLICATION_JSON)
86+
@Path("/users")
87+
@Fallback(BitbucketFallbacks.UserOnError.class)
88+
@DELETE
89+
User deleteUser(@QueryParam("name") String name);
6290
}

src/main/java/com/cdancy/bitbucket/rest/features/PullRequestApi.java

+13
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import javax.ws.rs.Path;
2626
import javax.ws.rs.PathParam;
2727
import javax.ws.rs.Produces;
28+
import javax.ws.rs.PUT;
2829
import javax.ws.rs.QueryParam;
2930
import javax.ws.rs.core.MediaType;
3031

@@ -217,4 +218,16 @@ RequestStatus deleteParticipant(@PathParam("project") String project,
217218
@PathParam("repo") String repo,
218219
@PathParam("pullRequestId") long pullRequestId,
219220
@PathParam("userSlug") String userSlug);
221+
222+
@Named("pull-request:add-participant")
223+
@Documentation({"https://developer.atlassian.com/static/rest/bitbucket-server/latest/bitbucket-rest.html#idm46358292595040"})
224+
@Consumes(MediaType.APPLICATION_JSON)
225+
@Path("/{project}/repos/{repo}/pull-requests/{pullRequestId}/participants/{userSlug}")
226+
@Fallback(ParticipantsOnError.class)
227+
@PUT
228+
Participants addParticipant(@PathParam("project") String project,
229+
@PathParam("repo") String repo,
230+
@PathParam("pullRequestId") long pullRequestId,
231+
@PathParam("userSlug") String userSlug,
232+
@BinderParam(BindToJsonPayload.class) CreateParticipants participants);
220233
}

0 commit comments

Comments
 (0)