-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
168 changed files
with
2,816 additions
and
1,557 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -37,4 +37,7 @@ secrets/* | |
.swagger_gen_dir | ||
|
||
ocs_descriptor.pb | ||
metrics_descriptor.pb | ||
metrics_descriptor.pb | ||
|
||
.Mac | ||
*.DS_Store |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
118 changes: 118 additions & 0 deletions
118
admin-api/src/main/kotlin/org/ostelco/prime/admin/api/ImportResource.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
package org.ostelco.prime.admin.api | ||
|
||
import org.ostelco.prime.admin.importer.AddToSegments | ||
import org.ostelco.prime.admin.importer.ChangeSegments | ||
import org.ostelco.prime.admin.importer.CreateOffer | ||
import org.ostelco.prime.admin.importer.CreateSegments | ||
import org.ostelco.prime.admin.importer.ImportProcessor | ||
import org.ostelco.prime.admin.importer.RemoveFromSegments | ||
import org.ostelco.prime.admin.importer.UpdateSegments | ||
import org.ostelco.prime.getLogger | ||
import org.ostelco.prime.jsonmapper.asJson | ||
import javax.ws.rs.Consumes | ||
import javax.ws.rs.DELETE | ||
import javax.ws.rs.POST | ||
import javax.ws.rs.PUT | ||
import javax.ws.rs.Path | ||
import javax.ws.rs.core.Response | ||
|
||
|
||
/** | ||
* Resource used to handle the import related REST calls. | ||
*/ | ||
@Path("/import") | ||
class ImporterResource(private val processor: ImportProcessor) { | ||
|
||
private val logger by getLogger() | ||
|
||
/** | ||
* Create new [Offer]. | ||
* Link to new or existing [Product]. | ||
* Link to new or existing [Segment]. | ||
*/ | ||
@POST | ||
@Path("/offer") | ||
@Consumes("text/vnd.yaml") | ||
fun createOffer(createOffer: CreateOffer): Response { | ||
logger.info("POST for /import/offer") | ||
return processor.createOffer(createOffer).fold( | ||
{ apiError -> Response.status(apiError.status).entity(asJson(apiError)) }, | ||
{ Response.status(Response.Status.CREATED) } | ||
).build() | ||
} | ||
|
||
/** | ||
* Create new [Segment]. | ||
*/ | ||
@POST | ||
@Path("/segments") | ||
@Consumes("text/vnd.yaml") | ||
fun createSegment(createSegments: CreateSegments): Response { | ||
logger.info("POST for /import/segments") | ||
|
||
return processor.createSegments(createSegments).fold( | ||
{ apiError -> Response.status(apiError.status).entity(asJson(apiError)) }, | ||
{ Response.status(Response.Status.CREATED) } | ||
).build() | ||
} | ||
|
||
/** | ||
* Update [Segment] - Replace all [Subscriber]s under this [Segment]. | ||
*/ | ||
@PUT | ||
@Path("/segments") | ||
@Consumes("text/vnd.yaml") | ||
fun importSegment(updateSegments: UpdateSegments): Response { | ||
logger.info("PUT for /import/segments") | ||
|
||
return processor.updateSegments(updateSegments).fold( | ||
{ apiError -> Response.status(apiError.status).entity(asJson(apiError)) }, | ||
{ Response.status(Response.Status.OK) } | ||
).build() | ||
} | ||
|
||
/** | ||
* Add [Subscriber]s to [Segment] | ||
*/ | ||
@POST | ||
@Path("/segments/subscribers") | ||
@Consumes("text/vnd.yaml") | ||
fun importSegment(addToSegments: AddToSegments): Response { | ||
logger.info("POST for /import/segments/subscribers") | ||
|
||
return processor.addToSegments(addToSegments).fold( | ||
{ apiError -> Response.status(apiError.status).entity(asJson(apiError)) }, | ||
{ Response.status(Response.Status.OK) } | ||
).build() | ||
} | ||
|
||
/** | ||
* Remove [Subscriber]s from [Segment] | ||
*/ | ||
@DELETE | ||
@Path("/segments/subscribers") | ||
@Consumes("text/vnd.yaml") | ||
fun importSegment(removeFromSegments: RemoveFromSegments): Response { | ||
logger.info("DELETE for /import/segments/subscribers") | ||
|
||
return processor.removeFromSegments(removeFromSegments).fold( | ||
{ apiError -> Response.status(apiError.status).entity(asJson(apiError)) }, | ||
{ Response.status(Response.Status.OK) } | ||
).build() | ||
} | ||
|
||
/** | ||
* Move [Subscriber]s from one [Segment] to another. | ||
*/ | ||
@PUT | ||
@Path("/segments/subscribers") | ||
@Consumes("text/vnd.yaml") | ||
fun importSegment(changeSegments: ChangeSegments): Response { | ||
logger.info("PUT for /import/segments/subscribers") | ||
|
||
return processor.changeSegments(changeSegments).fold( | ||
{ apiError -> Response.status(apiError.status).entity(asJson(apiError)) }, | ||
{ Response.status(Response.Status.OK) } | ||
).build() | ||
} | ||
} |
51 changes: 44 additions & 7 deletions
51
admin-api/src/main/kotlin/org/ostelco/prime/admin/importer/ImportProcessor.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,26 +1,63 @@ | ||
|
||
package org.ostelco.prime.admin.importer | ||
|
||
import arrow.core.Either | ||
import org.ostelco.prime.apierror.ApiError | ||
import org.ostelco.prime.apierror.ApiErrorCode | ||
import org.ostelco.prime.apierror.BadRequestError | ||
import org.ostelco.prime.model.Offer | ||
import org.ostelco.prime.model.Segment | ||
import org.ostelco.prime.module.getResource | ||
import org.ostelco.prime.storage.AdminDataSource | ||
|
||
interface ImportProcessor { | ||
fun import(importDeclaration: ImportDeclaration): Either<ApiError, Unit> | ||
fun createOffer(createOffer: CreateOffer): Either<ApiError, Unit> | ||
fun createSegments(createSegments: CreateSegments): Either<ApiError, Unit> | ||
fun updateSegments(updateSegments: UpdateSegments): Either<ApiError, Unit> | ||
fun addToSegments(addToSegments: AddToSegments): Either<ApiError, Unit> | ||
fun removeFromSegments(removeFromSegments: RemoveFromSegments): Either<ApiError, Unit> | ||
fun changeSegments(changeSegments: ChangeSegments): Either<ApiError, Unit> | ||
} | ||
|
||
class ImportAdapter : ImportProcessor { | ||
|
||
private val adminDataStore by lazy { getResource<AdminDataSource>() } | ||
|
||
override fun import(importDeclaration: ImportDeclaration): Either<ApiError, Unit> { | ||
override fun createOffer(createOffer: CreateOffer): Either<ApiError, Unit> { | ||
return adminDataStore.atomicCreateOffer( | ||
offer = createOffer.createOffer.let { | ||
Offer(id = it.id, segments = it.existingSegments, products = it.existingProducts) | ||
}, | ||
products = createOffer.createOffer.createProducts, | ||
segments = createOffer.createOffer.createSegments) | ||
.mapLeft { BadRequestError(it.message, ApiErrorCode.FAILED_TO_IMPORT_OFFER) } | ||
} | ||
|
||
return adminDataStore.atomicImport( | ||
offer = importDeclaration.offer, | ||
products = importDeclaration.products, | ||
segments = importDeclaration.segments) | ||
override fun createSegments(createSegments: CreateSegments): Either<ApiError, Unit> { | ||
return adminDataStore.atomicCreateSegments(createSegments = createSegments.createSegments) | ||
.mapLeft { BadRequestError(it.message, ApiErrorCode.FAILED_TO_IMPORT_OFFER) } | ||
} | ||
} | ||
|
||
override fun updateSegments(updateSegments: UpdateSegments): Either<ApiError, Unit> { | ||
return adminDataStore.atomicUpdateSegments( | ||
updateSegments = updateSegments.updateSegments.map { Segment(id = it.id, subscribers = it.subscribers) } | ||
).mapLeft { BadRequestError(it.message, ApiErrorCode.FAILED_TO_IMPORT_OFFER) } | ||
} | ||
|
||
override fun addToSegments(addToSegments: AddToSegments): Either<ApiError, Unit> { | ||
return adminDataStore.atomicAddToSegments( | ||
addToSegments = addToSegments.addToSegments.map { Segment(id = it.id, subscribers = it.subscribers) } | ||
).mapLeft { BadRequestError(it.message, ApiErrorCode.FAILED_TO_IMPORT_OFFER) } | ||
} | ||
|
||
override fun removeFromSegments(removeFromSegments: RemoveFromSegments): Either<ApiError, Unit> { | ||
return adminDataStore.atomicRemoveFromSegments( | ||
removeFromSegments = removeFromSegments.removeFromSegments.map { Segment(id = it.id, subscribers = it.subscribers) } | ||
).mapLeft { BadRequestError(it.message, ApiErrorCode.FAILED_TO_IMPORT_OFFER) } | ||
} | ||
|
||
override fun changeSegments(changeSegments: ChangeSegments): Either<ApiError, Unit> { | ||
return adminDataStore.atomicChangeSegments(changeSegments = changeSegments.changeSegments) | ||
.mapLeft { BadRequestError(it.message, ApiErrorCode.FAILED_TO_IMPORT_OFFER) } | ||
} | ||
} |
Oops, something went wrong.