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

Pivotal ID # 183126684: Log Submission Draft ID #648

Merged
merged 3 commits into from
Dec 13, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@ private val logger = KotlinLogging.logger {}
*/
@OptIn(ExperimentalTime::class)
internal fun <T> RetryTemplate.execute(opt: String, func: () -> T): T {
logger.debug(opt) { "Executing operation: $opt" }
logger.debug(opt) { "Started executing operation: $opt" }
val response = execute(
onError = { error, cxt -> logger.error(error) { "Fail to perform operation: $opt, ${cxt.retryCount + 1}" } },
onError = { error, cxt ->
logger.warn(error) { "Failed to perform operation: $opt. Attempt # ${cxt.retryCount + 1}" }
},
func = { measureTimedValue(func) }
)
logger.debug { "Executed operation: $opt in ${response.duration.inWholeMilliseconds}" }
logger.debug { "Finished executing operation: $opt in ${response.duration.inWholeMilliseconds}" }
return response.value
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@ import ebi.ac.uk.extended.mapping.to.ToSubmissionMapper
import ebi.ac.uk.model.Submission
import ebi.ac.uk.security.integration.components.IUserPrivilegesService
import ebi.ac.uk.security.integration.model.api.SecurityUser
import mu.KotlinLogging
import java.time.Instant

private val logger = KotlinLogging.logger {}

@Suppress("LongParameterList")
class SubmissionDraftService(
private val submitWebHandler: SubmitWebHandler,
Expand Down Expand Up @@ -46,17 +49,25 @@ class SubmissionDraftService(

fun deleteSubmissionDraft(userEmail: String, key: String) {
draftPersistenceService.deleteSubmissionDraft(userEmail, key)
logger.info { "$key $userEmail Draft with key '$key' DELETED for user '$userEmail'" }
}

fun updateSubmissionDraft(userEmail: String, key: String, content: String): SubmissionDraft {
return draftPersistenceService.updateSubmissionDraft(userEmail, key, content)
val updated = draftPersistenceService.updateSubmissionDraft(userEmail, key, content)
logger.info { "$key $userEmail Draft with key '$key' UPDATED for user '$userEmail'" }

return updated
}

fun createSubmissionDraft(userEmail: String, content: String): SubmissionDraft {
return draftPersistenceService.createSubmissionDraft(userEmail, "TMP_${Instant.now().toEpochMilli()}", content)
val draftKey = "TMP_${Instant.now().toEpochMilli()}"
val draft = draftPersistenceService.createSubmissionDraft(userEmail, draftKey, content)
logger.info { "$draftKey $userEmail Draft with key '$draftKey' CREATED for user '$userEmail'" }

return draft
}

fun submitDraft(
fun submitDraftAsync(
key: String,
user: SecurityUser,
onBehalfRequest: OnBehalfRequest?,
Expand All @@ -66,6 +77,8 @@ class SubmissionDraftService(
val buildRequest = SubmitBuilderRequest(user, onBehalfRequest, parameters, key)
val request = submitRequestBuilder.buildContentRequest(submission, SubFormat.JSON_PRETTY, buildRequest)
submitWebHandler.submitAsync(request)

logger.info { "$key ${user.email} Draft with key '$key' SUBMITTED" }
}

fun submitDraftSync(
Expand All @@ -77,6 +90,9 @@ class SubmissionDraftService(
val submission = getOrCreateSubmissionDraft(user.email, key).content
val buildRequest = SubmitBuilderRequest(user, onBehalfRequest, parameters, key)
val request = submitRequestBuilder.buildContentRequest(submission, SubFormat.JSON_PRETTY, buildRequest)

logger.info { "$key ${user.email} Started SUBMITTED process draft with key '$key'" }

return submitWebHandler.submit(request)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ class SubmissionService(
private val submissionPersistenceService: SubmissionPersistenceService,
) {
fun submit(rqt: SubmitRequest): ExtSubmission {
logger.info { "${rqt.accNo} ${rqt.owner} Received sync submit request for submission ${rqt.accNo}" }
logger.info { "${rqt.accNo} ${rqt.owner} Received sync submit request with draft key '${rqt.draftKey}'" }
return submissionSubmitter.submit(rqt)
}

fun submitAsync(rqt: SubmitRequest) {
logger.info { "${rqt.accNo} ${rqt.owner} Received async submit request for submission ${rqt.accNo}" }
logger.info { "${rqt.accNo} ${rqt.owner} Received async submit request with draft key '${rqt.draftKey}'" }
val (accNo, version) = submissionSubmitter.createRequest(rqt)
eventsPublisherService.requestCreated(accNo, version)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ internal class SubmissionDraftResource(
onBehalfRequest: OnBehalfRequest?,
@ModelAttribute parameters: SubmissionRequestParameters,
) {
submissionDraftService.submitDraft(key, user, onBehalfRequest, parameters)
submissionDraftService.submitDraftAsync(key, user, onBehalfRequest, parameters)
}

@PostMapping("/{key}/submit/sync")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ class SubmissionDraftServiceTest(
submitRequestBuilder.buildContentRequest(DRAFT_CONTENT, SubFormat.JSON_PRETTY, capture(requestSlot))
} returns contentRequest

testInstance.submitDraft(DRAFT_KEY, user, onBehalfRequest, parameters)
testInstance.submitDraftAsync(DRAFT_KEY, user, onBehalfRequest, parameters)

val submitRequest = requestSlot.captured
assertThat(submitRequest.user).isEqualTo(user)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,26 @@ class SubmissionSubmitter(
try {
logger.info { "${rqt.accNo} ${rqt.owner} Started processing submission request" }

rqt.draftKey?.let { draftService.setProcessingStatus(rqt.owner, it) }
rqt.draftKey?.let {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is adding too much complexity to this method, we times the same conditional (if draftkey != null) in this few lines. Not really sure about but we may consider include accNo and owner in draftService operations to log on each status change. Not much better as we will be including parameters only for logging purposes but as it is righ it looks super verbose.

draftService.setProcessingStatus(rqt.owner, it)
logger.info { "${rqt.accNo} ${rqt.owner} Status of draft with key '$it' set to PROCESSING" }
}
val processed = submissionProcessor.processSubmission(rqt)
parentInfoService.executeCollectionValidators(processed)
rqt.draftKey?.let { draftService.setAcceptedStatus(it) }
rqt.draftKey?.let {
logger.info { "${rqt.accNo} ${rqt.owner} Assigned accNo '${processed.accNo}' to draft with key '$it'" }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this one I can guess can be moved to submissionProcessor.processSubmission where actuallty this happens (I am looking for way to reduce verbosity here )

draftService.setAcceptedStatus(it)
logger.info { "${rqt.accNo} ${rqt.owner} Status of draft with key '$it' set to ACCEPTED" }
}
logger.info { "${rqt.accNo} ${rqt.owner} Finished processing submission request" }

return processed
} catch (exception: RuntimeException) {
logger.error(exception) { "${rqt.accNo} ${rqt.owner} Error processing submission request" }
rqt.draftKey?.let { draftService.setActiveStatus(it) }
rqt.draftKey?.let {
draftService.setActiveStatus(it)
logger.info { "${rqt.accNo} ${rqt.owner} Status of draft with key '$it' set to ACTIVE" }
}
throw InvalidSubmissionException("Submission validation errors", listOf(exception))
}
}
Expand Down