diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/membership.lib.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/membership.lib.ftl new file mode 100644 index 0000000000..ca6f6db9c6 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/membership.lib.ftl @@ -0,0 +1,13 @@ +<#macro membershipJSON site role person> +{ + "role" : "${role}", + "person": + { + "userName" : "${person.properties.userName}", + "url" : "${url.serviceContext}/api/people/${person.properties.userName}", + "firstName" : "${person.properties.firstName}", + "lastName" : "${person.properties.lastName}" + }, + "url" : "${url.serviceContext}/api/sites/${site.shortName}/memberships/${person.properties.userName}" +} + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.get.desc.xml new file mode 100644 index 0000000000..5d72719316 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.get.desc.xml @@ -0,0 +1,8 @@ + + Memberships + Get a colleciton of a sites memberships. + /api/sites/{shortname}/memberships?nf={namefilter?}&rf={rolefilter?}&size={pagesize?}&pos={position?} + + guest + required + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.get.js new file mode 100644 index 0000000000..a6cb21af1c --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.get.js @@ -0,0 +1,21 @@ +// Get the site id +var shortName = url.extension.split("/")[0]; +var site = siteService.getSite(shortName); + +// TODO get the filters + +// Get all the memeberships +var memberships = site.listMembers(null, null); + +// Get a list of all the users resolved to person nodes +var peopleList = Array(); +for (userName in memberships) +{ + var person = people.getPerson(userName); + peopleList[userName] = person; +} + +// Pass the information to the template +model.site = site; +model.memberships = memberships; +model.people = peopleList; \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.get.json.ftl new file mode 100644 index 0000000000..c701c5c181 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.get.json.ftl @@ -0,0 +1,8 @@ +<#import "membership.lib.ftl" as membershipLib/> +[ + <#assign userNames = memberships?keys /> + <#list userNames as userName> + <@membershipLib.membershipJSON site=site role=memberships[userName] person=people[userName]/> + <#if userName_has_next>, + + ] diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.post.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.post.desc.xml new file mode 100644 index 0000000000..82c1a1beee --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.post.desc.xml @@ -0,0 +1,8 @@ + + Memberships + Adds a new membership to the site + /api/sites/{shortname}/memberships + + guest + required + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.post.js b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.post.js new file mode 100644 index 0000000000..4d8803d28e --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.post.js @@ -0,0 +1,15 @@ +// Get the site +var shortName = url.extension.split("/")[0]; +var site = siteService.getSite(shortName); + +// Get the role +var role = json.get("role"); +var userName = json.getJSONObject("person").get("userName"); + +// Set the membership details +site.setMembership(userName, role); + +// Pass the details to the template +model.site = site; +model.role = role; +model.person = people.getPerson(userName); \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.post.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.post.json.ftl new file mode 100644 index 0000000000..fdf2fe5dfd --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.post.json.ftl @@ -0,0 +1,2 @@ +<#import "membership.lib.ftl" as membershipLib/> +<@membershipLib.membershipJSON site=site role=role person=person/> \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.delete.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.delete.desc.xml index e6bcc68e8b..c63cba2100 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.delete.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.delete.desc.xml @@ -1,7 +1,7 @@ Site Delete the details of a site. - /api/site/{shortname} + /api/sites/{shortname} guest required diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.get.desc.xml index e040cafc55..4a6e2bbc0e 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.get.desc.xml @@ -1,7 +1,7 @@ Site Get the details of a site. - /api/site/{shortname} + /api/sites/{shortname} guest required diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.put.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.put.desc.xml index a0b0bf9d18..9e8693acb9 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.put.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.put.desc.xml @@ -1,7 +1,7 @@ Site Update the details of a site. - /api/site/{shortname} + /api/sites/{shortname} guest required diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.get.desc.xml index ebf171a777..5870cd2de9 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.get.desc.xml @@ -1,7 +1,7 @@ Sites Get a colleciton of the sites in the repository. The collection can be filtered by name and/or site preset. - /api/sites?nf={namefilter?}&spf={sitepresetfilter?} + /api/sites?nf={namefilter?}&spf={sitepresetfilter?}&size={pagesize?}&pos={position?} guest required diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.post.js b/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.post.js index 9f3cd4a594..df74dd8f4f 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.post.js +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.post.js @@ -1,12 +1,33 @@ -// Get the details of the site -var shortName = json.get("shortName"); -var sitePreset = json.get("sitePreset"); -var title = json.get("title"); -var description = json.get("description"); -var isPublic = json.getBoolean("isPublic"); +function main() +{ + // Get the details of the site + var shortName = json.get("shortName"); + if (shortName == null || shortName.length == 0) + { + status.code = 400; + status.message = "Short name missing when creating site."; + status.redirect = true; + return; + } + + var sitePreset = json.get("sitePreset"); + if (shortName == null || shortName.length == 0) + { + status.code = 400; + status.message = "Site preset missing when creating site."; + status.redirect = true; + return; + } + + var title = json.get("title"); + var description = json.get("description"); + var isPublic = json.getBoolean("isPublic"); + + // Create the site + var site = siteService.createSite(sitePreset, shortName, title, description, isPublic); + + // Put the created site into the model + model.site = site; +} -// Create the site -var site = siteService.createSite(sitePreset, shortName, title, description, isPublic); - -// Put the created site into the model -model["site"] = site; \ No newline at end of file +main(); \ No newline at end of file diff --git a/source/java/org/alfresco/repo/web/scripts/BaseWebScriptTest.java b/source/java/org/alfresco/repo/web/scripts/BaseWebScriptTest.java index 7d8b5ecd3f..f238d7dc5b 100644 --- a/source/java/org/alfresco/repo/web/scripts/BaseWebScriptTest.java +++ b/source/java/org/alfresco/repo/web/scripts/BaseWebScriptTest.java @@ -135,7 +135,7 @@ public abstract class BaseWebScriptTest extends TestCase { System.out.println(response.getContentAsString()); } - fail("The expected status code (" + expectedStatus + ") was not returned."); + fail("Expected status code " + expectedStatus + " , " + response.getStatus() + " was returned."); } return response; } diff --git a/source/java/org/alfresco/repo/web/scripts/site/SiteServiceTest.java b/source/java/org/alfresco/repo/web/scripts/site/SiteServiceTest.java index 77e042dda8..fc7cd89828 100644 --- a/source/java/org/alfresco/repo/web/scripts/site/SiteServiceTest.java +++ b/source/java/org/alfresco/repo/web/scripts/site/SiteServiceTest.java @@ -27,8 +27,14 @@ package org.alfresco.repo.web.scripts.site; import java.util.ArrayList; import java.util.List; +import org.alfresco.model.ContentModel; +import org.alfresco.repo.security.authentication.AuthenticationComponent; +import org.alfresco.repo.site.SiteModel; import org.alfresco.repo.web.scripts.BaseWebScriptTest; +import org.alfresco.service.cmr.security.AuthenticationService; +import org.alfresco.service.cmr.security.PersonService; import org.alfresco.util.GUID; +import org.alfresco.util.PropertyMap; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.mock.web.MockHttpServletResponse; @@ -40,20 +46,64 @@ import org.springframework.mock.web.MockHttpServletResponse; */ public class SiteServiceTest extends BaseWebScriptTest { + private AuthenticationService authenticationService; + private AuthenticationComponent authenticationComponent; + private PersonService personService; + + private static final String USER_ONE = "SiteTestOne"; + private static final String USER_TWO = "SiteTestTwo"; + private static final String USER_THREE = "SiteTestThree"; + private static final String URL_SITES = "/api/sites"; - private static final String URL_SITE = "/api/site/"; + private static final String URL_MEMBERSHIPS = "/memberships"; private List createdSites = new ArrayList(5); + @Override + protected void setUp() throws Exception + { + super.setUp(); + + this.authenticationService = (AuthenticationService)getServer().getApplicationContext().getBean("AuthenticationService"); + this.authenticationComponent = (AuthenticationComponent)getServer().getApplicationContext().getBean("authenticationComponent"); + this.personService = (PersonService)getServer().getApplicationContext().getBean("PersonService"); + + // Create users + createUser(USER_ONE); + createUser(USER_TWO); + createUser(USER_THREE); + + // Do tests as user one + this.authenticationComponent.setCurrentUser(USER_ONE); + } + + private void createUser(String userName) + { + if (this.authenticationService.authenticationExists(userName) == false) + { + this.authenticationService.createAuthentication(userName, "PWD".toCharArray()); + + PropertyMap ppOne = new PropertyMap(4); + ppOne.put(ContentModel.PROP_USERNAME, userName); + ppOne.put(ContentModel.PROP_FIRSTNAME, "firstName"); + ppOne.put(ContentModel.PROP_LASTNAME, "lastName"); + ppOne.put(ContentModel.PROP_EMAIL, "email@email.com"); + ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle"); + + this.personService.createPerson(ppOne); + } + } + @Override protected void tearDown() throws Exception { super.tearDown(); + this.authenticationComponent.setCurrentUser("admin"); // Tidy-up any site's create during the execution of the test for (String shortName : this.createdSites) { - deleteRequest(URL_SITE + shortName, 0); + deleteRequest(URL_SITES + "/" + shortName, 0); } // Clear the list @@ -106,12 +156,12 @@ public class SiteServiceTest extends BaseWebScriptTest public void testGetSite() throws Exception { // Get a site that doesn't exist - MockHttpServletResponse response = getRequest(URL_SITE + "somerandomshortname", 404); + MockHttpServletResponse response = getRequest(URL_SITES + "/" + "somerandomshortname", 404); // Create a site and get it String shortName = GUID.generate(); JSONObject result = createSite("myPreset", shortName, "myTitle", "myDescription", true, 200); - response = getRequest(URL_SITE + shortName, 200); + response = getRequest(URL_SITES + "/" + shortName, 200); } @@ -125,14 +175,14 @@ public class SiteServiceTest extends BaseWebScriptTest result.put("title", "abs123abc"); result.put("description", "123abc123"); result.put("isPublic", false); - MockHttpServletResponse response = putRequest(URL_SITE + shortName, 200, result.toString(), "application/json"); + MockHttpServletResponse response = putRequest(URL_SITES + "/" + shortName, 200, result.toString(), "application/json"); result = new JSONObject(response.getContentAsString()); assertEquals("abs123abc", result.get("title")); assertEquals("123abc123", result.get("description")); assertFalse(result.getBoolean("isPublic")); // Try and get the site and double check it's changed - response = getRequest(URL_SITE + shortName, 200); + response = getRequest(URL_SITES + "/" + shortName, 200); result = new JSONObject(response.getContentAsString()); assertEquals("abs123abc", result.get("title")); assertEquals("123abc123", result.get("description")); @@ -142,20 +192,63 @@ public class SiteServiceTest extends BaseWebScriptTest public void testDeleteSite() throws Exception { // Delete non-existant site - MockHttpServletResponse response = deleteRequest(URL_SITE + "somerandomshortname", 404); + MockHttpServletResponse response = deleteRequest(URL_SITES + "/" + "somerandomshortname", 404); // Create a site String shortName = GUID.generate(); JSONObject result = createSite("myPreset", shortName, "myTitle", "myDescription", true, 200); // Get the site - response = getRequest(URL_SITE + shortName, 200); + response = getRequest(URL_SITES + "/" + shortName, 200); // Delete the site - response = deleteRequest(URL_SITE + shortName, 200); + response = deleteRequest(URL_SITES + "/" + shortName, 200); // Get the site - response = getRequest(URL_SITE + shortName, 404); + response = getRequest(URL_SITES + "/" + shortName, 404); + } + + public void testGetMemeberships() throws Exception + { + // Create a site + String shortName = GUID.generate(); + createSite("myPreset", shortName, "myTitle", "myDescription", true, 200); + + // Check the memberships + MockHttpServletResponse response = getRequest(URL_SITES + "/" + shortName + URL_MEMBERSHIPS, 200); + JSONArray result = new JSONArray(response.getContentAsString()); + assertNotNull(result); + assertEquals(1, result.length()); + JSONObject membership = result.getJSONObject(0); + assertEquals(SiteModel.SITE_MANAGER, membership.get("role")); + assertEquals(USER_ONE, membership.getJSONObject("person").get("userName")); + } + + public void testPostMemberships() throws Exception + { + // Create a site + String shortName = GUID.generate(); + createSite("myPreset", shortName, "myTitle", "myDescription", true, 200); + + // Build the JSON membership object + JSONObject membership = new JSONObject(); + membership.put("role", SiteModel.SITE_CONSUMER); + JSONObject person = new JSONObject(); + person.put("userName", USER_TWO); + membership.put("person", person); + + // Post the memebership + MockHttpServletResponse response = postRequest(URL_SITES + "/" + shortName + URL_MEMBERSHIPS, 200, membership.toString(), "application/json"); + JSONObject result = new JSONObject(response.getContentAsString()); + + // Check the result + assertEquals(SiteModel.SITE_CONSUMER, membership.get("role")); + assertEquals(USER_TWO, membership.getJSONObject("person").get("userName")); + + // Get the membership list + response = getRequest(URL_SITES + "/" + shortName + URL_MEMBERSHIPS, 200); + JSONArray result2 = new JSONArray(response.getContentAsString()); + assertNotNull(result2); + assertEquals(2, result2.length()); } - }