Guest User

v1

a guest
Nov 29th, 2016
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 85.34 KB | None | 0 0
  1. <?php
  2.  
  3. use Olivemedia\Video\VideoService as Service;
  4.  
  5. include_once( APPPATH . 'libraries/d2r/Mobile_API_Controller.php');
  6.  
  7. class V1 extends Mobile_API_Controller {
  8.  
  9.     public function __construct(){
  10.         parent::__construct();
  11.     }
  12.  
  13.     public function member_login_get() {
  14.  
  15.         try {
  16.  
  17.             $member = Member::find_valid_registered_by_id(
  18.                 $this->member_id
  19.             );
  20.  
  21.             return $this->response(array('success' => 'true', 'result' => array(
  22.                 'id' => $member->id,
  23.                 'organisation_id' => $member->organisation_id,
  24.                 'username' => $member->user->username,
  25.                 'first_name' => $member->first_name,
  26.                 'last_name' => $member->last_name,
  27.                 'email' => $member->email,
  28.                 'mobile_number' => $member->mobile_number,
  29.                 'mobile_country_code' => $member->country_code,
  30.                 'created_at' => $member->created_at,
  31.                 'updated_at' => $member->updated_at,
  32.                 'is_verified' => ($member->is_verified()) ? 1 : 0,
  33.                 'verification_stage' => $member->verification_stage,
  34.                 'is_trainer' => $member->is_trainer,
  35.                 'is_team_admin' => $member->is_team_admin,
  36.                 'is_admin' => $member->is_admin,
  37.                 'is_super_admin' => $member->is_super_admin,
  38.                 'is_site_manager' => $member->is_site_manager,
  39.                 'image_key' => rtrim(strtr(base64_encode($member->image_key), '+/', '-_'), '=')
  40.  
  41.             )));
  42.  
  43.         } catch (Exception $e) {
  44.             return $this->error_response($e->getMessage());
  45.         }
  46.         exit;
  47.     }
  48.  
  49.     public function member_details_post() {
  50.  
  51.         try {
  52.  
  53.             if(!isset($this->_post_json_args->first_name)) $this->_post_json_args->first_name = null;
  54.             if(!isset($this->_post_json_args->last_name)) $this->_post_json_args->last_name = null;
  55.             if(!isset($this->_post_json_args->email)) $this->_post_json_args->email = null;
  56.             if(!isset($this->_post_json_args->username)) $this->_post_json_args->username = null;
  57.  
  58.             $member = Member::find_valid_registered_by_id(
  59.                 $this->member_id
  60.             );
  61.  
  62.             $member->first_name = $this->_post_json_args->first_name;
  63.             $member->last_name = $this->_post_json_args->last_name;
  64.             if($this->_post_json_args->email != $member->email) $member->email = $this->_post_json_args->email;
  65.  
  66.             if($member->is_registered()) {
  67.                 if($member->user->username != $this->_post_json_args->username) $member->user->username = $this->_post_json_args->username;
  68.                 $member->user->save();
  69.             }
  70.  
  71.             $member->save();
  72.  
  73.             return $this->response(array("success" => "true"));
  74.  
  75.         } catch (Exception $e) {
  76.             return $this->error_response($e->getMessage());
  77.         }
  78.  
  79.     }
  80.  
  81.     public function member_password_post() {
  82.  
  83.         try {
  84.  
  85.             if(!isset($this->_post_json_args->password)) $this->_post_json_args->password = null;
  86.             if(!isset($this->_post_json_args->passwordconfirm)) $this->_post_json_args->passwordconfirm = null;
  87.  
  88.             $member = Member::find_valid_registered_by_id(
  89.                 $this->member_id
  90.             );
  91.  
  92.             $member->user->reset_password(
  93.                 $this->_post_json_args->password,
  94.                 $this->_post_json_args->passwordconfirm
  95.             );
  96.  
  97.             $member->user->save();
  98.  
  99.             return $this->response(array("success" => "true"));
  100.  
  101.         } catch (Exception $e) {
  102.             return $this->error_response($e->getMessage());
  103.         }
  104.  
  105.  
  106.  
  107.     }
  108.  
  109.     public function member_mobile_post() {
  110.  
  111.         try {
  112.  
  113.             if(!isset($this->_post_json_args->mobile_number)) $this->_post_json_args->mobile_number = null;
  114.             if(!isset($this->_post_json_args->mobile_country_code)) $this->_post_json_args->mobile_country_code = null;
  115.  
  116.             $member = Member::find_valid_registered_by_id(
  117.                 $this->member_id
  118.             );
  119.  
  120.             $mobile_number = $this->_post_json_args->mobile_country_code.$this->_post_json_args->mobile_number;
  121.  
  122.             $mobile_number = urldecode($mobile_number);
  123.             $mobile_number = trim($mobile_number);
  124.  
  125.             $member->mobile_number = $mobile_number;
  126.             $member->country_code = $this->_post_json_args->mobile_country_code;
  127.             $member->save();
  128.  
  129.             return $this->response(array("success" => "true"));
  130.  
  131.         } catch (Exception $e) {
  132.             return $this->error_response($e->getMessage());
  133.         }
  134.  
  135.  
  136.  
  137.     }
  138.  
  139.     public function member_image_post() {
  140.  
  141.         try {
  142.  
  143.             if(!isset($this->_post_json_args->imagedata)) return $this->error_response("Image data required");
  144.  
  145.             $member = Member::find_valid_registered_by_id(
  146.                 $this->member_id
  147.             );
  148.  
  149.             $member_image_temp = new SplFileObject('/tmp/member_'.$this->member_id.'_image.jpeg', 'w+');
  150.  
  151.             $member_image_temp->fwrite(base64_decode($this->_post_json_args->imagedata));
  152.  
  153.             $s3_client = \Aws\S3\S3Client::factory(array(
  154.                 'key'    => AWS_S3_ACCESS_KEY,
  155.                 'secret' => AWS_S3_SECRET_KEY,
  156.                 'region' => 'us-east-1'
  157.             ));
  158.  
  159.             $key_base_path = $member->base_path;
  160.  
  161.             $hash = md5(uniqid(rand(), true));
  162.  
  163.             $key = $key_base_path.$hash.'.jpeg';
  164.  
  165.             $key = new AcademyHQ\S3\Key($key);
  166.  
  167.             $image_upload = new AcademyHQ\S3\Image\Factory($s3_client, AWS_S3_ASSETS_BUCKET);
  168.  
  169.             $image = $image_upload->create($key, $member_image_temp);
  170.  
  171.             $member->image_key = $image->get_reference()->get_key()->to_string();
  172.  
  173.             $member->save();
  174.  
  175.             $member_image_temp = null;
  176.  
  177.             unlink('/tmp/member_'.$this->member_id.'_image.jpeg');
  178.  
  179.             return $this->response(array("success" => "true", "image_key" => rtrim(strtr(base64_encode($member->image_key), '+/', '-_'), '=')));
  180.  
  181.         } catch (Exception $e) {
  182.             //return $this->error_response($e->getMessage());//DEV returns all aws errors as well (these should not go to the app.
  183.             return $this->error_response("There was an error accepting your image please contact us. : code(009)");
  184.         }
  185.  
  186.     }
  187.  
  188.     public function member_token_post() {
  189.  
  190.         if(!isset($this->_post_json_args->device_token)) $this->_post_json_args->device_token = null;
  191.         if(!isset($this->_post_json_args->is_ios)) $this->_post_json_args->is_ios = 0;
  192.         if(!isset($this->_post_json_args->is_android)) $this->_post_json_args->is_android = 0;
  193.  
  194.         try {
  195.  
  196.             $tokenNew = false;
  197.  
  198.             $member = Member::find_valid_registered_by_id(
  199.                 $this->member_id
  200.             );
  201.  
  202.             $token = PushToken::find_by_device_token(
  203.                 $this->_post_json_args->device_token
  204.             );
  205.  
  206.             if($token == null) {
  207.  
  208.                 $tokenNew = true;
  209.  
  210.                 $token = PushToken::create(array(
  211.                     'device_token' => $this->_post_json_args->device_token,
  212.                     'is_ios' => $this->_post_json_args->is_ios,
  213.                     'is_android' => $this->_post_json_args->is_android,
  214.                 ));
  215.             }
  216.  
  217.             $token->set_member($member);
  218.  
  219.             $token->save();
  220.  
  221.             return $this->response(array("success" => "true", "token_new" => $tokenNew, "member_id" => $member->id ));
  222.  
  223.         } catch (Exception $e) {
  224.             return $this->error_response($e->getMessage());
  225.         }
  226.  
  227.  
  228.     }
  229.  
  230.     public function org_details_get() {
  231.  
  232.         try {
  233.  
  234.             $organisation = Organisation::find_valid_by_id(
  235.                 $this->current_organisation_id
  236.             );
  237.  
  238.             return $this->response(array('success' => 'true', 'result' => array(
  239.                 'id' => $organisation->id,
  240.                 'name' => $organisation->name,
  241.                 'branding_hex' => $organisation->branding_hex,
  242.                 'branding_hex_dark' => Util::mobile_branding_darken($organisation->branding_hex, -50),
  243.                 'currency' => $organisation->currency,
  244.                 'language' => $organisation->language,
  245.                 'mobile_validation_enabled' => $organisation->mobile_validation_enabled,
  246.                 'mobile_validation_skippable' => $organisation->mobile_validation_skippable,
  247.                 'created_at' => $organisation->created_at,
  248.                 'updated_at' => $organisation->updated_at,
  249.                 'image_key' => rtrim(strtr(base64_encode($organisation->branding_logo_key), '+/', '-_'), '=')
  250.             )));
  251.  
  252.         } catch (Exception $e) {
  253.             return $this->error_response($e->getMessage());
  254.         }
  255.  
  256.     }
  257.  
  258.     public function documents_get($from = null, $limit = null, $page_number = 1) {
  259.  
  260.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  261.         if($from == null) {
  262.             $from = date("Y-m-d H:i:s", 0);
  263.         } else {
  264.             $from = urldecode($from);
  265.         }
  266.  
  267.         $from = date("Y-m-d H:i:s", strtotime($from)+1);
  268.  
  269.         try {
  270.  
  271.             $organisation = Organisation::find_valid_by_id(
  272.                 $this->current_organisation_id
  273.             );
  274.  
  275.             $page = new Page();
  276.             $page->set_per_page($limit);
  277.             $page->set_current_page_number($page_number);
  278.  
  279.             $document_search = new DocumentSearch();
  280.             $document_search
  281.                 ->set_page($page)
  282.                 ->set_date_filter('updated')
  283.                 ->set_date_from($from)
  284.                 ->set_organisation($organisation);
  285.  
  286.             $document_search->execute();
  287.  
  288.             $results = array();
  289.  
  290.             $l = $document_search->get_row_per_current_page();
  291.  
  292.             for($i = 0; $i < $l; $i++){
  293.  
  294.                 $document = $document_search[$i];
  295.  
  296.                 $document_details = array(
  297.                     'id' => $document->id,
  298.                     'name' => $document->name,
  299.                     'created_at' => $document->created_at,
  300.                     'updated_at' => $document->updated_at,
  301.                     'is_deleted' => $document->is_deleted,
  302.                     'is_required' => $document->is_required,
  303.                     'is_active' => $document->is_active
  304.                 );
  305.  
  306.                 array_push($results, $document_details);
  307.  
  308.             }
  309.  
  310.             return $this->response(array('success' => 'true', 'total_rows' => (int) $l, 'result' => $results));
  311.  
  312.         } catch (Exception $e) {
  313.             return $this->error_response($e->getMessage());
  314.         }
  315.  
  316.     }
  317.  
  318.     public function document_get($document_id) {
  319.  
  320.         try {
  321.  
  322.             $document = Document::find_valid_by_id(
  323.                 $document_id
  324.             );
  325.  
  326.             return $this->response(array('success' => 'true', 'results' => array(
  327.                 'id' => $document->id,
  328.                 'name' => $document->name,
  329.                 'created_at' => $document->created_at,
  330.                 'updated_at' => $document->updated_at,
  331.                 'is_deleted' => $document->is_deleted,
  332.                 'is_required' => $document->is_required,
  333.                 'is_active' => $document->is_active
  334.             )));
  335.  
  336.         } catch (Exception $e) {
  337.             return $this->error_response($e->getMessage());
  338.         }
  339.  
  340.     }
  341.  
  342.     public function search_member_name_get($first = null, $last= null, $limit = null, $page_number = 1) {
  343.  
  344.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  345.  
  346.         try {
  347.  
  348.             $organisation = Organisation::find_valid_by_id(
  349.                 $this->current_organisation_id
  350.             );
  351.  
  352.             $organisationFactory = new OrganisationFactory();
  353.             $organisation = $organisationFactory->get($organisation);
  354.  
  355.             $page = new Page();
  356.             $page->set_per_page($limit);
  357.             $page->set_current_page_number($page_number);
  358.  
  359.             $member_search = new MemberFilteredSearch();
  360.             $member_search->set_page($page);
  361.             $member_search->set_organisation($organisation);
  362.             $member_search->set_is_deleted(0);
  363.             $member_search->set_is_active(1);
  364.  
  365.             if($first != null) {
  366.                 $member_search->set_first_name($first);
  367.             }
  368.  
  369.             if($last != null) {
  370.                 $member_search->set_last_name($last);
  371.             }
  372.  
  373.             $member_search->execute();
  374.  
  375.             $results = array();
  376.  
  377.             $l = $member_search->get_row_per_current_page();
  378.  
  379.             for($i = 0; $i < $l; $i++){
  380.  
  381.                 $member = $member_search[$i];
  382.  
  383.                 $member_details = array(
  384.                     'id' => $member->id,
  385.                     'first_name' => $member->first_name,
  386.                     'last_name' => $member->last_name,
  387.                 );
  388.  
  389.                 array_push($results, $member_details);
  390.             }
  391.  
  392.             return $this->response(array('success' => 'true', 'total_rows' => (int) $l, 'result' => $results));
  393.  
  394.         } catch (Exception $e) {
  395.             return $this->error_response($e->getMessage());
  396.         }
  397.  
  398.     }
  399.  
  400.     public function search_member_mobile_number_get($mobile = null, $limit = null, $page_number = 1) {
  401.  
  402.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  403.  
  404.         try {
  405.  
  406.             $organisation = Organisation::find_valid_by_id(
  407.                 $this->current_organisation_id
  408.             );
  409.  
  410.             $organisationFactory = new OrganisationFactory();
  411.             $organisation = $organisationFactory->get($organisation);
  412.  
  413.             $page = new Page();
  414.             $page->set_per_page($limit);
  415.             $page->set_current_page_number($page_number);
  416.  
  417.             $member_search = new MemberFilteredSearch();
  418.             $member_search->set_page($page)
  419.                 ->set_role('learner')
  420.                 ->set_mobile_number($mobile)
  421.                 ->set_organisation($organisation);
  422.  
  423.             $member_search->execute();
  424.  
  425.             $results = array();
  426.  
  427.             $l = $member_search->get_row_per_current_page();
  428.  
  429.             for($i = 0; $i < $l; $i++){
  430.  
  431.                 $member = $member_search[$i];
  432.  
  433.                 $member_details = array(
  434.                     'id' => $member->id,
  435.                     'first_name' => $member->first_name,
  436.                     'last_name' => $member->last_name,
  437.                 );
  438.  
  439.                 array_push($results, $member_details);
  440.             }
  441.  
  442.             return $this->response(array('success' => 'true', 'total_rows' => (int) $l, 'result' => $results));
  443.  
  444.         } catch (Exception $e) {
  445.             return $this->error_response($e->getMessage());
  446.         }
  447.  
  448.     }
  449.  
  450.     public function verify_mobile_post() {
  451.  
  452.         if(file_exists('vendor/twilio/sdk/Services/Twilio.php'))
  453.         {
  454.             require_once('vendor/twilio/sdk/Services/Twilio.php');
  455.         }
  456.         else {
  457.             return $this->error_response("Error sending SMS please contact us. : code(012) ");
  458.         }
  459.  
  460.         try {
  461.  
  462.             if(!isset($this->_post_json_args->mobile_number)) $this->_post_json_args->mobile_number = null;
  463.             if(!isset($this->_post_json_args->mobile_country_code)) $this->_post_json_args->mobile_country_code = null;
  464.  
  465.             $member = Member::find_valid_registered_by_id(
  466.                 $this->member_id
  467.             );
  468.  
  469.             $mobile_number = $this->_post_json_args->mobile_country_code.$this->_post_json_args->mobile_number;
  470.  
  471.             $validation = MemberValidationCode::create(array(
  472.                 'member' => $member,
  473.                 'mobile_number' => $mobile_number,
  474.                 'country_code' => $this->_post_json_args->mobile_country_code
  475.             ));
  476.  
  477.             $client = new Twilio\Rest\Client(ACCOUNT_SID_FOR_SMS, AUTH_TOKEN_FOR_SMS);
  478.             $message = $client->messages->create(
  479.                 $mobile_number,
  480.                 array(
  481.                     'from' => TWILIO_SMS_NUMBER,
  482.                     'body' => "Your AcademyHQ verification code is ".$validation->validation_code
  483.                 )
  484.             );
  485.  
  486.             $validation->sms_id = $message->sid;
  487.             $validation->save();
  488.  
  489.             $member->verification_stage = 1;
  490.             $member->save();
  491.  
  492.             return $this->response(array("success" => "true"));
  493.  
  494.         } catch (Exception $e) {
  495.             return $this->error_response($e->getMessage());
  496.         }
  497.  
  498.     }
  499.  
  500.     public function verify_code_post() {
  501.  
  502.         try {
  503.  
  504.             if(!isset($this->_post_json_args->verifycode)) $this->_post_json_args->verifycode = null;
  505.  
  506.             $member = Member::find_valid_registered_by_id(
  507.                 $this->member_id
  508.             );
  509.  
  510.             $verifycode = MemberValidationCode::find_by_validation_code(
  511.                 $this->_post_json_args->verifycode
  512.             );
  513.  
  514.             if($verifycode != null) {
  515.                 if($verifycode->member_id == $member->id) {
  516.  
  517.                     $mobile_number = urldecode($verifycode->mobile_number);
  518.                     $mobile_number = trim($mobile_number);
  519.  
  520.                     $member->verification_stage = 2;
  521.                     $member->mobile_number = $mobile_number;
  522.                     $member->country_code = $verifycode->country_code;
  523.                     $member->save();
  524.  
  525.                     $verifycode->complete();
  526.  
  527.                     return $this->response(array("success" => "true"));
  528.  
  529.                 }
  530.             }
  531.  
  532.             return $this->error_response("Verify code incorrect");
  533.         } catch (Exception $e) {
  534.             return $this->error_response($e->getMessage());
  535.         }
  536.     }
  537.  
  538.     public function verify_image_post() {
  539.  
  540.         try {
  541.  
  542.             if(!isset($this->_post_json_args->imagedata)) return $this->error_response("Image data required");
  543.  
  544.             $member = Member::find_valid_registered_by_id(
  545.                 $this->member_id
  546.             );
  547.  
  548.             $member_image_temp = new SplFileObject('/tmp/member_'.$this->member_id.'_image.jpeg', 'w+');
  549.  
  550.             $member_image_temp->fwrite(base64_decode($this->_post_json_args->imagedata));
  551.  
  552.             $s3_client = \Aws\S3\S3Client::factory(array(
  553.                 'key'    => AWS_S3_ACCESS_KEY,
  554.                 'secret' => AWS_S3_SECRET_KEY,
  555.                 'region' => 'us-east-1'
  556.             ));
  557.  
  558.             $key_base_path = $member->base_path;
  559.  
  560.             $hash = md5(uniqid(rand(), true));
  561.  
  562.             $key = $key_base_path.$hash.'.jpeg';
  563.  
  564.             $key = new AcademyHQ\S3\Key($key);
  565.  
  566.             $image_upload = new AcademyHQ\S3\Image\Factory($s3_client, AWS_S3_ASSETS_BUCKET);
  567.  
  568.             $image = $image_upload->create($key, $member_image_temp);
  569.  
  570.             $member->image_key = $image->get_reference()->get_key()->to_string();
  571.  
  572.             $member->verification_stage = 3;
  573.             $member->save();
  574.  
  575.             $member_image_temp = null;
  576.  
  577.             unlink('/tmp/member_'.$this->member_id.'_image.jpeg');
  578.  
  579.             return $this->response(array("success" => "true", "image_key" => rtrim(strtr(base64_encode($member->image_key), '+/', '-_'), '=')));
  580.  
  581.         } catch (Exception $e) {
  582.             //return $this->error_response($e->getMessage());//DEV returns all aws errors as well (these should not go to the app.
  583.             return $this->error_response("There was an error accepting your image please contact us. : code(010)");
  584.  
  585.         }
  586.  
  587.  
  588.  
  589.     }
  590.  
  591.     public function verify_state_get() {
  592.  
  593.         try {
  594.  
  595.             $member = Member::find_valid_registered_by_id(
  596.                 $this->member_id
  597.             );
  598.  
  599.             $member->verification_stage = 4;
  600.             $member->is_verified = 1;
  601.             $member->save();
  602.  
  603.             return $this->response(array("success" => "true"));
  604.  
  605.         } catch (Exception $e) {
  606.             return $this->error_response($e->getMessage());
  607.         }
  608.  
  609.     }
  610.  
  611.     public function enrolment_get($enrolment_id) {
  612.  
  613.         try {
  614.  
  615.             $enrolment = Enrolment::find_valid_by_id(
  616.                 $enrolment_id
  617.             );
  618.  
  619.             $course = $enrolment->course;
  620.  
  621.             $module_details = array();
  622.  
  623.             if($enrolment->course->has_modules()) {
  624.  
  625.                 $module = $enrolment->course->get_first_module();
  626.                 $module_details = array(
  627.                     'id'    => $module->id,
  628.                     'created_at' => $module->created_at,
  629.                     'updated_at' => $module->updated_at,
  630.                     'course_id' => $module->course_id,
  631.                     'name'  => $module->name,
  632.                     'description_message'  => $module->description,//description is a reserved key on iOS hence the miss match of keys here
  633.                     'completion_message' => $module->completion_message,
  634.                     'duration' => $module->duration,
  635.                     'typical_time' => $module->typical_time,
  636.                     'is_active' => $module->is_active,
  637.                     'is_deleted' => $module->is_deleted,
  638.                 );
  639.             }
  640.  
  641.             $course_details = array(
  642.                 'id' => $course->id,
  643.                 'created_at' => $course->created_at,
  644.                 'updated_at' => $course->updated_at,
  645.                 'name'  => $course->name,
  646.                 'is_active' => $course->is_active,
  647.                 'is_deleted' => $course->is_deleted,
  648.                 'module_count' => $course->module_count,
  649.                 'has_certificate'  => $course->has_certificate,
  650.                 'expiry_months' => $course->expiry_months,
  651.                 'image_key' => rtrim(strtr(base64_encode($course->image_key), '+/', '-_'), '='),
  652.                 'module' => $module_details
  653.  
  654.             );
  655.  
  656.             return $this->response(array('success' => 'true', 'result' => array(
  657.                 'id' => $enrolment->id,
  658.                 'created_at' => $enrolment->created_at,
  659.                 'updated_at' => $enrolment->updated_at,
  660.                 'started_at' => $enrolment->started_at,
  661.                 'completed_at' => $enrolment->completed_at,
  662.                 'succeeded_at' => $enrolment->succeeded_at,
  663.                 'failed_at' => $enrolment->failed_at,
  664.                 'reminded_at' => $enrolment->reminded_at,
  665.                 'last_resumed_at' => $enrolment->last_resumed_at,
  666.  
  667.                 'progress' => $enrolment->progress,
  668.                 'time_spent' => $enrolment->time_spent,
  669.                 'score' => $enrolment->score,
  670.  
  671.                 'course_id' => $enrolment->course_id,
  672.  
  673.                 'is_started' => $enrolment->is_started,
  674.                 'is_completed' => $enrolment->is_completed,
  675.                 'is_successful' => $enrolment->is_successful,
  676.                 'is_failed' => $enrolment->is_failed,
  677.                 'is_manual' => $enrolment->is_manual,
  678.                 'is_active' => $enrolment->is_active,
  679.                 'is_deleted' => $enrolment->is_deleted,
  680.  
  681.                 'expire_at' => $enrolment->expire_at,
  682.                 'is_expired' => $enrolment->is_expired,
  683.  
  684.                 'course' => $course_details,
  685.  
  686.             )));
  687.  
  688.         } catch (Exception $e) {
  689.             return $this->error_response($e->getMessage());
  690.         }
  691.  
  692.     }
  693.  
  694.     public function enrolments_get($from = null, $limit = null, $page_number = 1) {
  695.  
  696.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  697.         if($from == null) {
  698.             $from = date("Y-m-d H:i:s", 0);
  699.         } else {
  700.             $from = urldecode($from);
  701.         }
  702.  
  703.         $from = date("Y-m-d H:i:s", strtotime($from)+1);
  704.  
  705.         try {
  706.  
  707.             $member = Member::find_valid_registered_by_id(
  708.                 $this->member_id
  709.             );
  710.  
  711.             $organisation = Organisation::find_valid_by_id(
  712.                 $this->current_organisation_id
  713.             );
  714.  
  715.             $page = new Page();
  716.             $page->set_per_page($limit);
  717.             $page->set_current_page_number($page_number);
  718.  
  719.             $enrolment_search = new EnrolmentMobileFilteredSearch();
  720.             $enrolment_search->set_page($page)
  721.                 ->set_order('updated_at', 'DESC')
  722.                 ->set_type('standard')
  723.                 ->set_date_filter('updated')
  724.                 ->set_date_from($from)
  725.                 ->set_member($member)
  726.                 ->set_organisation($organisation);
  727.  
  728.             $enrolment_search->execute();
  729.  
  730.             $results = array();
  731.  
  732.             $l = $enrolment_search->get_row_per_current_page();
  733.  
  734.             for($i = 0; $i < $l; $i++){
  735.  
  736.                 $enrolment = $enrolment_search[$i];
  737.  
  738.                 $course = $enrolment->course;
  739.  
  740.                 $module_details = array();
  741.  
  742.                 if($enrolment->course->has_modules()) {
  743.  
  744.                     $module = $enrolment->course->get_first_module();
  745.                     $module_details = array(
  746.                         'id'    => $module->id,
  747.                         'created_at' => $module->created_at,
  748.                         'updated_at' => $module->updated_at,
  749.                         'course_id' => $module->course_id,
  750.                         'name'  => $module->name,
  751.                         'description_message'  => $module->description,//description is a reserved key on iOS hence the miss match of keys here
  752.                         'completion_message' => $module->completion_message,
  753.                         'duration' => $module->duration,
  754.                         'typical_time' => $module->typical_time,
  755.                         'is_active' => $module->is_active,
  756.                         'is_deleted' => $module->is_deleted,
  757.                     );
  758.                 }
  759.                 if($course->standard != null) {
  760.                     $course_mobile = $course->standard->is_mobile_enabled;
  761.                 } else {
  762.                     $course_mobile = 0;
  763.                 }
  764.  
  765.                 $course_details = array(
  766.                     'id' => $course->id,
  767.                     'created_at' => $course->created_at,
  768.                     'updated_at' => $course->updated_at,
  769.                     'name'  => $course->name,
  770.                     'is_active' => $course->is_active,
  771.                     'is_deleted' => $course->is_deleted,
  772.                     'module_count' => $course->module_count,
  773.                     'has_certificate'  => $course->has_certificate,
  774.                     'expiry_months' => $course->expiry_months,
  775.                     'image_key' => rtrim(strtr(base64_encode($course->image_key), '+/', '-_'), '='),
  776.                     'module' => $module_details,
  777.                     'is_mobile_enabled' => $course_mobile
  778.  
  779.                 );
  780.  
  781.                 $enrolment_details = array(
  782.                     'id' => $enrolment->id,
  783.                     'created_at' => $enrolment->created_at,
  784.                     'updated_at' => $enrolment->updated_at,
  785.                     'started_at' => $enrolment->started_at,
  786.                     'completed_at' => $enrolment->completed_at,
  787.                     'succeeded_at' => $enrolment->succeeded_at,
  788.                     'failed_at' => $enrolment->failed_at,
  789.                     'reminded_at' => $enrolment->reminded_at,
  790.                     'last_resumed_at' => $enrolment->last_resumed_at,
  791.  
  792.                     'progress' => $enrolment->progress,
  793.                     'time_spent' => $enrolment->time_spent,
  794.                     'score' => $enrolment->score,
  795.  
  796.                     'course_id' => $enrolment->course_id,
  797.  
  798.                     'is_started' => $enrolment->is_started,
  799.                     'is_completed' => $enrolment->is_completed,
  800.                     'is_successful' => $enrolment->is_successful,
  801.                     'is_failed' => $enrolment->is_failed,
  802.                     'is_manual' => $enrolment->is_manual,
  803.                     'is_active' => $enrolment->is_active,
  804.                     'is_deleted' => $enrolment->is_deleted,
  805.  
  806.                     'expire_at' => $enrolment->expire_at,
  807.                     'is_expired' => $enrolment->is_expired,
  808.  
  809.                     'course' => $course_details,
  810.  
  811.                 );
  812.  
  813.                 array_push($results, $enrolment_details);
  814.  
  815.             }
  816.  
  817.             return $this->response(array('success' => 'true', 'total_rows' => (int) $l, 'result' => $results));
  818.  
  819.         } catch (Exception $e) {
  820.             return $this->error_response($e->getMessage());
  821.         }
  822.  
  823.     }
  824.  
  825.     public function enrolment_launch_get($enrolment_id) {
  826.  
  827.         if(file_exists(APPPATH . 'libraries/ScormCloud/ScormEngineService.php'))
  828.         {
  829.             require_once(APPPATH . 'libraries/ScormCloud/ScormEngineService.php');
  830.         }
  831.         else {
  832.             return $this->error_response("Error loading SCORM library please contact us. : code(013)");
  833.         }
  834.  
  835.         $scorm_api = new ScormEngineService(
  836.             SCORM_API_URL,
  837.             SCORM_APP_ID,
  838.             SCORM_SECRET,
  839.             'rusticisoftware.phplibrary.1.2.1'
  840.         );
  841.  
  842.         try {
  843.  
  844.             $enrolment = Enrolment::find_valid_by_id_and_member_id(
  845.                 $enrolment_id,
  846.                 $this->member_id
  847.             );
  848.  
  849.             if($enrolment->standard){
  850.  
  851.                 $standard_enrolment = $enrolment->standard;
  852.  
  853.                 if(!$enrolment->is_started()){
  854.  
  855.                     $registration = $standard_enrolment->start();
  856.                 } else {
  857.  
  858.                     $registration = $standard_enrolment->resume();
  859.                 }
  860.  
  861.             } else {
  862.                 return $this->error_response("Non standard enrolment");
  863.             }
  864.  
  865.             $registration_scorm = RegistrationScorm::find_valid_by_registration_id($registration->id);
  866.  
  867.             if(!$registration_scorm->is_started()) {
  868.                 $registration_scorm->start($scorm_api);
  869.             }
  870.  
  871.             $registration_scorm->resume($scorm_api);
  872.  
  873.             $callback_url = 'http://courseexitcallback/';
  874.  
  875.             $launch_url = $registration_scorm->get_launch_url($scorm_api, $callback_url);
  876.  
  877.             return $this->response(array('success' => 'true', 'result' => array("scorm_url" => urldecode($launch_url))));
  878.  
  879.         } catch (Exception $e) {
  880.             return $this->error_response($e->getMessage());
  881.         }
  882.  
  883.     }
  884.  
  885.     private function generate_certificate($enrolment_id) {
  886.  
  887.         try {
  888.             $enrolment = Enrolment::find_valid_by_id($enrolment_id);
  889.  
  890.             $metadata = array(
  891.                 'name' => $enrolment->member->member_info,
  892.                 'course' => $enrolment->course->name,
  893.                 $enrolment->succeeded_at
  894.             );
  895.  
  896.             $ukata_client = new UkataClient(UKATA_API_KEY);
  897.             $response = $ukata_client->get_certificate_url($metadata);
  898.  
  899.             $bucket_key = Certificate::store($response, $enrolment);
  900.             $enrolment->standard->certificate_key = $bucket_key;
  901.             $enrolment->standard->save();
  902.  
  903.             return true;
  904.         } catch (Exception $e) {
  905.  
  906.             print_r($e->getMessage());
  907.             exit();
  908.         }
  909.     }
  910.  
  911.     public function enrolment_close_get($enrolment_id) {
  912.  
  913.         if(file_exists(APPPATH . 'libraries/ScormCloud/ScormEngineService.php'))
  914.         {
  915.             require_once(APPPATH . 'libraries/ScormCloud/ScormEngineService.php');
  916.         }
  917.         else {
  918.             return $this->error_response("Error loading SCORM library please contact us. : code(014)");
  919.         }
  920.  
  921.         $scorm_api = new ScormEngineService(
  922.             SCORM_API_URL,
  923.             SCORM_APP_ID,
  924.             SCORM_SECRET,
  925.             'rusticisoftware.phplibrary.1.2.1'
  926.         );
  927.  
  928.         try {
  929.  
  930.             $enrolment = Enrolment::find_valid_by_id_and_member_id(
  931.                 $enrolment_id,
  932.                 $this->member_id
  933.             );
  934.  
  935.             if($enrolment->standard){
  936.  
  937.                 $standard_enrolment = $enrolment->standard;
  938.  
  939.             } else {
  940.                 return $this->error_response("Non standard enrolment");
  941.             }
  942.  
  943.             unset($enrolment);
  944.  
  945.             $registration = $standard_enrolment->current_registration;
  946.             $registration_scorm = RegistrationScorm::find_valid_by_registration_id($registration->id);
  947.  
  948.             $scorm_registration_service = $scorm_api->getRegistrationService();
  949.             $registration_summary = $scorm_registration_service->GetRegistrationSummary($registration_scorm->scorm_id);
  950.  
  951.             $registration_scorm->regen($registration_summary);
  952.             $registration_scorm->enrolment->regen($scorm_api);
  953.  
  954.             if($registration_scorm->enrolment->is_successful()) {
  955.  
  956.                 if($registration_scorm->enrolment->course->has_certificate()) {
  957.  
  958.                     $certificate_generator = $registration_scorm->enrolment->course->certificate->certificate_generator;
  959.  
  960.                     $certificate_info = $certificate_generator->store($registration_scorm->enrolment);
  961.  
  962.                     $member_enrolment_certificate = MemberEnrolmentCertificate::create(array(
  963.                         'member' => $registration_scorm->enrolment->member,
  964.                         'certificate' => $registration_scorm->enrolment->course->certificate,
  965.                         'enrolment_succeeded_at' => $registration_scorm->enrolment->succeeded_at,
  966.                         'expire_at' => $registration_scorm->enrolment->expire_at,
  967.                         'certificate_key' => $certificate_info['key']
  968.                     ));
  969.                 }              
  970.             }
  971.  
  972.             $next_registration = null;
  973.  
  974.             if(!$registration_scorm->module->is_last_module()) {
  975.                 $next_registration = $registration_scorm->enrolment->current_registration;
  976.                 $next_registration = $next_registration->id;
  977.             }
  978.  
  979.             $enrolment = Enrolment::find_valid_by_id_and_member_id(
  980.                 $enrolment_id,
  981.                 $this->member_id
  982.             );
  983.  
  984.             $enrolment_details = array(
  985.                 'id' => $enrolment->id,
  986.                 'created_at' => $enrolment->created_at,
  987.                 'updated_at' => $enrolment->updated_at,
  988.                 'started_at' => $enrolment->started_at,
  989.                 'completed_at' => $enrolment->completed_at,
  990.                 'succeeded_at' => $enrolment->succeeded_at,
  991.                 'failed_at' => $enrolment->failed_at,
  992.                 'reminded_at' => $enrolment->reminded_at,
  993.                 'last_resumed_at' => $enrolment->last_resumed_at,
  994.  
  995.                 'progress' => $enrolment->progress,
  996.                 'time_spent' => $enrolment->time_spent,
  997.                 'score' => $enrolment->score,
  998.  
  999.                 'course_id' => $enrolment->course_id,
  1000.  
  1001.                 'is_started' => $enrolment->is_started,
  1002.                 'is_completed' => $enrolment->is_completed,
  1003.                 'is_successful' => $enrolment->is_successful,
  1004.                 'is_failed' => $enrolment->is_failed,
  1005.                 'is_manual' => $enrolment->is_manual,
  1006.                 'is_active' => $enrolment->is_active,
  1007.                 'is_deleted' => $enrolment->is_deleted,
  1008.  
  1009.                 'expire_at' => $enrolment->expire_at,
  1010.                 'is_expired' => $enrolment->is_expired
  1011.             );
  1012.            
  1013.             return $this->response(array('success' => 'true', 'result' => $enrolment_details, 'next_registration' => $next_registration));
  1014.  
  1015.         } catch (Exception $e) {
  1016.             return $this->error_response($e->getMessage());
  1017.         }
  1018.  
  1019.     }
  1020.  
  1021.     public function licenses_get($from = null, $limit = null, $page_number = 1) {
  1022.  
  1023.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  1024.         if($from == null) {
  1025.             $from = date("Y-m-d H:i:s", 0);
  1026.         } else {
  1027.             $from = urldecode($from);
  1028.         }
  1029.  
  1030.         $from = date("Y-m-d H:i:s", strtotime($from)+1);
  1031.  
  1032.         try {
  1033.  
  1034.             $organisation = Organisation::find_valid_by_id(
  1035.                 $this->current_organisation_id
  1036.             );
  1037.  
  1038.             $page = new Page();
  1039.             $page->set_per_page($limit);
  1040.             $page->set_current_page_number($page_number);
  1041.  
  1042.             $license_search = new LicenseMobileFilteredSearch();
  1043.             $license_search->set_page($page)
  1044.                 ->set_order('updated_at', 'DESC')
  1045.                 ->set_date_updated_from($from)
  1046.                 ->set_organisation($organisation);
  1047.  
  1048.             $license_search->execute();
  1049.  
  1050.             $results = array();
  1051.  
  1052.             $l = $license_search->get_row_per_current_page();
  1053.  
  1054.             for($i = 0; $i < $l; $i++){
  1055.  
  1056.                 $license = $license_search[$i];
  1057.  
  1058.                 $course = $license->course_standard->course;
  1059.  
  1060.                 $module_details = array();
  1061.  
  1062.                 if($license->course_standard != null) {
  1063.                     $course_mobile = $license->course_standard->is_mobile_enabled;
  1064.                 } else {
  1065.                     $course_mobile = 0;
  1066.                 }
  1067.  
  1068.                 if($course_mobile == 0 ){
  1069.                     $non_mobile_inject = "This course is not mobile enabled. You will need to login via the web to take this course.";
  1070.                 } else {
  1071.                     $non_mobile_inject = "";
  1072.                 }
  1073.  
  1074.                 if($license->course_standard->has_modules()) {
  1075.  
  1076.                     $module = $license->course_standard->course->get_first_module();
  1077.                     $module_details = array(
  1078.                         'id'    => $module->id,
  1079.                         'created_at' => $module->created_at,
  1080.                         'updated_at' => $module->updated_at,
  1081.                         'course_id' => $module->course_id,
  1082.                         'name'  => $module->name,
  1083.                         'description_message'  => $non_mobile_inject.$module->description,//description is a reserved key on iOS hence the miss match of keys here
  1084.                         'completion_message' => $module->completion_message,
  1085.                         'duration' => $module->duration,
  1086.                         'typical_time' => $module->typical_time,
  1087.                         'is_active' => $module->is_active,
  1088.                         'is_deleted' => $module->is_deleted,
  1089.                     );
  1090.                 }
  1091.  
  1092.                 $course_details = array(
  1093.                     'id' => $course->id,
  1094.                     'created_at' => $course->created_at,
  1095.                     'updated_at' => $course->updated_at,
  1096.                     'name'  => $course->name,
  1097.                     'is_active' => $course->is_active,
  1098.                     'is_deleted' => $course->is_deleted,
  1099.                     'module_count' => $course->module_count,
  1100.                     'has_certificate'  => $course->has_certificate,
  1101.                     'expiry_months' => $course->expiry_months,
  1102.                     'image_key' => rtrim(strtr(base64_encode($course->image_key), '+/', '-_'), '='),
  1103.                     'module' => $module_details,
  1104.                     'is_mobile_enabled' => $course_mobile
  1105.                 );
  1106.  
  1107.                 $license_details = array(
  1108.                     'id' => $license->id,
  1109.                     'created_at' => $license->created_at,
  1110.                     'updated_at' => $license->updated_at,
  1111.  
  1112.                     'course_id' => $license->course_standard->course->id,
  1113.  
  1114.                     'is_active' => $license->is_active,
  1115.                     'is_deleted' => $license->is_deleted,
  1116.                     'is_purchasable' => $license->is_purchasable,
  1117.                     'is_auto_enrollable' => $license->is_auto_enrollable,
  1118.                     'quantity' => $license->quantity,
  1119.                     'used' => $license->used,
  1120.                     'available' => $license->available,
  1121.                     'price' => $license->price,
  1122.                     'course' => $course_details
  1123.  
  1124.                 );
  1125.  
  1126.                 array_push($results, $license_details);
  1127.  
  1128.             }
  1129.  
  1130.             return $this->response(array('success' => 'true', 'total_rows' => (int) $l, 'result' => $results));
  1131.  
  1132.         } catch (Exception $e) {
  1133.             return $this->error_response($e->getMessage());
  1134.         }
  1135.  
  1136.     }
  1137.  
  1138.     public function purchase_license_post($license_id){
  1139.  
  1140.         if(!isset($this->_post_json_args->token)) {
  1141.             //return $this->error_response("There has been an issue processing your payment : code(008)");
  1142.             $this->_post_json_args->token = "";
  1143.         }
  1144.  
  1145.         if(!isset($this->_post_json_args->new_card)) $this->_post_json_args->new_card = 0;
  1146.  
  1147.         $token = $this->_post_json_args->token;
  1148.         $new_card = $this->_post_json_args->new_card;
  1149.  
  1150.         Stripe::setApiKey(PAYMENTS_STRIPE_PRIVATE_KEY);
  1151.  
  1152.         try {
  1153.  
  1154.             $member = Member::find_valid_registered_by_id(
  1155.                 $this->member_id
  1156.             );
  1157.  
  1158.             $organisation = Organisation::find_valid_by_id(
  1159.                 $this->current_organisation_id
  1160.             );
  1161.  
  1162.             $license = License::find_by_id_and_organisation_id(
  1163.                 $license_id,
  1164.                 $organisation->id
  1165.             );
  1166.  
  1167.             //check license is purchasable
  1168.  
  1169.             if($member->customer != null) {
  1170.  
  1171.                 $stripe_customer = Stripe_Customer::retrieve($member->customer->stripe_id);
  1172.  
  1173.                 //echo("existing customer");
  1174.  
  1175.                 if($token != "" && $new_card == 1) {
  1176.  
  1177.                     //echo("new card");
  1178.  
  1179.                     $stripe_customer->card = $token;
  1180.                     $stripe_customer->save();
  1181.  
  1182.                 }
  1183.  
  1184.             } else if($new_card == 0 && $token == "") {
  1185.  
  1186.                 return $this->error_response("Your existing card has been removed from ours records please use the pay with a new card form. If your existing card is still valid please feel free to re-enter those details.");
  1187.  
  1188.             } else {
  1189.                 //echo("new customer");
  1190.  
  1191.                 if($token == "") {
  1192.                     return $this->error_response("There has been an issue processing your payment : code(008)");
  1193.                 }
  1194.                 //using token to construct new customer.
  1195.                 $stripe_customer = Stripe_Customer::create(array(
  1196.                         "card" => $token,
  1197.                         "description" => $member->email)
  1198.                 );
  1199.  
  1200.                 $customer = new Customer(array(
  1201.                     'stripe_id' => $stripe_customer->id
  1202.                 ));
  1203.  
  1204.                 $customer->set_member($member);
  1205.  
  1206.                 $customer->save();
  1207.  
  1208.             }
  1209.  
  1210.             $member_licenses_order = new MemberMobileLicenseOrder(
  1211.                 $organisation,
  1212.                 $license,
  1213.                 $member
  1214.             );
  1215.  
  1216.             $member_licenses_order->check_purchasable();
  1217.  
  1218.             Stripe_Charge::create(array(
  1219.                "amount" => $member_licenses_order->get_total_in_cents(), # amount in cents, again
  1220.               "currency" => $member_licenses_order->get_currency(),
  1221.                "customer" => $stripe_customer->id,
  1222.                "description" => "Mobile purchasing ".$member_licenses_order->get_total_items()." course(s)")
  1223.             );
  1224.  
  1225.             $newenrolment = $member_licenses_order->purchase();
  1226.  
  1227.             $emailBody = $this->load->view(
  1228.                 'emails/purchaser/purchaser_mobile_receipt',
  1229.                 array(
  1230.                     'member_licenses_order' => $member_licenses_order,
  1231.                 ),
  1232.                 true
  1233.             );
  1234.                 try {
  1235.                     Email::push(array(
  1236.                         'type' => 'payment-receipt',
  1237.                         'from' => PAYMENTS_RECEIPT_EMAIL_FROM,
  1238.                         'to' => $member->email,
  1239.                         'subject' => "New Payment Receipt on the ".$organisation->name." Academy",
  1240.                         'body' => $emailBody,
  1241.                     ));
  1242.  
  1243.                     Email::push(array(
  1244.                         'type' => 'payment-receipt',
  1245.                         'from' => PAYMENTS_RECEIPT_EMAIL_FROM,
  1246.                         'to' => PAYMENTS_RECEIPT_EMAIL_FROM,
  1247.                         'subject' => "New Payment Receipt on the ".$organisation->name." Academy",
  1248.                         'body' => $emailBody,
  1249.                     ));
  1250.  
  1251.                 } catch (exception $recipt_error) {
  1252.  
  1253.                 }
  1254.  
  1255.             return $this->response(array("success" => "true", "id" => $newenrolment->enrolment_id));
  1256.  
  1257.         } catch(Stripe_CardError $e) {
  1258.             // Since it's a decline, Stripe_CardError will be caught
  1259.             $body = $e->getJsonBody();
  1260.             $err  = $body['error'];
  1261.  
  1262.             /*print('Status is:' . $e->getHttpStatus() . "\n");
  1263.             print('Type is:' . $err['type'] . "\n");
  1264.             print('Code is:' . $err['code'] . "\n");
  1265.             // param is '' in this case
  1266.             print('Param is:' . $err['param'] . "\n");
  1267.             print('Message is:' . $err['message'] . "\n");*/
  1268.  
  1269.             return $this->error_response($err['message']);
  1270.  
  1271.  
  1272.         } catch (Stripe_InvalidRequestError $e) {
  1273.             // Invalid parameters were supplied to Stripe's API
  1274.             //return $this->error_response("There has been an issue processing your payment : code(004) ".$e->getMessage());
  1275.             return $this->error_response("There has been an issue processing your payment : code(004) ");
  1276.  
  1277.         } catch (Stripe_AuthenticationError $e) {
  1278.             // Authentication with Stripe's API failed
  1279.             // (maybe you changed API keys recently)
  1280.             //return $this->error_response("There has been an issue processing your payment : code(005) ".$e->getMessage());
  1281.             return $this->error_response("There has been an issue processing your payment : code(005) ");
  1282.  
  1283.         } catch (Stripe_ApiConnectionError $e) {
  1284.             // Network communication with Stripe failed
  1285.             //return $this->error_response("There has been an issue processing your payment : code(006) ".$e->getMessage());
  1286.             return $this->error_response("There has been an issue processing your payment : code(006) ");
  1287.  
  1288.         } catch (Stripe_Error $e) {
  1289.             // Display a very generic error to the user,
  1290.             //return $this->error_response("There has been an issue processing your payment : code(007) ".$e->getMessage());
  1291.             return $this->error_response("There has been an issue processing your payment : code(007) ");
  1292.  
  1293.         } catch (Exception $e) {
  1294.             // Something else happened, completely unrelated to Stripe
  1295.             return $this->error_response($e->getMessage());
  1296.         }
  1297.  
  1298.     }
  1299.  
  1300.     public function certificates_get($from = null, $limit = null, $page_number = 1) {
  1301.  
  1302.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  1303.         if($from == null) {
  1304.             $from = date("Y-m-d H:i:s", 0);
  1305.         } else {
  1306.             $from = urldecode($from);
  1307.         }
  1308.  
  1309.         $from = date("Y-m-d H:i:s", strtotime($from)+1);
  1310.  
  1311.         try {
  1312.  
  1313.             $member = Member::find_valid_registered_by_id(
  1314.                 $this->member_id
  1315.             );
  1316.  
  1317.             $organisation = Organisation::find_valid_by_id(
  1318.                 $this->current_organisation_id
  1319.             );
  1320.  
  1321.             $page = new Page();
  1322.             $page->set_per_page($limit);
  1323.             $page->set_current_page_number($page_number);
  1324.  
  1325.             $cert_search = new EnrolmentMobileFilteredSearch();
  1326.             $cert_search->set_page($page)
  1327.                 ->set_order('updated_at', 'DESC')
  1328.                 ->set_is_completed(1)
  1329.                 ->set_is_successful(1)
  1330.                 ->set_date_filter('updated')
  1331.                 ->set_date_from($from)
  1332.                 ->set_member($member)
  1333.                 ->set_organisation($organisation);
  1334.  
  1335.             $cert_search->execute();
  1336.  
  1337.             $results = array();
  1338.  
  1339.             $l = $cert_search->get_row_per_current_page();
  1340.  
  1341.             for($i = 0; $i < $l; $i++){
  1342.  
  1343.                 $cert = $cert_search[$i];
  1344.  
  1345.                 $course = $cert->course;
  1346.  
  1347.                 $course_details = array(
  1348.                     'id' => $course->id,
  1349.                     'created_at' => $course->created_at,
  1350.                     'updated_at' => $course->updated_at,
  1351.                     'name'  => $course->name,
  1352.                     'is_active' => $course->is_active,
  1353.                     'is_deleted' => $course->is_deleted,
  1354.                     'module_count' => $course->module_count,
  1355.                     'has_certificate'  => $course->has_certificate,
  1356.                     'expiry_months' => $course->expiry_months,
  1357.                     'image_key' => rtrim(strtr(base64_encode($course->image_key), '+/', '-_'), '=')
  1358.  
  1359.                 );
  1360.  
  1361.                 $cert_details = array(
  1362.                     'id' => $cert->id,
  1363.                     'created_at' => $cert->created_at,
  1364.                     'updated_at' => $cert->updated_at,
  1365.                     'started_at' => $cert->started_at,
  1366.                     'completed_at' => $cert->completed_at,
  1367.                     'succeeded_at' => $cert->succeeded_at,
  1368.  
  1369.                     'is_started' => $cert->is_started,
  1370.                     'is_completed' => $cert->is_completed,
  1371.                     'is_successful' => $cert->is_successful,
  1372.                     'is_failed' => $cert->is_failed,
  1373.                     'is_manual' => $cert->is_manual,
  1374.                     'is_active' => $cert->is_active,
  1375.                     'is_deleted' => $cert->is_deleted,
  1376.  
  1377.                     'expire_at' => $cert->expire_at,
  1378.                     'is_expired' => $cert->is_expired,
  1379.  
  1380.                     'course_id' => $cert->course_id,
  1381.                     'course' => $course_details,
  1382.  
  1383.                 );
  1384.  
  1385.                 array_push($results, $cert_details);
  1386.  
  1387.             }
  1388.  
  1389.             return $this->response(array('success' => 'true', 'total_rows' => (int) $l, 'result' => $results));
  1390.  
  1391.         } catch (Exception $e) {
  1392.             return $this->error_response($e->getMessage());
  1393.         }
  1394.  
  1395.     }
  1396.  
  1397.     private function generate_enrolment_certificate($enrolment) {
  1398.  
  1399.         try {
  1400.             $certificate_generator = $enrolment->course->certificate->certificate_generator;
  1401.  
  1402.             $certificate_info = $certificate_generator->store($enrolment);
  1403.  
  1404.             $member_enrolment_certificate = MemberEnrolmentCertificate::create(array(
  1405.                 'member' => $enrolment->member,
  1406.                 'certificate' => $enrolment->course->certificate,
  1407.                 'enrolment_succeeded_at' => $enrolment->succeeded_at,
  1408.                 'expire_at' => $enrolment->expire_at,
  1409.                 'certificate_key' => $certificate_info['key']
  1410.             ));
  1411.             return $member_enrolment_certificate->member_certificate;
  1412.         } catch (Exception $e) {
  1413.  
  1414.             print_r($e->getMessage());
  1415.             exit();
  1416.         }
  1417.     }
  1418.  
  1419.     private function generate_practical_session_certificate($enrolment) {
  1420.         try {
  1421.  
  1422.             $ioc = new IOCContainer();
  1423.             $certificate_generator = $ioc->bind_generator('DefaultStandardCertificate');
  1424.  
  1425.             $certificate_info = $certificate_generator->store($enrolment);
  1426.  
  1427.             $member_practical_session_certificate = MemberPracticalSessionCertificate::create(array(
  1428.                 'member' => $enrolment->member,
  1429.                 'course' => $enrolment->course,
  1430.                 'certificate_key' => $certificate_info['key'],
  1431.                 'enrolment_succeeded_at' => $enrolment->succeeded_at,
  1432.                 'expire_at' => $enrolment->expire_at
  1433.             ));
  1434.  
  1435.             return $member_practical_session_certificate->member_certificate;
  1436.  
  1437.         } catch (Exception $e) {
  1438.             print_r($e->getMessage());
  1439.             exit();
  1440.         }
  1441.     }
  1442.  
  1443.     public function certificate_image_get($enrolment_id) {
  1444.  
  1445.         try {
  1446.  
  1447.             $enrolment = Enrolment::find_undeleted_by_id($enrolment_id);
  1448.             $enrolment->check_is_not_successful();
  1449.             $enrolment->check_is_not_completed();
  1450.  
  1451.             if($enrolment->offline) {
  1452.  
  1453.                 $this->offline_certificate_image_get($enrolment_id);
  1454.             } else {
  1455.  
  1456.                 $member_certificate = MemberCertificate::find_by_member_id_and_course_id(
  1457.                     $enrolment->member->id,
  1458.                     $enrolment->course->id
  1459.                 );
  1460.  
  1461.                 if(!$member_certificate) {
  1462.  
  1463.                     if($enrolment->is_successful && $enrolment->course->has_certificate()) {
  1464.                         $member_certificate = $this->generate_enrolment_certificate($enrolment);
  1465.                     } elseif($enrolment->is_successful() && $enrolment->standard && $enrolment->standard->practical_session_complete) {
  1466.                         $member_certificate = $this->generate_practical_session_certificate($enrolment);
  1467.                     }
  1468.                 }
  1469.  
  1470.                 if($member_certificate->practical_session_certificate) {
  1471.                     $ioc = new IOCContainer();
  1472.                     $certificate_generator = $ioc->bind_generator('DefaultStandardCertificate');
  1473.                 } elseif ($member_certificate->enrolment_certificate) {
  1474.                     $certificate_generator = $member_certificate->enrolment_certificate->certificate->certificate_generator;
  1475.                 }
  1476.  
  1477.                 $certificate_generator->retrieve($member_certificate, "D");
  1478.             }
  1479.         } catch (Exception $e) {
  1480.             return $this->error_response("There has been an error creating your certificate please contact us.: code(015)");
  1481.         }
  1482.     }
  1483.  
  1484.     private function offline_certificate_image_get($enrolment_id, $method = 'attachment') {
  1485.  
  1486.         try {
  1487.  
  1488.             $enrolment_offline = EnrolmentOffline::find_valid_by_enrolment_id($enrolment_id);
  1489.  
  1490.             $member_certificate = MemberCertificate::find_by_member_id_and_course_id(
  1491.                 $enrolment_offline->member->id,
  1492.                 $enrolment_offline->course->id
  1493.             );
  1494.  
  1495.             $certificate_generator = $member_certificate->enrolment_certificate->certificate->certificate_generator;
  1496.  
  1497.             $certificate_generator->retrieve($member_certificate, "D");
  1498.  
  1499.         } catch(Exception $e) {
  1500.  
  1501.             return $this->error_response("There has been an error creating your certificate please contact us.: code(015)");
  1502.         }
  1503.     }
  1504.  
  1505.     public function videos_categories_get($from = null, $limit = null, $page_number = 1) {
  1506.  
  1507.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  1508.         if($from == null) {
  1509.             $from = date("Y-m-d H:i:s", 0);
  1510.         } else {
  1511.             $from = urldecode($from);
  1512.         }
  1513.  
  1514.         $from = date("Y-m-d H:i:s", strtotime($from)+1);
  1515.  
  1516.         try {
  1517.  
  1518.             $organisation = Organisation::find_valid_by_id(
  1519.                 $this->current_organisation_id
  1520.             );
  1521.  
  1522.             $page = new Page();
  1523.             $page->set_per_page($limit);
  1524.             $page->set_current_page_number($page_number);
  1525.  
  1526.             $video_categories_search = new VideoCategorySearch();
  1527.             $video_categories_search->set_page($page)
  1528.                 ->set_date_filter('updated')
  1529.                 ->set_date_from($from)
  1530.                 ->set_organisation($organisation);
  1531.  
  1532.             $video_categories_search->execute();
  1533.  
  1534.             $results = array();
  1535.  
  1536.             $l = $video_categories_search->get_row_per_current_page();
  1537.  
  1538.             for($i = 0; $i < $l; $i++){
  1539.  
  1540.                 $video_category = $video_categories_search[$i];
  1541.  
  1542.                 $video_category_result = array(
  1543.                     'id' => $video_category->id,
  1544.                     'created_at' => $video_category->created_at,
  1545.                     'updated_at' => $video_category->updated_at,
  1546.  
  1547.                     'name'      => $video_category->name,
  1548.  
  1549.                     'is_active' => $video_category->is_active,
  1550.                     'is_deleted' => $video_category->is_deleted,
  1551.  
  1552.                 );
  1553.  
  1554.                 array_push($results, $video_category_result);
  1555.  
  1556.             }
  1557.  
  1558.             return $this->response(array('success' => 'true', 'total_rows' => (int) $l, 'result' => $results));
  1559.  
  1560.         } catch (Exception $e) {
  1561.             return $this->error_response($e->getMessage());
  1562.         }
  1563.  
  1564.     }
  1565.  
  1566.     public function videos_get($from = null, $limit = null, $page_number = 1) {
  1567.  
  1568.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  1569.         if($from == null) {
  1570.             $from = date("Y-m-d H:i:s", 0);
  1571.         } else {
  1572.             $from = urldecode($from);
  1573.         }
  1574.  
  1575.         $from = date("Y-m-d H:i:s", strtotime($from)+1);
  1576.  
  1577.         try {
  1578.  
  1579.             $client = Service::factory(array(
  1580.                 'client_id' => VIDEO_SERVICE_CLIENT_ID,
  1581.                 'client_secret_key' =>  VIDEO_SERVICE_CLIENT_SECRET_KEY,
  1582.             ));
  1583.  
  1584.             $organisation = Organisation::find_valid_by_id(
  1585.                 $this->current_organisation_id
  1586.             );
  1587.  
  1588.             $page = new Page();
  1589.             $page->set_per_page($limit);
  1590.             $page->set_current_page_number($page_number);
  1591.  
  1592.             $videos_search = new VideoSearch();
  1593.             $videos_search->set_page($page)
  1594.                 ->set_date_filter('updated')
  1595.                 ->set_date_from($from)
  1596.                 ->set_is_uploaded(1)
  1597.                 ->set_organisation($organisation);
  1598.  
  1599.             $videos_search->execute();
  1600.  
  1601.             $results = array();
  1602.  
  1603.             $l = $videos_search->get_row_per_current_page();
  1604.  
  1605.             for($i = 0; $i < $l; $i++){
  1606.  
  1607.                 $video = $videos_search[$i];
  1608.  
  1609.                 try {
  1610.  
  1611.                     $olive_media_video = Service::find_by_id($client, $video->olive_video_id);
  1612.  
  1613.                     $video_url = $olive_media_video['data']['hls_url'];
  1614.                     $renditions = $olive_media_video['data']['mp4_renditions'];
  1615.  
  1616.                     $deleted =  $video->is_deleted;
  1617.  
  1618.                 } catch(Exception $e) {
  1619.  
  1620.                     $video_url = "";
  1621.                     $renditions = "";
  1622.  
  1623.                     $deleted = 1;
  1624.                 }
  1625.  
  1626.                 $video = array(
  1627.                         'id' => $video->id,
  1628.                         'created_at' => $video->created_at,
  1629.                         'updated_at' => $video->updated_at,
  1630.                         'published_at' => $video->published_at,
  1631.                         'video_category_id' => $video->video_category_id,
  1632.  
  1633.                         'name' => $video->name,
  1634.                         'description' => $video->description,
  1635.                         'olive_id' => $video->olive_video_id,
  1636.  
  1637.                         'is_uploaded' => $video->is_uploaded,
  1638.                         'is_rendition_complete' => $video->is_rendition_complete,
  1639.                         'is_published' => $video->is_published,
  1640.                         'is_active' => $video->is_active,
  1641.                         'is_deleted' => $deleted,
  1642.  
  1643.                         'video_url' => $video_url,
  1644.                         'renditions' => $renditions
  1645.  
  1646.                         );
  1647.  
  1648.                     array_push($results, $video);
  1649.  
  1650.  
  1651.             }
  1652.  
  1653.             return $this->response(array('success' => 'true', 'total_rows' => (int) $l, 'result' => $results));
  1654.  
  1655.         } catch (Exception $e) {
  1656.             return $this->error_response($e->getMessage());
  1657.         }
  1658.  
  1659.     }
  1660.  
  1661.     public function audits_get($from = null, $limit = null, $page_number = 1) {
  1662.  
  1663.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  1664.         if($from == null) {
  1665.             $from = date("Y-m-d H:i:s", 0);
  1666.         } else {
  1667.             $from = urldecode($from);
  1668.         }
  1669.  
  1670.         $from = date("Y-m-d H:i:s", strtotime($from)+1);
  1671.  
  1672.         try {
  1673.  
  1674.             $organisation = Organisation::find_valid_by_id(
  1675.                 $this->current_organisation_id
  1676.             );
  1677.  
  1678.             $page = new Page();
  1679.             $page->set_per_page($limit);
  1680.             $page->set_current_page_number($page_number);
  1681.  
  1682.             $audit_search = new AuditFormSearch();
  1683.             $audit_search
  1684.                 ->set_page($page)
  1685.                 ->set_date_filter('updated')
  1686.                 ->set_is_published(1)
  1687.                 ->set_date_from($from)
  1688.                 ->set_organisation($organisation);
  1689.  
  1690.             $audit_search->execute();
  1691.  
  1692.             $results = array();
  1693.  
  1694.             $l = $audit_search->get_row_per_current_page();
  1695.  
  1696.             for($i = 0; $i < $l; $i++){
  1697.  
  1698.                 $audit = $audit_search[$i];
  1699.  
  1700.                 $audit_details = array(
  1701.                     'id' => $audit->id,
  1702.                     'name' => $audit->name,
  1703.                     'created_at' => $audit->created_at,
  1704.                     'updated_at' => $audit->updated_at,
  1705.                     'is_deleted' => $audit->is_deleted,
  1706.                     'is_published' => $audit->is_published,
  1707.                     'is_active' => $audit->is_active
  1708.                 );
  1709.  
  1710.                 array_push($results, $audit_details);
  1711.  
  1712.             }
  1713.  
  1714.             return $this->response(array('success' => 'true', 'total_rows' => (int) $audit_search->total_rows, 'result' => $results));
  1715.  
  1716.         } catch (Exception $e) {
  1717.             return $this->error_response($e->getMessage());
  1718.         }
  1719.  
  1720.     }
  1721.  
  1722.     public function member_documents_get($from = null, $limit = null, $page_number = 1) {
  1723.  
  1724.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  1725.         if($from == null) {
  1726.             $from = date("Y-m-d H:i:s", 0);
  1727.         } else {
  1728.             $from = urldecode($from);
  1729.         }
  1730.  
  1731.         $from = date("Y-m-d H:i:s", strtotime($from)+1);
  1732.  
  1733.         try {
  1734.  
  1735.             $member = Member::find_valid_registered_by_id(
  1736.                 $this->member_id
  1737.             );
  1738.  
  1739.             $organisation = Organisation::find_valid_by_id(
  1740.                 $this->current_organisation_id
  1741.             );
  1742.  
  1743.             $page = new Page();
  1744.             $page->set_per_page($limit);
  1745.             $page->set_current_page_number($page_number);
  1746.  
  1747.             $document_search = new MemberDocumentSearch();
  1748.             $document_search->set_page($page)
  1749.                 ->set_date_filter('updated')
  1750.                 ->set_date_from($from)
  1751.                 ->set_member($member);
  1752.  
  1753.             $document_search->execute();
  1754.  
  1755.             $results = array();
  1756.  
  1757.             $l = $document_search->get_row_per_current_page();
  1758.  
  1759.             for($i = 0; $i < $l; $i++){
  1760.  
  1761.                 $member_document = $document_search[$i];
  1762.  
  1763.                 $document = $member_document->document;
  1764.  
  1765.                 $document_details = array(
  1766.                     'id' => $document->id,
  1767.                     'name' => $document->name,
  1768.                     'created_at' => $document->created_at,
  1769.                     'updated_at' => $document->updated_at,
  1770.                     'is_deleted' => $document->is_deleted,
  1771.                     'is_required' => $document->is_required,
  1772.                     'is_active' => $document->is_active
  1773.                 );
  1774.  
  1775.                 $member_document_details = array(
  1776.                     'id' => $member_document->id,
  1777.                     'created_at' => $member_document->created_at,
  1778.                     'updated_at' => $member_document->updated_at,
  1779.                     'is_deleted' => $member_document->is_deleted,
  1780.                     'is_active' => $member_document->is_active,
  1781.                     'is_expired' => $member_document->is_expired,
  1782.  
  1783.                     'expires_at' => $member_document->expires_at,
  1784.  
  1785.                     'document_key' => rtrim(strtr(base64_encode($member_document->document_key), '+/', '-_'), '='),
  1786.  
  1787.                     'document_id' => $member_document->document_id,
  1788.                     'document' => $document_details
  1789.  
  1790.                 );
  1791.  
  1792.                 array_push($results, $member_document_details);
  1793.  
  1794.             }
  1795.  
  1796.             return $this->response(array('success' => 'true', 'total_rows' => (int) $l, 'result' => $results));
  1797.  
  1798.         } catch (Exception $e) {
  1799.             return $this->error_response($e->getMessage());
  1800.         }
  1801.     }
  1802.  
  1803.     public function member_document_post() {
  1804.  
  1805.         if(!isset($this->_post_json_args->document_id)) $this->_post_json_args->document_id = null;
  1806.         if(!isset($this->_post_json_args->expires_at)) $this->_post_json_args->expires_at = null;
  1807.  
  1808.         try {
  1809.  
  1810.             $member = Member::find_valid_registered_by_id(
  1811.                 $this->member_id
  1812.             );
  1813.  
  1814.             $document = Document::find_valid_by_id(
  1815.                 $this->_post_json_args->document_id
  1816.             );
  1817.  
  1818.             $member_document = MemberDocument::create(array(
  1819.                 'member' => $member,
  1820.                 'expires_at' => $this->_post_json_args->expires_at,
  1821.                 'document' => $document
  1822.             ));
  1823.  
  1824.             $member_document->save();
  1825.  
  1826.             return $this->response(array("success" => "true", "id" => $member_document->id));
  1827.  
  1828.         } catch (Exception $e) {
  1829.             return $this->error_response("There has been an error creating your certificate please contact us.: code(016)");
  1830.             //return $this->error_response($e->getMessage());
  1831.         }
  1832.  
  1833.     }
  1834.  
  1835.     public function member_document_image_post($member_document_id) {
  1836.  
  1837.         if(!isset($this->_post_json_args->imagedata)) return $this->error_response("Image data required");
  1838.  
  1839.         try {
  1840.  
  1841.             $member = Member::find_valid_registered_by_id(
  1842.                 $this->member_id
  1843.             );
  1844.  
  1845.             $member_document = MemberDocument::find_valid_by_id(
  1846.                 $member_document_id
  1847.             );
  1848.  
  1849.             if($member_document->member_id != $this->member_id) return $this->error_response("This document does not belong to the current user.");
  1850.  
  1851.             $member_document_image_temp = new SplFileObject('/tmp/member_document_'.$this->member_id.'_image.jpeg', 'w+');
  1852.  
  1853.             $member_document_image_temp->fwrite(base64_decode($this->_post_json_args->imagedata));
  1854.  
  1855.             $s3_client = \Aws\S3\S3Client::factory(array(
  1856.                 'key'    => AWS_S3_ACCESS_KEY,
  1857.                 'secret' => AWS_S3_SECRET_KEY,
  1858.                 'region' => 'us-east-1'
  1859.             ));
  1860.  
  1861.             $key_base_path = $member->base_path;
  1862.  
  1863.             $hash = md5(uniqid(rand(), true));
  1864.  
  1865.             $key = $key_base_path.$hash.'.jpeg';
  1866.  
  1867.             $key = new AcademyHQ\S3\Key($key);
  1868.  
  1869.             $image_upload = new AcademyHQ\S3\Image\Factory($s3_client, AWS_S3_ASSETS_BUCKET);
  1870.  
  1871.             $image = $image_upload->create($key, $member_document_image_temp);
  1872.  
  1873.             $member_document->document_key = $image->get_reference()->get_key()->to_string();
  1874.  
  1875.             $member_image_temp = null;
  1876.  
  1877.             unlink('/tmp/member_document_'.$this->member_id.'_image.jpeg');
  1878.  
  1879.             $member_document->save();
  1880.  
  1881.             return $this->response(array("success" => "true", "document_key" => rtrim(strtr(base64_encode($member_document->document_key), '+/', '-_'), '=')));
  1882.  
  1883.         } catch (Exception $e) {
  1884.             //return $this->error_response($e->getMessage());//DEV returns all aws errors as well (these should not go to the app.
  1885.             return $this->error_response("There was an error accepting your image please contact us. : code(008)");
  1886.         }
  1887.  
  1888.     }
  1889.  
  1890.     public function member_audits_get($from = null, $limit = null, $page_number = 1) {
  1891.  
  1892.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  1893.         if($from == null) {
  1894.             $from = date("Y-m-d H:i:s", 0);
  1895.         } else {
  1896.             $from = urldecode($from);
  1897.         }
  1898.  
  1899.         $from = date("Y-m-d H:i:s", strtotime($from)+1);
  1900.  
  1901.         try {
  1902.  
  1903.             $member = Member::find_valid_registered_by_id(
  1904.                 $this->member_id
  1905.             );
  1906.  
  1907.             $organisation = Organisation::find_valid_by_id(
  1908.                 $this->current_organisation_id
  1909.             );
  1910.  
  1911.             $page = new Page();
  1912.             $page->set_per_page($limit);
  1913.             $page->set_current_page_number($page_number);
  1914.  
  1915.             $member_audit_search = new MemberAuditFormSearch();
  1916.             $member_audit_search->set_page($page)
  1917.                 ->set_date_filter('updated')
  1918.                 ->set_is_submitted(1)
  1919.                 ->set_date_from($from)
  1920.                 ->set_member($member);
  1921.  
  1922.             $member_audit_search->execute();
  1923.  
  1924.             $results = array();
  1925.  
  1926.             $l = $member_audit_search->get_row_per_current_page();
  1927.  
  1928.             for($i = 0; $i < $l; $i++){
  1929.  
  1930.                 $member_audit = $member_audit_search[$i];
  1931.  
  1932.                 $audit = $member_audit->audit_form;
  1933.  
  1934.                 $audit_details = array(
  1935.                     'id' => $audit->id,
  1936.                     'name' => $audit->name,
  1937.                     'created_at' => $audit->created_at,
  1938.                     'updated_at' => $audit->updated_at,
  1939.                     'is_deleted' => $audit->is_deleted,
  1940.                     'is_published' => $audit->is_published,
  1941.                     'is_active' => $audit->is_active
  1942.                 );
  1943.  
  1944.                 $member_audit_details = array(
  1945.                     'id' => $member_audit->id,
  1946.                     'created_at' => $member_audit->created_at,
  1947.                     'updated_at' => $member_audit->updated_at,
  1948.                     'submitted_at' => $member_audit->submitted_at,
  1949.                     'is_deleted' => $member_audit->is_deleted,
  1950.                     'is_active' => $member_audit->is_active,
  1951.                     'is_submitted' => $member_audit->is_submitted,
  1952.  
  1953.                     'audit_id' => $member_audit->audit_form_id,
  1954.                     'audit' => $audit_details,
  1955.  
  1956.                 );
  1957.  
  1958.                 array_push($results, $member_audit_details);
  1959.  
  1960.             }
  1961.  
  1962.             return $this->response(array('success' => 'true', 'total_rows' => (int) $member_audit_search->total_rows, 'result' => $results));
  1963.  
  1964.         } catch (Exception $e) {
  1965.             return $this->error_response($e->getMessage());
  1966.         }
  1967.  
  1968.     }
  1969.  
  1970.     public function member_audit_get($audit_form_id) {
  1971.  
  1972.         try {
  1973.  
  1974.             $member = Member::find_valid_registered_by_id(
  1975.                 $this->member_id
  1976.             );
  1977.  
  1978.             $callback_url = "http://auditexitcallback/";
  1979.  
  1980.             $audit_form = AuditForm::find_valid_by_id($audit_form_id);
  1981.  
  1982.             $existing_member_audit_form = new MemberAuditFormSearch();
  1983.  
  1984.             $page = new Page();
  1985.             $page->set_per_page(1);
  1986.             $page->set_current_page_number(1);
  1987.  
  1988.             $existing_member_audit_form->set_page($page)
  1989.                 ->set_member($member)
  1990.                 ->set_audit_form($audit_form)
  1991.                 ->set_is_submitted(0);
  1992.             $existing_member_audit_form->execute();
  1993.  
  1994.             $l = $existing_member_audit_form->get_row_per_current_page();
  1995.  
  1996.             if($l > 0 ) {
  1997.  
  1998.                 $member_audit_form = $existing_member_audit_form[0];
  1999.  
  2000.             } else {
  2001.                 $member_audit_form = MemberAuditForm::create(array(
  2002.                     'audit_form' => $audit_form,
  2003.                     'member' => $member,
  2004.                     'form_data' => $audit_form->form_element,
  2005.                 ));
  2006.             }
  2007.  
  2008.             $member_audit_form_token = MemberAuditFormTokenFactory::create($member_audit_form);
  2009.  
  2010.             $member_audit_form->check_is_submitted();
  2011.  
  2012.             $member_audit_form_service = new \MemberAuditFormService($member_audit_form_token->token);
  2013.             $launch_url = $member_audit_form_service->get_launch_url(
  2014.                 $callback_url,
  2015.                 $member
  2016.             );
  2017.  
  2018.             return $this->response(array("success" => "true", "id" => $member_audit_form->id, "launch_url" => $launch_url));
  2019.  
  2020.         } catch(Exception $e) {
  2021.             return $this->error_response($e->getMessage());
  2022.         }
  2023.     }
  2024.  
  2025.     public function member_audit_view_get($member_audit_form_id) {
  2026.  
  2027.         try {
  2028.  
  2029.             $member = Member::find_valid_registered_by_id(
  2030.                 $this->member_id
  2031.             );
  2032.  
  2033.             $member_audit_form = MemberAuditForm::find_valid_by_id_and_member_id(
  2034.                 $member_audit_form_id,
  2035.                 $member->id
  2036.             );
  2037.  
  2038.             $callback_url = "http://auditexitcallback/";
  2039.  
  2040.             $member_audit_form->check_is_not_submitted();
  2041.  
  2042.             $member_audit_form_token = MemberAuditFormTokenFactory::create($member_audit_form);
  2043.  
  2044.             $member_audit_form_service = new \MemberAuditFormService($member_audit_form_token->token);
  2045.             $launch_url = $member_audit_form_service->get_view_url(
  2046.                 $callback_url,
  2047.                 $member
  2048.             );
  2049.  
  2050.             return $this->response(array("success" => "true", "view_url" => $launch_url));
  2051.  
  2052.         } catch(Exception $e) {
  2053.             return $this->error_response($e->getMessage());
  2054.         }
  2055.     }
  2056.  
  2057.     public function records_member_details_get($member_id) {
  2058.  
  2059.         try {
  2060.  
  2061.             $requesting_member = Member::find_valid_registered_by_id(
  2062.                 $this->member_id
  2063.             );
  2064.  
  2065.             if(!$requesting_member->is_trainer()  && !$requesting_member->is_admin()  && !$requesting_member->is_super_admin() && !$requesting_member->is_site_manager()) {
  2066.                 return $this->error_response("User roles not valid");
  2067.             }
  2068.  
  2069.             $member = Member::find_valid_registered_by_id(
  2070.                 $member_id
  2071.             );
  2072.  
  2073.             $requesting_orgs = $requesting_member->organisation->get_all_organisation_ids();
  2074.  
  2075.             if(!in_array($member->organisation->id, $requesting_orgs))  {
  2076.                 return $this->error_response("User not a member of requesting admins organisation");
  2077.             }
  2078.  
  2079.             /*if($requesting_member->organisation->id != $member->organisation->id ) {
  2080.                 return $this->error_response("User not a member of requesting admins organisation");
  2081.             }*/
  2082.  
  2083.             /*$total_documents = MemberDocument::count_valid_by_member_id(
  2084.                 $member_id
  2085.             );*/
  2086.  
  2087.             $page = new Page();
  2088.             $page->set_per_page(10);
  2089.             $page->set_current_page_number(1);
  2090.  
  2091.             $document_search = new MemberDocumentSearch();
  2092.             $document_search->set_page($page)
  2093.                 ->set_date_filter('updated')
  2094.                 ->set_member($member)
  2095.                 ->set_is_active(1)
  2096.                 ->set_is_deleted(0)
  2097.                 ->set_is_document_active(1)
  2098.                 ->set_is_document_deleted(0);
  2099.  
  2100.             $document_search->execute();
  2101.  
  2102.             $cert_search = new EnrolmentMobileFilteredSearch();
  2103.             $cert_search->set_page($page)
  2104.                 ->set_order('updated_at', 'DESC')
  2105.                 ->set_is_completed(1)
  2106.                 ->set_is_successful(1)
  2107.                 ->set_has_certificate(1)
  2108.                 ->set_is_active(1)
  2109.                 ->set_is_deleted(0)
  2110.                 ->set_is_course_active(1)
  2111.                 ->set_is_course_deleted(0)
  2112.                 ->set_member($member);
  2113.  
  2114.             $cert_search->execute();
  2115.  
  2116.             $total_certificates = $cert_search->get_total_rows();
  2117.             $total_documents = $document_search->get_total_rows();
  2118.  
  2119.  
  2120.             /*$total_certificates = Enrolment::count_valid_by_member_id_and_is_completed_and_is_successful(
  2121.                 $member_id,
  2122.                 1,
  2123.                 1
  2124.             );*/
  2125.  
  2126.             return $this->response(array('success' => 'true', 'result' => array(
  2127.                 'id' => $member->id,
  2128.                 'is_verified' => ($member->is_verified()) ? true : false,
  2129.                 'verification_stage' => $member->verification_stage,
  2130.                 'first_name' => $member->first_name,
  2131.                 'last_name' => $member->last_name,
  2132.                 'email' => $member->email,
  2133.                 'username' => ($member->is_registered()) ? $member->user->username : null,
  2134.                 'mobile_number' => $member->mobile_number,
  2135.                 'mobile_country_code' => $member->country_code,
  2136.                 'created_at' => $member->created_at,
  2137.                 'updated_at' => $member->updated_at,
  2138.                 'documents_total' => $total_documents,
  2139.                 'certificates_total' => $total_certificates,
  2140.                 'image_key' => rtrim(strtr(base64_encode($member->image_key), '+/', '-_'), '=')
  2141.             )));
  2142.  
  2143.         } catch (Exception $e) {
  2144.             return $this->error_response($e->getMessage());
  2145.         }
  2146.  
  2147.     }
  2148.  
  2149.     public function records_member_documents_get($member_id, $from = null, $limit = null, $page_number = 1) {
  2150.  
  2151.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  2152.         if($from == null) {
  2153.             $from = date("Y-m-d H:i:s", 0);
  2154.         } else {
  2155.             $from = urldecode($from);
  2156.         }
  2157.  
  2158.         $from = date("Y-m-d H:i:s", strtotime($from)+1);
  2159.  
  2160.         try {
  2161.  
  2162.             $requesting_member = Member::find_valid_registered_by_id(
  2163.                 $this->member_id
  2164.             );
  2165.  
  2166.             if(!$requesting_member->is_trainer()  && !$requesting_member->is_admin()  && !$requesting_member->is_super_admin() && !$requesting_member->is_site_manager()) {
  2167.                 return $this->error_response("User roles not valid");
  2168.             }
  2169.  
  2170.             $member = Member::find_valid_registered_by_id(
  2171.                 $member_id
  2172.             );
  2173.  
  2174.             $organisation = Organisation::find_valid_by_id(
  2175.                 $this->current_organisation_id
  2176.             );
  2177.  
  2178.             $page = new Page();
  2179.             $page->set_per_page($limit);
  2180.             $page->set_current_page_number($page_number);
  2181.  
  2182.             $document_search = new MemberDocumentSearch();
  2183.             $document_search->set_page($page)
  2184.                 ->set_date_filter('updated')
  2185.                 ->set_date_from($from)
  2186.                 ->set_member($member);
  2187.  
  2188.             $document_search->execute();
  2189.  
  2190.             $results = array();
  2191.  
  2192.             $l = $document_search->get_row_per_current_page();
  2193.  
  2194.             for($i = 0; $i < $l; $i++){
  2195.  
  2196.                 $member_document = $document_search[$i];
  2197.  
  2198.                 $document = $member_document->document;
  2199.  
  2200.                 $document_details = array(
  2201.                     'id' => $document->id,
  2202.                     'name' => $document->name,
  2203.                     'created_at' => $document->created_at,
  2204.                     'updated_at' => $document->updated_at,
  2205.                     'is_deleted' => $document->is_deleted,
  2206.                     'is_required' => $document->is_required,
  2207.                     'is_active' => $document->is_active
  2208.                 );
  2209.  
  2210.                 $member_document_details = array(
  2211.                     'id' => $member_document->id,
  2212.                     'created_at' => $member_document->created_at,
  2213.                     'updated_at' => $member_document->updated_at,
  2214.                     'is_deleted' => $member_document->is_deleted,
  2215.                     'is_active' => $member_document->is_active,
  2216.                     'is_expired' => $member_document->is_expired,
  2217.  
  2218.                     'expires_at' => $member_document->expires_at,
  2219.  
  2220.                     'document_key' =>  rtrim(strtr(base64_encode($member_document->document_key), '+/', '-_'), '='),
  2221.  
  2222.                     'document_id' => $member_document->document_id,
  2223.                     'document' => $document_details,
  2224.  
  2225.                 );
  2226.  
  2227.                 array_push($results, $member_document_details);
  2228.  
  2229.             }
  2230.  
  2231.             return $this->response(array('success' => 'true', 'total_rows' => (int) $l, 'result' => $results));
  2232.  
  2233.         } catch (Exception $e) {
  2234.             return $this->error_response($e->getMessage());
  2235.         }
  2236.  
  2237.     }
  2238.  
  2239.     public function records_member_certificates_get($member_id, $from = null, $limit = null, $page_number = 1) {
  2240.  
  2241.         if($limit == null) $limit = $this->config->item('mobile_api_pagination_limit');
  2242.         if($from == null) {
  2243.             $from = date("Y-m-d H:i:s", 0);
  2244.         } else {
  2245.             $from = urldecode($from);
  2246.         }
  2247.  
  2248.         $from = date("Y-m-d H:i:s", strtotime($from)+1);
  2249.  
  2250.         try {
  2251.  
  2252.             $requesting_member = Member::find_valid_registered_by_id(
  2253.                 $this->member_id
  2254.             );
  2255.  
  2256.             if(!$requesting_member->is_trainer()  && !$requesting_member->is_admin()  && !$requesting_member->is_super_admin() && !$requesting_member->is_site_manager()) {
  2257.                 return $this->error_response("User roles not valid");
  2258.             }
  2259.  
  2260.             $member = Member::find_valid_registered_by_id(
  2261.                 $member_id
  2262.             );
  2263.  
  2264.             $organisation = Organisation::find_valid_by_id(
  2265.                 $this->current_organisation_id
  2266.             );
  2267.  
  2268.             $page = new Page();
  2269.             $page->set_per_page($limit);
  2270.             $page->set_current_page_number($page_number);
  2271.  
  2272.             $cert_search = new EnrolmentMobileFilteredSearch();
  2273.             $cert_search->set_page($page)
  2274.                 ->set_order('updated_at', 'DESC')
  2275.                 ->set_is_completed(1)
  2276.                 ->set_is_successful(1)
  2277.                 ->set_has_certificate(1)
  2278.                 ->set_is_active(1)
  2279.                 ->set_is_deleted(0)
  2280.                 ->set_is_course_active(1)
  2281.                 ->set_is_course_deleted(0)
  2282.                 ->set_date_filter('updated')
  2283.                 ->set_date_from($from)
  2284.                 ->set_member($member)
  2285.                 ->set_organisation($member->organisation);
  2286.  
  2287.             $cert_search->execute();
  2288.  
  2289.             $results = array();
  2290.  
  2291.             $l = $cert_search->get_row_per_current_page();
  2292.  
  2293.             for($i = 0; $i < $l; $i++){
  2294.  
  2295.                 $cert = $cert_search[$i];
  2296.  
  2297.                 $course = $cert->course;
  2298.  
  2299.                 $course_details = array(
  2300.                     'id' => $course->id,
  2301.                     'created_at' => $course->created_at,
  2302.                     'updated_at' => $course->updated_at,
  2303.                     'name'  => $course->name,
  2304.                     'is_active' => $course->is_active,
  2305.                     'is_deleted' => $course->is_deleted,
  2306.                     'module_count' => $course->module_count,
  2307.                     'has_certificate'  => $course->has_certificate,
  2308.                     'expiry_months' => $course->expiry_months
  2309.  
  2310.                 );
  2311.  
  2312.                 $cert_details = array(
  2313.                     'id' => $cert->id,
  2314.                     'created_at' => $cert->created_at,
  2315.                     'updated_at' => $cert->updated_at,
  2316.                     'started_at' => $cert->started_at,
  2317.                     'completed_at' => $cert->completed_at,
  2318.                     'succeeded_at' => $cert->succeeded_at,
  2319.  
  2320.                     'is_started' => $cert->is_started,
  2321.                     'is_completed' => $cert->is_completed,
  2322.                     'is_successful' => $cert->is_successful,
  2323.                     'is_failed' => $cert->is_failed,
  2324.                     'is_manual' => $cert->is_manual,
  2325.                     'is_active' => $cert->is_active,
  2326.                     'is_deleted' => $cert->is_deleted,
  2327.  
  2328.                     'expire_at' => $cert->expire_at,
  2329.                     'is_expired' => $cert->is_expired,
  2330.  
  2331.                     'course_id' => $cert->course_id,
  2332.                     'course' => $course_details,
  2333.  
  2334.                 );
  2335.  
  2336.                 array_push($results, $cert_details);
  2337.  
  2338.             }
  2339.  
  2340.             return $this->response(array('success' => 'true', 'total_rows' => (int) $l, 'result' => $results));
  2341.  
  2342.         } catch (Exception $e) {
  2343.             return $this->error_response($e->getMessage());
  2344.         }
  2345.  
  2346.     }
  2347.  
  2348.     public function image_get($key, $width = null, $height = null) {
  2349.  
  2350.         try {
  2351.  
  2352.             $member = Member::find_valid_registered_by_id(
  2353.                 $this->member_id
  2354.             );
  2355.  
  2356.             $key = base64_decode(str_pad(strtr($key, '-_', '+/'), strlen($key) % 4, '=', STR_PAD_RIGHT));
  2357.  
  2358.             $ext = substr(strrchr($key,'.'),1);
  2359.  
  2360.             $image_temp_name = 'member_'.$member->id.'_at_'.time().'_image'.$ext;
  2361.  
  2362.             $image_temp = new SplFileObject('/tmp/'.$image_temp_name, 'w+');
  2363.  
  2364.             $key = new AcademyHQ\S3\Key($key);
  2365.  
  2366.             $aws = \Aws\Common\Aws::factory(APPPATH.'config/aws.php');
  2367.             $s3_client = $aws->get('S3');
  2368.  
  2369.             $image_download = new \AcademyHQ\S3\Image\Factory($s3_client, AWS_S3_ASSETS_BUCKET);
  2370.  
  2371.             $image = $image_download->get_by_key($key, $image_temp);
  2372.  
  2373.  
  2374.             if(((isset($width) && $width != -1) && $height == -1)) {
  2375.  
  2376.                 $resizer_nocrop = new \AcademyHQ\S3\Image\ResizerWithoutCropping($image);
  2377.  
  2378.                 $info = @getimagesize($image->get_image()->getRealPath());
  2379.  
  2380.                 if($width < $info[0]) {
  2381.  
  2382.                     $resizer_nocrop->set_width($width);
  2383.  
  2384.                     $resizer_nocrop->set_height($info[1]*($width/$info[0]));
  2385.  
  2386.                 }
  2387.  
  2388.                 $display_file = $resizer_nocrop->resize_image();
  2389.  
  2390.             } else {
  2391.  
  2392.                 $resizer = new \AcademyHQ\S3\Image\Resizer($image);
  2393.  
  2394.                 if(isset($width) && $width != -1) {
  2395.                     $resizer->set_width($width);
  2396.                 }
  2397.                 if(isset($height) && $height != -1) {
  2398.                     $resizer->set_height($height);
  2399.                 }
  2400.  
  2401.                 $display_file = $resizer->resize_image();
  2402.  
  2403.             }
  2404.  
  2405.  
  2406.             //header('HTTP/1.1: ' . 200);
  2407.             //header('Status: ' . 200);
  2408.             header("Content-Type: image/".$ext);
  2409.             //header("Content-Length: " . $display_file->getSize());
  2410.  
  2411.             $display_file->fpassthru();
  2412.  
  2413.             $image_temp = null;
  2414.  
  2415.             unlink('/tmp/'.$image_temp_name);
  2416.  
  2417.         } catch (Exception $e) {
  2418.             return $this->error_response($e->getMessage());
  2419.         }
  2420.  
  2421.     }
  2422.  
  2423.  
  2424. }
Add Comment
Please, Sign In to add comment