public function store(Request $request, FormDefinition $formDef)
 {
     $this->validate($request, ['name' => 'required|max:255|string', 'email' => 'required|email']);
     $fields = new Collection();
     $errors = new Collection();
     $request->session()->forget('field_validation_errors');
     $request->session()->put('field_validation_errors', []);
     if ($formDef->submissions()->where('email', $request->input('email'))->get()->count() > 0) {
         $errors->push("A submission already exists for the e-mail you used: " . $request->input("email"));
     }
     foreach ($formDef->fields()->get() as $field) {
         $options = json_decode($field->options);
         if ($options->required && !$request->has($field->field_id) && ($field->type != 'Checkbox' && $field->type != 'File')) {
             $errors->push("Missing required field named " . $field->name . " with ID " . $field->field_id);
         } elseif ($options->required && $field->type == "File" && !$request->hasFile($field->field_id)) {
             $errors->push("Missing required file field named " . $field->name . " with ID " . $field->field_id);
         } elseif (!$request->has($field->field_id) && $field->type != 'File') {
             $fields->put($field->field_id, null);
         } else {
             if ($this->verifyField($field, $request->input($field->field_id), $request)) {
                 if ($field->type != 'File') {
                     $fields->put($field->field_id, $request->input($field->field_id));
                 } else {
                     $fname = "file_" . str_random(32) . "." . $request->file($field->field_id)->getClientOriginalExtension();
                     $file = $request->file($field->field_id)->move('../storage/app/form/' . $formDef->id, $fname);
                     $fields->put($field->field_id, $fname);
                 }
             } else {
                 $errors->push("Invalid value for field named \"" . $field->name . "\" with ID  " . $field->field_id);
             }
         }
     }
     if ($errors->count() > 0) {
         //return response()->json(["The submission was REJECTED and errors follow",$errors],422);
         return redirect()->back()->withErrors($errors);
         //return view('formdefinitions.display', compact('fields', 'errors'));
     }
     $request->session()->forget('form_validation_errors');
     $submission = new Submission(["form_definition_id" => $formDef->id, "name" => $request->input('name'), "email" => $request->input('email'), "password" => null, "submitted" => Carbon::now(), "status" => 'Reviewing', "options" => $fields->toJson()]);
     $submission->save();
     //return response()->json(["The submission was accepted and follows",$submission],200);
     return view('formdefinitions.accepted', compact('formDef', 'submission'));
 }
 public function update(FormDefinition $form, Request $request)
 {
     if ($form->status != "Drafting" || $form->submissions()->get()->count() > 0) {
         return response()->json(["error" => true, "message" => ["You cannot edit a form that isn't a Draft or has submissions"]], 405);
     } else {
         $this->validate($request, ['name' => 'required|max:100', 'description' => 'required', 'definition' => 'required|array']);
         $fieldErrors = new Collection();
         $old_fields = $form->fields()->get();
         $new_fields = new Collection();
         $formDef = $form;
         $formDef->name = $request->input("name");
         $formDef->description = $request->input('description');
         foreach ($request->input('definition') as $fieldArray) {
             $fieldDef = collect($fieldArray);
             $type = $fieldDef->get("type");
             if ($type == "Text") {
                 $validator = Validator::make($fieldArray, ['id' => 'required|alpha_dash', 'name' => 'required', 'required' => 'required|boolean', 'text_type' => 'required|in:any,num,alpha,email,phone,date,time,multiline']);
                 if ($validator->fails()) {
                     $fieldErrors->push($validator->errors());
                 } else {
                     $field_options = new Collection();
                     $field_options->put('required', $fieldDef->get('required'));
                     $field_options->put('text_type', $fieldDef->get('text_type'));
                     $field = new Field(['form_definition_id' => $formDef->id, 'type' => $fieldDef->get('type'), 'field_id' => $fieldDef->get('id'), 'name' => $fieldDef->get('name'), 'order' => 0, 'options' => $field_options->toJson()]);
                     $field->save();
                 }
             } else {
                 if ($type == "Checkbox") {
                     $validator = Validator::make($fieldArray, ['id' => 'required|alpha_dash', 'name' => 'required', 'required' => 'required', 'value_checked' => 'required', 'value_unchecked' => 'required']);
                     if ($validator->fails()) {
                         $fieldErrors->push($validator->errors());
                     } else {
                         $field_options = new Collection();
                         $field_options->put('required', $fieldDef->get('required'));
                         $field_options->put('value_unchecked', $fieldDef->get('value_unchecked'));
                         $field_options->put('value_checked', $fieldDef->get('value_checked'));
                         $field = new Field(['form_definition_id' => $formDef->id, 'type' => $fieldDef->get('type'), 'field_id' => $fieldDef->get('id'), 'name' => $fieldDef->get('name'), 'order' => 0, 'options' => $field_options->toJson()]);
                         $field->save();
                     }
                 } else {
                     if ($type == "Select") {
                         $validator = Validator::make($fieldArray, ['id' => 'required|alpha_dash', 'name' => 'required', 'required' => 'required', 'multipleselect' => 'required|boolean', 'options' => 'required|array', 'options.*.label' => 'required', 'options.*.value' => 'required']);
                         if ($validator->fails()) {
                             $fieldErrors->push($validator->errors());
                         } else {
                             $field_options = new Collection();
                             $field_options->put('required', $fieldDef->get('required'));
                             $field_options->put('multipleselect', $fieldDef->get('multipleselect'));
                             $field_options->put('options', $fieldDef->get('options'));
                             $field = new Field(['form_definition_id' => $formDef->id, 'type' => $fieldDef->get('type'), 'field_id' => $fieldDef->get('id'), 'name' => $fieldDef->get('name'), 'order' => 0, 'options' => $field_options->toJson()]);
                             $field->save();
                         }
                     } else {
                         if ($type == "RadioGroup") {
                             $validator = Validator::make($fieldArray, ['id' => 'required|alpha_dash', 'name' => 'required', 'required' => 'required', 'options' => 'required|array', 'options.*.label' => 'required', 'options.*.value' => 'required']);
                             if ($validator->fails()) {
                                 $fieldErrors->push($validator->errors());
                             } else {
                                 $field_options = new Collection();
                                 $field_options->put('required', $fieldDef->get('required'));
                                 $field_options->put('options', $fieldDef->get('options'));
                                 $field = new Field(['form_definition_id' => $formDef->id, 'type' => $fieldDef->get('type'), 'field_id' => $fieldDef->get('id'), 'name' => $fieldDef->get('name'), 'order' => 0, 'options' => $field_options->toJson()]);
                                 $field->save();
                             }
                         } else {
                             if ($type == "Address") {
                                 $validator = Validator::make($fieldArray, ['id' => 'required|alpha_dash', 'name' => 'required', 'required' => 'required']);
                                 if ($validator->fails()) {
                                     $fieldErrors->push($validator->errors());
                                 } else {
                                     $field_options = new Collection();
                                     $field_options->put('required', $fieldDef->get('required'));
                                     $field_options->put('options', $fieldDef->get('options'));
                                     $field = new Field(['form_definition_id' => $formDef->id, 'type' => $fieldDef->get('type'), 'field_id' => $fieldDef->get('id'), 'name' => $fieldDef->get('name'), 'order' => 0, 'options' => $field_options->toJson()]);
                                     $field->save();
                                 }
                             } else {
                                 if ($type == "File") {
                                     $validator = Validator::make($fieldArray, ['id' => 'required|alpha_dash', 'name' => 'required', 'required' => 'required']);
                                     if ($validator->fails()) {
                                         $fieldErrors->push($validator->errors());
                                     } else {
                                         $field_options = new Collection();
                                         $field_options->put('required', $fieldDef->get('required'));
                                         $field_options->put('types', $fieldDef->get('types'));
                                         $field = new Field(['form_definition_id' => $formDef->id, 'type' => $fieldDef->get('type'), 'field_id' => $fieldDef->get('id'), 'name' => $fieldDef->get('name'), 'order' => 0, 'options' => $field_options->toJson()]);
                                         $field->save();
                                     }
                                 } else {
                                     $fieldErrors->push(["Unknown field type in submission"]);
                                     continue;
                                 }
                             }
                         }
                     }
                 }
             }
             $new_fields->push($field);
         }
         if ($fieldErrors->count() == 0) {
             foreach ($old_fields as $old_field) {
                 $old_field->delete();
             }
             $formDef->save();
             return response()->json(["id" => $formDef->id, "new_fields" => $new_fields, "old_fields" => $old_fields], 200);
         } else {
             //$formDef->forceDelete();
             $errorBag = new Collection();
             foreach ($fieldErrors as $fieldError) {
                 foreach ($fieldError->messages() as $error) {
                     $errorBag->push($error);
                 }
             }
             return response()->json($errorBag, 422);
         }
     }
 }