/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.usergrid.rest.management.users.organizations; import com.fasterxml.jackson.jaxrs.json.annotation.JSONP; import com.google.common.collect.BiMap; import org.apache.usergrid.management.OrganizationInfo; import org.apache.usergrid.management.UserInfo; import org.apache.usergrid.management.exceptions.ManagementException; import org.apache.usergrid.rest.AbstractContextResource; import org.apache.usergrid.rest.ApiResponse; import org.apache.usergrid.rest.RootResource; import org.apache.usergrid.rest.security.annotations.RequireAdminUserAccess; import org.apache.usergrid.rest.security.annotations.RequireOrganizationAccess; import org.apache.usergrid.security.shiro.utils.SubjectUtils; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; import java.util.Map; import java.util.UUID; @Component( "org.apache.usergrid.rest.management.users.organizations.OrganizationsResource" ) @Scope( "prototype" ) @Produces( { MediaType.APPLICATION_JSON, "application/javascript", "application/x-javascript", "text/ecmascript", "application/ecmascript", "text/jscript" } ) public class OrganizationsResource extends AbstractContextResource { UserInfo user; public OrganizationsResource() { } public OrganizationsResource init( UserInfo user ) { this.user = user; return this; } @RequireAdminUserAccess @GET @JSONP @Produces({MediaType.APPLICATION_JSON, "application/javascript"}) public ApiResponse getUserOrganizations( @Context UriInfo ui, @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) throws Exception { ApiResponse response = createApiResponse(); response.setAction( "get user management" ); BiMap<UUID, String> userOrganizations = SubjectUtils.getOrganizations(); response.setData( userOrganizations.inverse() ); return response; } @RequireAdminUserAccess @POST @JSONP @Produces({MediaType.APPLICATION_JSON, "application/javascript"}) public ApiResponse newOrganizationForUser( @Context UriInfo ui, Map<String, Object> json, @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) throws Exception { ApiResponse response = createApiResponse(); response.setAction( "new organization for user" ); String organizationName = ( String ) json.get( "organization" ); OrganizationInfo organization = management.createOrganization( organizationName, user, false ); response.setData( organization ); management.activateOrganization( organization ); // DO NOT REMOVE - used for external classes to hook into any post-processing management.createOrganizationPostProcessing(organization, null); management.addUserToOrganizationPostProcessing(user, organizationName, null); return response; } @RequireAdminUserAccess @POST @Consumes( MediaType.APPLICATION_FORM_URLENCODED ) @JSONP @Produces({MediaType.APPLICATION_JSON, "application/javascript"}) public ApiResponse newOrganizationForUserFromForm( @Context UriInfo ui, Map<String, Object> json, @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback, @FormParam( "organization" ) String organizationName ) throws Exception { ApiResponse response = createApiResponse(); response.setAction( "new organization for user" ); if ( organizationName == null || organizationName.isEmpty() ) { throw new ManagementException( "Organization not specified." ); } OrganizationInfo organization = management.createOrganization( organizationName, user, false ); response.setData( organization ); management.activateOrganization( organization ); // DO NOT REMOVE - used for external classes to hook into any post-processing management.createOrganizationPostProcessing(organization, null); management.addUserToOrganizationPostProcessing(user, organizationName, null); return response; } @RequireOrganizationAccess @PUT @Path( "{organizationName}" ) @JSONP @Produces({MediaType.APPLICATION_JSON, "application/javascript"}) public ApiResponse addUserToOrganizationByOrganizationName( @Context UriInfo ui, @PathParam( "organizationName" ) String organizationName, @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) throws Exception { ApiResponse response = createApiResponse(); response.setAction( "add user to organization" ); OrganizationInfo organization = management.getOrganizationByName( organizationName ); management.addAdminUserToOrganization( user, organization, true ); // DO NOT REMOVE - used for external classes to hook into any post-processing management.addUserToOrganizationPostProcessing(user, organizationName, null); response.setData( organization ); return response; } @RequireOrganizationAccess @PUT @Path(RootResource.ORGANIZATION_ID_PATH) @JSONP @Produces({MediaType.APPLICATION_JSON, "application/javascript"}) public ApiResponse addUserToOrganizationByOrganizationId( @Context UriInfo ui, @PathParam( "organizationId" ) String organizationIdStr, @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) throws Exception { ApiResponse response = createApiResponse(); response.setAction( "add user to organization" ); OrganizationInfo organization = management.getOrganizationByUuid( UUID.fromString( organizationIdStr ) ); management.addAdminUserToOrganization( user, organization, true ); // DO NOT REMOVE - used for external classes to hook into any post-processing management.addUserToOrganizationPostProcessing(user, organization.getName(), null); response.setData( organization ); return response; } @RequireOrganizationAccess @DELETE @Path( RootResource.ORGANIZATION_ID_PATH ) @JSONP @Produces({MediaType.APPLICATION_JSON, "application/javascript"}) public ApiResponse removeUserFromOrganizationByOrganizationId( @Context UriInfo ui, @PathParam( "organizationId" ) String organizationIdStr, @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) throws Exception { ApiResponse response = createApiResponse(); response.setAction( "remove user from organization" ); OrganizationInfo organization = management.getOrganizationByUuid( UUID.fromString( organizationIdStr ) ); management.removeAdminUserFromOrganization( user.getUuid(), organization.getUuid() ); // DO NOT REMOVE - used for external classes to hook into any post-processing management.removeUserFromOrganizationPostProcessing(user, organization.getName(), null); response.setData( organization ); return response; } @RequireOrganizationAccess @DELETE @Path( "{organizationName}" ) @JSONP @Produces({MediaType.APPLICATION_JSON, "application/javascript"}) public ApiResponse removeUserFromOrganizationByOrganizationName( @Context UriInfo ui, @PathParam( "organizationName" ) String organizationName, @QueryParam( "callback" ) @DefaultValue( "callback" ) String callback ) throws Exception { ApiResponse response = createApiResponse(); response.setAction( "remove user from organization" ); OrganizationInfo organization = management.getOrganizationByName( organizationName ); management.removeAdminUserFromOrganization( user.getUuid(), organization.getUuid() ); // DO NOT REMOVE - used for external classes to hook into any post-processing management.removeUserFromOrganizationPostProcessing(user, organizationName, null); response.setData( organization ); return response; } }