Skip to content

Commit

Permalink
Show submission progress
Browse files Browse the repository at this point in the history
  • Loading branch information
ursm committed Jul 30, 2024
1 parent 07cf4d8 commit 72d54ac
Show file tree
Hide file tree
Showing 16 changed files with 281 additions and 16 deletions.
2 changes: 1 addition & 1 deletion api/app/controllers/validations/via_files_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def create_validation
raise UnprocessableEntity, "unknown db: #{params[:db]}"
end

validation = current_user.validations.create!(db: db[:id], progress: 'waiting')
validation = current_user.validations.create!(db: db[:id])

validation.objs.create! _id: '_base'

Expand Down
24 changes: 21 additions & 3 deletions api/app/jobs/submit_job.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,27 @@
class SubmitJob < ApplicationJob
def perform(submission)
submitter = "Database::#{submission.validation.db}::Submitter".constantize.new
ActiveRecord::Base.transaction do
submission.update! progress: :running, started_at: Time.current

submitter.submit submission
submitter = "Database::#{submission.validation.db}::Submitter".constantize.new

submission.validation.write_submission_files to: submission.dir
Rails.error.handle do
begin
submitter.submit submission
rescue => e
submission.update!(
result: :failure,
error_message: e.message
)

raise
else
submission.validation.write_submission_files to: submission.dir
submission.success!
end
end
ensure
submission.update! progress: :finished, finished_at: Time.current
end
end
end
4 changes: 2 additions & 2 deletions api/app/jobs/validate_job.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
class ValidateJob < ApplicationJob
def perform(validation)
ActiveRecord::Base.transaction do
validation.update! progress: 'running', started_at: Time.current
validation.update! progress: :running, started_at: Time.current

validator = "Database::#{validation.db}::Validator".constantize.new

Expand All @@ -25,7 +25,7 @@ def perform(validation)
raise ActiveRecord::Rollback if validation.reload.canceled?
ensure
unless validation.canceled?
validation.update! progress: 'finished', finished_at: Time.current
validation.update! progress: :finished, finished_at: Time.current
end
end
end
Expand Down
2 changes: 2 additions & 0 deletions api/app/models/submission.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ class Submission < ApplicationRecord
validate :validation_must_be_valid
validate :validation_finished_at_must_be_in_24_hours

enum :progress, %w(waiting running finished canceled).index_by(&:to_sym)
enum :result, %w(success failure).index_by(&:to_sym)
enum :visibility, %w(public private).index_by(&:to_sym), prefix: true

after_destroy do |submission|
Expand Down
13 changes: 9 additions & 4 deletions api/app/views/submissions/_submission.json.jb
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
{
id: submission.public_id,
created_at: submission.created_at,
validation: render('validations/validation', validation: submission.validation),
visibility: submission.visibility
id: submission.public_id,
created_at: submission.created_at,
started_at: submission.started_at,
finished_at: submission.finished_at,
progress: submission.progress,
result: submission.result,
error_message: submission.error_message,
validation: render('validations/validation', validation: submission.validation),
visibility: submission.visibility
}
11 changes: 11 additions & 0 deletions api/db/migrate/20240725020444_add_progress_to_submissions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class AddProgressToSubmissions < ActiveRecord::Migration[7.1]
def change
add_column :submissions, :progress, :string, null: false, default: 'waiting'
add_column :submissions, :result, :string
add_column :submissions, :error_message, :string
add_column :submissions, :started_at, :datetime
add_column :submissions, :finished_at, :datetime

change_column_default :validations, :progress, from: nil, to: 'waiting'
end
end
9 changes: 7 additions & 2 deletions api/db/schema.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions api/spec/factories/validations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@

user

db { DB.map { _1[:id] }.sample }
progress { 'waiting' }
db { DB.map { _1[:id] }.sample }

after :build do |validation|
if validation.running? || validation.finished? || validation.canceled?
Expand Down
9 changes: 9 additions & 0 deletions schema/openapi.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,15 @@ export interface components {
id: string;
/** Format: date-time */
created_at: string;
/** Format: date-time */
started_at: string | null;
/** Format: date-time */
finished_at: string | null;
/** @enum {string} */
progress: "waiting" | "running" | "finished" | "canceled";
/** @enum {string} */
result: "success" | "failure";
error_message: string | null;
validation: components["schemas"]["Validation"];
/** @enum {string} */
visibility: "public" | "private";
Expand Down
37 changes: 36 additions & 1 deletion schema/openapi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -627,7 +627,7 @@ components:
Submission:
type: object
additionalProperties: false
required: [id, created_at, validation, visibility]
required: [id, created_at, started_at, finished_at, progress, result, error_message, validation, visibility]

properties:
id:
Expand All @@ -637,6 +637,41 @@ components:
type: string
format: date-time

started_at:
type:
- string
- 'null'

format: date-time

finished_at:
type:
- string
- 'null'

format: date-time

progress:
type: string

enum:
- waiting
- running
- finished
- canceled

result:
type: string

enum:
- success
- failure

error_message:
type:
- string
- 'null'

validation:
$ref: '#/components/schemas/Validation'

Expand Down
37 changes: 36 additions & 1 deletion schema/openapi.yml.erb
Original file line number Diff line number Diff line change
Expand Up @@ -612,7 +612,7 @@ components:
Submission:
type: object
additionalProperties: false
required: [id, created_at, validation, visibility]
required: [id, created_at, started_at, finished_at, progress, result, error_message, validation, visibility]

properties:
id:
Expand All @@ -622,6 +622,41 @@ components:
type: string
format: date-time

started_at:
type:
- string
- 'null'

format: date-time

finished_at:
type:
- string
- 'null'

format: date-time

progress:
type: string

enum:
- waiting
- running
- finished
- canceled

result:
type: string

enum:
- success
- failure

error_message:
type:
- string
- 'null'

validation:
$ref: '#/components/schemas/Validation'

Expand Down
37 changes: 37 additions & 0 deletions web/app/components/result-badge.gts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import type { TOC } from '@ember/component/template-only';
import type { components } from 'schema/openapi';

type Result = components['schemas']['Submission']['result'];

interface Signature {
Args: {
result: Result;
};
}

const ResultBadgeComponent: TOC<Signature> = <template>
{{#if @result}}
<span class='badge {{colorClass @result}} text-capitalize'>{{@result}}</span>
{{else}}
-
{{/if}}
</template>;

export default ResultBadgeComponent;

declare module '@glint/environment-ember-loose/registry' {
export default interface Registry {
ResultBadge: typeof ResultBadgeComponent;
}
}

function colorClass(result: Exclude<Result, null>) {
switch (result) {
case 'success':
return 'text-bg-success';
case 'failure':
return 'text-bg-danger';
default:
throw new Error(result satisfies never);
}
}
16 changes: 16 additions & 0 deletions web/app/routes/submissions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ interface Params {
export default class SubmissionsIndexRoute extends Route {
@service declare currentUser: CurrentUserService;

timer?: number;

queryParams = {
page: {
refreshModel: true,
Expand Down Expand Up @@ -64,10 +66,24 @@ export default class SubmissionsIndexRoute extends Route {
};
}

afterModel(model: Model) {
if (model.submissions.some(({ progress }) => progress === 'waiting' || progress === 'running')) {
this.timer = setTimeout(() => {
this.refresh();
}, 2000);
}
}

resetController(controller: SubmissionsIndexController, isExiting: boolean) {
if (isExiting) {
controller.pageBefore = controller.page;
controller.page = 1;
}
}

deactivate() {
if (this.timer) {
clearTimeout(this.timer);
}
}
}
19 changes: 19 additions & 0 deletions web/app/routes/submissions/show.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,34 @@ import ENV from 'ddbj-repository/config/environment';
import safeFetch from 'ddbj-repository/utils/safe-fetch';

import type CurrentUserService from 'ddbj-repository/services/current-user';
import type { components } from 'schema/openapi';

type Submission = components['schemas']['Submission'];

export default class SubmissionsShowRoute extends Route {
@service declare currentUser: CurrentUserService;

timer?: number;

async model({ id }: { id: string }) {
const res = await safeFetch(`${ENV.apiURL}/submissions/${id}`, {
headers: this.currentUser.authorizationHeader,
});

return await res.json();
}

afterModel({ progress }: Submission) {
if (progress === 'waiting' || progress === 'running') {
this.timer = setTimeout(() => {
this.refresh();
}, 2000);
}
}

deactivate() {
if (this.timer) {
clearTimeout(this.timer);
}
}
}
Loading

0 comments on commit 72d54ac

Please sign in to comment.