Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create user #2

Open
wants to merge 22 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@
<id>tmortagne</id>
<name>Thomas Mortagne</name>
</developer>
<developer>
<id>martindelille</id>
<name>Martin Delille</name>
</developer>
</developers>
<modules>
<module>usersync-api</module>
Expand Down Expand Up @@ -85,4 +89,21 @@
</snapshots>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-gson</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
MartinDelille marked this conversation as resolved.
Show resolved Hide resolved
<artifactId>logging-interceptor</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
MartinDelille marked this conversation as resolved.
Show resolved Hide resolved
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,16 @@ public interface UserSyncConnector
/**
* @param user the object containing the metadata of the new user
*/
void createUser(BaseObject user);
void createUser(BaseObject user) throws UserSyncException;

/**
* @param previousUser the object containing the previous metadata of the user
* @param previousUser the object containing the new metadata of the user
*/
void modifyUser(BaseObject previousUser, BaseObject newUser);
void modifyUser(BaseObject previousUser, BaseObject newUser) throws UserSyncException;

/**
* @param deletedUser the object containing the metadata of the deleted user
*/
void deleteUser(BaseObject deletedUser);
void deleteUser(BaseObject deletedUser) throws UserSyncException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

import org.xwiki.component.annotation.Component;
import org.xwiki.contrib.usersync.UserSyncConnector;
import org.xwiki.contrib.usersync.UserSyncException;
import org.xwiki.model.reference.EntityReference;
import org.xwiki.observation.AbstractEventListener;
import org.xwiki.observation.event.Event;
Expand Down Expand Up @@ -80,12 +81,16 @@ private void onEvent(UserSyncConnector connector, XObjectEvent event, XWikiDocum
BaseObject newUser = document.getXObject(event.getReference());
BaseObject previousUser = document.getOriginalDocument().getXObject(event.getReference());

if (event instanceof XObjectAddedEvent) {
connector.createUser(newUser);
} else if (event instanceof XObjectDeletedEvent) {
connector.deleteUser(previousUser);
} else {
connector.modifyUser(previousUser, newUser);
try {
if (event instanceof XObjectAddedEvent) {
connector.createUser(newUser);
} else if (event instanceof XObjectDeletedEvent) {
connector.deleteUser(previousUser);
} else {
connector.modifyUser(previousUser, newUser);
}
} catch (UserSyncException exception) {
System.out.println(exception.getMessage());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.xwiki.contrib.usersync.discourse.internal;

import com.google.gson.annotations.SerializedName;

public class CreateUserBody {
private String username;

private String name;

private String email;

private String password;

private Boolean active;

public CreateUserBody(String _username, String _name, String _email, String _password) {
username = _username;
name = _name;
email = _email;
password = _password;
active = true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.xwiki.contrib.usersync.discourse.internal;

import org.xwiki.contrib.usersync.discourse.internal.User;

public class CreateUserResponse {
private Boolean success;

private String message;

private Integer user_id;

public Boolean getSuccess() {
return success;
}

public String getMessage() {
return message;
}

public Integer getUserId() { return user_id; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.xwiki.contrib.usersync.discourse.internal;

import org.xwiki.contrib.usersync.discourse.internal.User;

public class DeleteUserResponse {
private Boolean deleted;

public Boolean getDeleted() {
return deleted;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.xwiki.contrib.usersync.discourse.internal;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Header;

public interface DiscourseService {
@GET("users/{username}.json")
Call<GetUserResponse> getUser(@Path("username") String username, @Header("Api-Key") String apiKey, @Header("Api-Username") String apiUsername);

@POST("users")
Call<CreateUserResponse> createUser(@Body CreateUserBody createUserBody, @Header("Api-Key") String apiKey, @Header("Api-Username") String apiUsername);

@DELETE("/admin/users/{userid}.json")
Call<DeleteUserResponse> deleteUser(@Path("userid") Integer userId, @Header("Api-Key") String apiKey, @Header("Api-Username") String apiUsername);
}

Original file line number Diff line number Diff line change
Expand Up @@ -19,57 +19,164 @@
*/
package org.xwiki.contrib.usersync.discourse.internal;

import java.io.IOException;

import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;

import org.xwiki.component.annotation.Component;
import org.xwiki.component.phase.Initializable;
import org.xwiki.component.phase.InitializationException;
import org.xwiki.configuration.ConfigurationSource;
import org.xwiki.contrib.usersync.UserSyncConnector;
import org.xwiki.contrib.usersync.UserSyncException;

import com.xpn.xwiki.objects.BaseObject;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/**
* {@link UserSyncConnector} implementation for Discourse.
*
*
* @version $Id$
*/
@Component
@Singleton
@Named("discourse")
public class DiscourseUserSyncConnector implements UserSyncConnector
public class DiscourseUserSyncConnector implements UserSyncConnector, Initializable
{
private static final String PREFIX_CONFIGURATION = "usersync.discourse.";

private static final String CONFIGURATION_URL = PREFIX_CONFIGURATION + "url";

public static final String CONFIGURATION_URL = PREFIX_CONFIGURATION + "url";
public static final String CONFIGURATION_API_KEY = PREFIX_CONFIGURATION + "api_key";
public static final String CONFIGURATION_API_USERNAME = PREFIX_CONFIGURATION + "api_username";

@Inject
private ConfigurationSource configuration;

HttpLoggingInterceptor logging;
OkHttpClient.Builder httpClient;

private Retrofit retrofit;
private DiscourseService service;
String discourseURL;
String discourseApiKey;
String discourseApiUsername;

@Override
public void createUser(BaseObject user)
public void initialize() throws InitializationException
{
// Get the URL of the discourse server to synchronize with
discourseURL = this.configuration.getProperty(CONFIGURATION_URL);
discourseApiKey = this.configuration.getProperty(CONFIGURATION_API_KEY);
discourseApiUsername = this.configuration.getProperty(CONFIGURATION_API_USERNAME);

logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(logging);

retrofit = new Retrofit.Builder()
.baseUrl(discourseURL)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build())
.build();

service = retrofit.create(DiscourseService.class);
}

@Override
public void createUser(BaseObject userObject) throws UserSyncException {
// Get the user login
String userId = user.getReference().getName();
String userId = userObject.getStringValue("id");

// Get the user mail
String mail = user.getStringValue("email");
// Get the user email
String email = userObject.getStringValue("email");

// Get the URL of the discourse server to synchronize with
String discourseURL = this.configuration.getProperty(CONFIGURATION_URL);
// Get the user password
String password = userObject.getStringValue("password");

// TODO
// Get the user name
String name = userObject.getStringValue("name");

System.out.printf("creating user: %s / %s / %s / %s\n", userId, email, password, name);

CreateUserBody createUserBody = new CreateUserBody(userId, name, email, password);

Call<CreateUserResponse> call = service.createUser(createUserBody, discourseApiKey, discourseApiUsername);

try {
Response<CreateUserResponse> response = call.execute();
if(response.isSuccessful()) {
System.out.println("succeed!");
CreateUserResponse createUserResponse = response.body();
if (createUserResponse.getSuccess()) {
System.out.println("Success creating user with id:" + createUserResponse.getUserId());
userObject.setIntValue("id", createUserResponse.getUserId());
} else {
throw new UserSyncException(createUserResponse.getMessage());
}
} else {
System.out.println("Code: " + response.code());
throw new UserSyncException("Bad response code:" + response.code());
}
} catch (IOException exception) {
System.out.println(exception.getMessage());
throw new UserSyncException("Unknown error", exception);
}
}

@Override
public void modifyUser(BaseObject previousUser, BaseObject newUser)
public void modifyUser(BaseObject previousUser, BaseObject newUser) throws UserSyncException
{
// TODO
}

@Override
public void deleteUser(BaseObject deletedUser)
public void deleteUser(BaseObject userObject) throws UserSyncException
{
// TODO
// Get the user login
String userName = userObject.getStringValue("id");

System.out.printf("deleting user: %s\n", userName);

Call<GetUserResponse> getUserResponseCall = service.getUser(userName, discourseApiKey, discourseApiUsername);



try {
Response<GetUserResponse> getUserResponse = getUserResponseCall.execute();
if (getUserResponse.isSuccessful()) {
System.out.printf("user name is " + getUserResponse.body().getUser().getEmail());
Integer userId = getUserResponse.body().getUser().getId();
System.out.printf("user id is " + userId);
Call<DeleteUserResponse> deleteUserResponseCall = service.deleteUser(userId, discourseApiKey, discourseApiUsername);

Response<DeleteUserResponse> deleteUserResponse = deleteUserResponseCall.execute();
if(deleteUserResponse.isSuccessful()) {
System.out.println("succeed!");
if (deleteUserResponse.body().getDeleted()) {
System.out.println("Success deleting user");
} else {
throw new UserSyncException("Failed deleting user");
}
} else {
System.out.println("Code: " + deleteUserResponse.code());
throw new UserSyncException("Bad response code for deleteUser:" + deleteUserResponse.code());
}
} else {
System.out.println("Code: " + getUserResponse.code());
throw new UserSyncException("Bad response code for getUser:" + getUserResponse.code());
}
} catch (IOException exception) {
System.out.println(exception.getMessage());
throw new UserSyncException("Unknown error", exception);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.xwiki.contrib.usersync.discourse.internal;

import org.xwiki.contrib.usersync.discourse.internal.User;

public class GetUserResponse {
private User user;

public User getUser() {
return user;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.xwiki.contrib.usersync.discourse.internal;

import com.google.gson.annotations.SerializedName;

public class User {
private int id;

private String username;

private String name;

private String email;

private String password;

public int getId() { return id; }

public String getUsername() {
return username;
}

public String getName() {
return name;
}

public String getEmail() {
return email;
}

public String getPassword() {
return password;
}
}
Loading