check ids
[sgn.git] / lib / CXGN / TrackingActivity / AddTrackingIdentifier.pm
blobb92d6ed527e48e14264c365bf9aa29251adcc1e9
1 package CXGN::TrackingActivity::AddTrackingIdentifier;
3 =head1 NAME
5 CXGN::TrackingActivity::AddTrackingIdentifier - a module to add tracking identifier.
7 =head1 USAGE
10 =head1 DESCRIPTION
12 =head1 AUTHORS
14 Titima Tantikanjana (tt15@cornell.edu)
16 =cut
18 use Moose;
19 use MooseX::FollowPBP;
20 use Moose::Util::TypeConstraints;
21 use Try::Tiny;
22 use SGN::Model::Cvterm;
23 use Data::Dumper;
25 has 'schema' => (
26 is => 'rw',
27 isa => 'DBIx::Class::Schema',
28 required => 1,
31 has 'phenome_schema' => (
32 is => 'rw',
33 isa => 'DBIx::Class::Schema',
34 required => 1,
37 has 'tracking_identifier' => (
38 isa => 'Str',
39 is => 'rw',
40 required => 1,
43 has 'material' => (
44 isa =>'Str',
45 is => 'rw',
46 required => 1,
49 has 'project_id' => (
50 isa => 'Int',
51 is => 'rw',
52 required => 1,
55 has 'user_id' => (
56 isa => 'Int',
57 is => 'rw',
58 required => 1,
61 sub store {
62 my $self = shift;
63 my $schema = $self->get_schema();
64 my $phenome_schema = $self->get_phenome_schema();
65 my $tracking_identifier = $self->get_tracking_identifier();
66 my $material_name = $self->get_material();
67 my $project_id = $self->get_project_id();
68 my $user_id = $self->get_user_id();
69 my $error;
71 my $tracking_identifier_cvterm_id = SGN::Model::Cvterm->get_cvterm_row($schema, 'tracking_identifier', 'stock_type')->cvterm_id();
72 my $material_of_cvterm_id = SGN::Model::Cvterm->get_cvterm_row($schema, 'material_of', 'stock_relationship')->cvterm_id();
73 my $experiment_type_cvterm_id = SGN::Model::Cvterm->get_cvterm_row($schema, 'tracking_activity', 'experiment_type')->cvterm_id();
74 my $project_location_cvterm_id = SGN::Model::Cvterm->get_cvterm_row($schema, 'project location', 'project_property')->cvterm_id();
75 my $geolocation_rs = $schema->resultset("Project::Projectprop")->find({project_id => $project_id, type_id => $project_location_cvterm_id});
77 my $tracking_id;
79 my $check_id_rs = $schema->resultset("Stock::Stock")->search({
80 uniquename => $tracking_identifier,
81 });
82 if ($check_id_rs->count() > 0){
83 return { error => "$tracking_identifier already used in the database! " };
86 my $coderef = sub {
87 my $tracking_id_rs = $schema->resultset("Stock::Stock")->create({
88 name => $tracking_identifier,
89 uniquename => $tracking_identifier,
90 type_id => $tracking_identifier_cvterm_id,
91 });
92 $tracking_id = $tracking_id_rs->stock_id();
94 my $material_rs = $schema->resultset("Stock::Stock")->find({ uniquename => $material_name});
95 my $tracking_material = $schema->resultset("Stock::StockRelationship")->find_or_create({
96 subject_id => $material_rs->stock_id,
97 object_id => $tracking_id,
98 type_id => $material_of_cvterm_id,
99 });
101 my $experiment = $schema->resultset('NaturalDiversity::NdExperiment')->create({
102 nd_geolocation_id => $geolocation_rs->value,
103 type_id => $experiment_type_cvterm_id,
106 $experiment->find_or_create_related('nd_experiment_stocks' , {
107 stock_id => $tracking_id,
108 type_id => $experiment_type_cvterm_id,
111 $experiment->find_or_create_related('nd_experiment_projects', {
112 project_id => $project_id,
117 my $error;
118 try {
119 $schema->txn_do($coderef);
120 } catch {
121 $error = $_;
124 if ($error) {
125 return { error => "Error creating a tracking identifier: $error\n" };
128 $phenome_schema->resultset("StockOwner")->find_or_create({
129 stock_id => $tracking_id,
130 sp_person_id => $user_id,
133 return {tracking_id => $tracking_id};
139 #######
141 #######