From 86209a031e64baeb8aa7c3ce1c82a7e971d52a1d Mon Sep 17 00:00:00 2001 From: Tim Bart Date: Wed, 9 Dec 2015 14:14:55 -0800 Subject: [PATCH 1/2] v2 endpoint for admin related metadata --- .../com/hello/suripu/admin/SuripuAdmin.java | 11 ++++ .../suripu/admin/models/AccountAdminView.java | 25 ++++++++ .../resources/v1/NotificationResources.java | 61 +++++++++++++++++++ .../resources/v2/AccountAdminResources.java | 56 +++++++++++++++++ 4 files changed, 153 insertions(+) create mode 100644 src/main/java/com/hello/suripu/admin/models/AccountAdminView.java create mode 100644 src/main/java/com/hello/suripu/admin/resources/v1/NotificationResources.java create mode 100644 src/main/java/com/hello/suripu/admin/resources/v2/AccountAdminResources.java diff --git a/src/main/java/com/hello/suripu/admin/SuripuAdmin.java b/src/main/java/com/hello/suripu/admin/SuripuAdmin.java index da94ae6..2562a04 100644 --- a/src/main/java/com/hello/suripu/admin/SuripuAdmin.java +++ b/src/main/java/com/hello/suripu/admin/SuripuAdmin.java @@ -5,6 +5,8 @@ import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.sns.AmazonSNS; +import com.amazonaws.services.sns.AmazonSNSClient; import com.codahale.metrics.MetricFilter; import com.codahale.metrics.graphite.Graphite; import com.codahale.metrics.graphite.GraphiteReporter; @@ -35,6 +37,7 @@ import com.hello.suripu.admin.resources.v1.InsightsResource; import com.hello.suripu.admin.resources.v1.InspectionResources; import com.hello.suripu.admin.resources.v1.KeyStoreResources; +import com.hello.suripu.admin.resources.v1.NotificationResources; import com.hello.suripu.admin.resources.v1.OnBoardingLogResource; import com.hello.suripu.admin.resources.v1.PCHResources; import com.hello.suripu.admin.resources.v1.PillResource; @@ -42,6 +45,7 @@ import com.hello.suripu.admin.resources.v1.TimelineResources; import com.hello.suripu.admin.resources.v1.TokenResources; import com.hello.suripu.admin.resources.v1.WifiResources; +import com.hello.suripu.admin.resources.v2.AccountAdminResources; import com.hello.suripu.core.configuration.DynamoDBTableName; import com.hello.suripu.core.configuration.QueueName; import com.hello.suripu.core.db.AccountDAO; @@ -84,6 +88,8 @@ import com.hello.suripu.core.db.util.JodaArgumentFactory; import com.hello.suripu.core.db.util.PostgresIntegerArrayArgumentFactory; import com.hello.suripu.core.diagnostic.DiagnosticDAO; +import com.hello.suripu.core.notifications.MobilePushNotificationProcessor; +import com.hello.suripu.core.notifications.NotificationSubscriptionsDAO; import com.hello.suripu.core.oauth.stores.PersistentApplicationStore; import com.hello.suripu.core.passwordreset.PasswordResetDB; import com.hello.suripu.core.pill.heartbeat.PillHeartBeatDAODynamoDB; @@ -435,6 +441,11 @@ public void run(SuripuAdminConfiguration configuration, Environment environment) environment.jersey().register(new WifiResources(wifiInfoDAO)); environment.jersey().register(new KeyStoreResources(senseKeyStore, pillKeyStore)); environment.jersey().register(new DBResource(sensorsTableDAO)); + environment.jersey().register(new AccountAdminResources(accountDAO)); + final AmazonSNS amazonSNS = new AmazonSNSClient(awsCredentialsProvider); + final NotificationSubscriptionsDAO notificationSubscriptionsDAO = commonDB.onDemand(NotificationSubscriptionsDAO.class); + final MobilePushNotificationProcessor pushNotificationProcessor = new MobilePushNotificationProcessor(amazonSNS, notificationSubscriptionsDAO); + environment.jersey().register(new NotificationResources(accountDAO, pushNotificationProcessor)); } } diff --git a/src/main/java/com/hello/suripu/admin/models/AccountAdminView.java b/src/main/java/com/hello/suripu/admin/models/AccountAdminView.java new file mode 100644 index 0000000..5edd34f --- /dev/null +++ b/src/main/java/com/hello/suripu/admin/models/AccountAdminView.java @@ -0,0 +1,25 @@ +package com.hello.suripu.admin.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.hello.suripu.core.models.Account; +import org.jetbrains.annotations.NotNull; + +public class AccountAdminView { + + @JsonProperty("account") + public final Account account; + + private AccountAdminView(final Account account) { + this.account = account; + } + + @JsonProperty("disabled") + public final Boolean disabled() { + return account.email.startsWith("ADMIN-DISABLED"); + } + + public static AccountAdminView fromAccount(@NotNull final Account account) { + return new AccountAdminView(account); + } + +} diff --git a/src/main/java/com/hello/suripu/admin/resources/v1/NotificationResources.java b/src/main/java/com/hello/suripu/admin/resources/v1/NotificationResources.java new file mode 100644 index 0000000..30cf7db --- /dev/null +++ b/src/main/java/com/hello/suripu/admin/resources/v1/NotificationResources.java @@ -0,0 +1,61 @@ +package com.hello.suripu.admin.resources.v1; + +import com.codahale.metrics.annotation.Timed; +import com.google.common.base.Optional; +import com.hello.suripu.core.db.AccountDAO; +import com.hello.suripu.core.models.Account; +import com.hello.suripu.core.notifications.HelloPushMessage; +import com.hello.suripu.core.notifications.MobilePushNotificationProcessor; +import com.hello.suripu.core.oauth.AccessToken; +import com.hello.suripu.core.oauth.OAuthScope; +import com.hello.suripu.coredw8.oauth.Auth; +import com.hello.suripu.coredw8.oauth.ScopesAllowed; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.validation.Valid; +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +public class NotificationResources { + + + private static final Logger LOGGER = LoggerFactory.getLogger(NotificationResources.class); + + private final AccountDAO accountDAO; + private final MobilePushNotificationProcessor pushNotificationProcessor; + + public NotificationResources(final AccountDAO accountDAO, MobilePushNotificationProcessor pushNotificationProcessor) { + this.accountDAO = accountDAO; + this.pushNotificationProcessor = pushNotificationProcessor; + } + + + @ScopesAllowed({OAuthScope.ADMINISTRATION_READ}) + @POST + @Path("/send/{email}") + @Timed + @Consumes(MediaType.APPLICATION_JSON) + public Response send( + @Auth final AccessToken accessToken, + @PathParam("email") final String email, + @Valid final HelloPushMessage message) { + + LOGGER.debug("email: {}", email); + LOGGER.debug("push target: {}", message.target); + LOGGER.debug("push details: {}", message.details); + LOGGER.debug("push body: {}", message.body); + + final Optional accountOptional = accountDAO.getByEmail(email); + if(!accountOptional.isPresent()) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + + pushNotificationProcessor.push(accountOptional.get().id.get(), message); + return Response.ok().build(); + } +} diff --git a/src/main/java/com/hello/suripu/admin/resources/v2/AccountAdminResources.java b/src/main/java/com/hello/suripu/admin/resources/v2/AccountAdminResources.java new file mode 100644 index 0000000..072cd2e --- /dev/null +++ b/src/main/java/com/hello/suripu/admin/resources/v2/AccountAdminResources.java @@ -0,0 +1,56 @@ +package com.hello.suripu.admin.resources.v2; + + +import com.google.common.base.Optional; +import com.hello.suripu.admin.models.AccountAdminView; +import com.hello.suripu.core.db.AccountDAO; +import com.hello.suripu.core.models.Account; +import com.hello.suripu.core.oauth.OAuthScope; +import com.hello.suripu.coredw8.oauth.AccessToken; +import com.hello.suripu.coredw8.oauth.Auth; +import com.hello.suripu.coredw8.oauth.ScopesAllowed; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +@Path("/v2/account") +public class AccountAdminResources { + + private static final Logger LOGGER = LoggerFactory.getLogger(AccountAdminResources.class); + + public final AccountDAO accountDAO; + + public AccountAdminResources(final AccountDAO accountDAO) { + this.accountDAO = accountDAO; + } + + @ScopesAllowed({OAuthScope.ADMINISTRATION_READ}) + @GET + @Produces(MediaType.APPLICATION_JSON) + public AccountAdminView retrieveAccountByEmailOrId(@Auth final AccessToken accessToken, + @QueryParam("email") final String email, + @QueryParam("id") final Long id) { + if (email == null && id == null) { + throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND) + .entity("Missing query params, please specify email or id").build()); + } + + final Optional account = (email !=null) + ? accountDAO.getByEmail(email.toLowerCase()) + : accountDAO.getById(id); + + if (!account.isPresent()) { + LOGGER.warn("email={} id={} result=missing", email, id); + throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND).entity("Account not found").build()); + } + + return AccountAdminView.fromAccount(account.get()); + } +} From 0e973ce205e52ba8ea682da7fc27f6b4bb7c5a6a Mon Sep 17 00:00:00 2001 From: Tim Bart Date: Wed, 9 Dec 2015 14:16:52 -0800 Subject: [PATCH 2/2] Remove unecessary imports --- src/main/java/com/hello/suripu/admin/SuripuAdmin.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/com/hello/suripu/admin/SuripuAdmin.java b/src/main/java/com/hello/suripu/admin/SuripuAdmin.java index 2562a04..348707d 100644 --- a/src/main/java/com/hello/suripu/admin/SuripuAdmin.java +++ b/src/main/java/com/hello/suripu/admin/SuripuAdmin.java @@ -5,8 +5,6 @@ import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.s3.AmazonS3Client; -import com.amazonaws.services.sns.AmazonSNS; -import com.amazonaws.services.sns.AmazonSNSClient; import com.codahale.metrics.MetricFilter; import com.codahale.metrics.graphite.Graphite; import com.codahale.metrics.graphite.GraphiteReporter; @@ -37,7 +35,6 @@ import com.hello.suripu.admin.resources.v1.InsightsResource; import com.hello.suripu.admin.resources.v1.InspectionResources; import com.hello.suripu.admin.resources.v1.KeyStoreResources; -import com.hello.suripu.admin.resources.v1.NotificationResources; import com.hello.suripu.admin.resources.v1.OnBoardingLogResource; import com.hello.suripu.admin.resources.v1.PCHResources; import com.hello.suripu.admin.resources.v1.PillResource; @@ -88,8 +85,6 @@ import com.hello.suripu.core.db.util.JodaArgumentFactory; import com.hello.suripu.core.db.util.PostgresIntegerArrayArgumentFactory; import com.hello.suripu.core.diagnostic.DiagnosticDAO; -import com.hello.suripu.core.notifications.MobilePushNotificationProcessor; -import com.hello.suripu.core.notifications.NotificationSubscriptionsDAO; import com.hello.suripu.core.oauth.stores.PersistentApplicationStore; import com.hello.suripu.core.passwordreset.PasswordResetDB; import com.hello.suripu.core.pill.heartbeat.PillHeartBeatDAODynamoDB; @@ -443,9 +438,5 @@ public void run(SuripuAdminConfiguration configuration, Environment environment) environment.jersey().register(new DBResource(sensorsTableDAO)); environment.jersey().register(new AccountAdminResources(accountDAO)); - final AmazonSNS amazonSNS = new AmazonSNSClient(awsCredentialsProvider); - final NotificationSubscriptionsDAO notificationSubscriptionsDAO = commonDB.onDemand(NotificationSubscriptionsDAO.class); - final MobilePushNotificationProcessor pushNotificationProcessor = new MobilePushNotificationProcessor(amazonSNS, notificationSubscriptionsDAO); - environment.jersey().register(new NotificationResources(accountDAO, pushNotificationProcessor)); } }