Selaa lähdekoodia

FAQまわり整備

master
sosuke.iwabuchi 2 vuotta sitten
vanhempi
commit
dfc5bf284b
24 muutettua tiedostoa jossa 882 lisäystä ja 7 poistoa
  1. +44
    -0
      app/Http/Controllers/Web/FAQ/AskController.php
  2. +20
    -0
      app/Http/Controllers/Web/FAQ/AskParam.php
  3. +38
    -0
      app/Http/Controllers/Web/FAQ/FAQGenresController.php
  4. +15
    -0
      app/Http/Controllers/Web/FAQ/FAQGenresParam.php
  5. +49
    -0
      app/Http/Controllers/Web/FAQ/FAQsController.php
  6. +15
    -0
      app/Http/Controllers/Web/FAQ/FAQsParam.php
  7. +1
    -1
      app/Http/Controllers/Web/WebController.php
  8. +49
    -6
      app/Kintone/KintoneAccess.php
  9. +28
    -0
      app/Kintone/Models/Ask.php
  10. +2
    -0
      app/Kintone/Models/Customer.php
  11. +33
    -0
      app/Kintone/Models/FAQ.php
  12. +16
    -0
      app/Kintone/Models/KintoneModel.php
  13. +45
    -0
      app/Logic/AskManager.php
  14. +2
    -0
      config/kintone.php
  15. +20
    -0
      lang/en/auth.php
  16. +19
    -0
      lang/en/pagination.php
  17. +22
    -0
      lang/en/passwords.php
  18. +184
    -0
      lang/en/validation.php
  19. +20
    -0
      lang/ja/auth.php
  20. +19
    -0
      lang/ja/pagination.php
  21. +22
    -0
      lang/ja/passwords.php
  22. +205
    -0
      lang/ja/validation.php
  23. +5
    -0
      routes/api.php
  24. +9
    -0
      tests/Feature/KintoneAccessTest.php

+ 44
- 0
app/Http/Controllers/Web/FAQ/AskController.php Näytä tiedosto

@@ -0,0 +1,44 @@
<?php

namespace App\Http\Controllers\Web\FAQ;

use App\Http\Controllers\Web\WebController;
use App\Kintone\KintoneRecordQueryOperator;
use App\Kintone\Models\Ask;
use App\Kintone\Models\Customer;
use App\Kintone\Models\FAQ;
use App\Logic\AskManager;
use App\Util\DateUtil;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class AskController extends WebController
{

public function name(): string
{
return "問い合わせ登録";
}

public function description(): string
{
return "問い合わせ";
}


public function __construct(protected AskParam $param, private AskManager $manager)
{
parent::__construct();
$this->middleware('auth:sanctum');
}

protected function run(Request $request): JsonResponse
{
$param = $this->param;

$this->manager->setCustomer(Customer::getSelf())
->register($param->genre, $param->ask);

return $this->successResponse();
}
}

+ 20
- 0
app/Http/Controllers/Web/FAQ/AskParam.php Näytä tiedosto

@@ -0,0 +1,20 @@
<?php

namespace App\Http\Controllers\Web\FAQ;

use App\Http\Controllers\Web\BaseParam;

/**
* @property string $genre
* @property string $ask
*/
class AskParam extends BaseParam
{
public function rules(): array
{
return [
'genre' => $this->str(),
'ask' => $this->str(['max:1000']),
];
}
}

+ 38
- 0
app/Http/Controllers/Web/FAQ/FAQGenresController.php Näytä tiedosto

@@ -0,0 +1,38 @@
<?php

namespace App\Http\Controllers\Web\FAQ;

use App\Http\Controllers\Web\WebController;
use App\Kintone\KintoneRecordQueryOperator;
use App\Kintone\Models\FAQ;
use App\Util\DateUtil;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class FAQGenresController extends WebController
{

public function name(): string
{
return "FAQジャンル取得";
}

public function description(): string
{
return "FAQジャンル一覧を取得する";
}


public function __construct(protected FAQGenresParam $param)
{
parent::__construct();
$this->middleware('auth:sanctum');
}

protected function run(Request $request): JsonResponse
{
$result = FAQ::getDropDownOptions(FAQ::FIELD_GENRE);

return $this->successResponse($result);
}
}

+ 15
- 0
app/Http/Controllers/Web/FAQ/FAQGenresParam.php Näytä tiedosto

@@ -0,0 +1,15 @@
<?php

namespace App\Http\Controllers\Web\FAQ;

use App\Http\Controllers\Web\BaseParam;

/**
*/
class FAQGenresParam extends BaseParam
{
public function rules(): array
{
return [];
}
}

+ 49
- 0
app/Http/Controllers/Web/FAQ/FAQsController.php Näytä tiedosto

@@ -0,0 +1,49 @@
<?php

namespace App\Http\Controllers\Web\FAQ;

use App\Http\Controllers\Web\WebController;
use App\Kintone\KintoneRecordQueryOperator;
use App\Kintone\Models\FAQ;
use App\Util\DateUtil;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class FAQsController extends WebController
{

public function name(): string
{
return "FAQ一覧取得";
}

public function description(): string
{
return "FAQ一覧を取得する";
}


public function __construct(protected FAQsParam $param)
{
parent::__construct();
$this->middleware('auth:sanctum');
}

protected function run(Request $request): JsonResponse
{
$nowStr = DateUtil::now()->format('Y-m-d');
$query = FAQ::getQuery()
->where(FAQ::FIELD_SHOW_START_DATE, $nowStr, KintoneRecordQueryOperator::LE)
->where(FAQ::FIELD_SHOW_END_DATE, $nowStr, KintoneRecordQueryOperator::GE)
->orderByDesc(FAQ::FIELD_GENRE);

$list = FAQ::getAccess()->some($query);

$result = [];
foreach ($list as $ele) {
$result[] = $ele->toArray();
}

return $this->successResponse($result);
}
}

+ 15
- 0
app/Http/Controllers/Web/FAQ/FAQsParam.php Näytä tiedosto

@@ -0,0 +1,15 @@
<?php

namespace App\Http\Controllers\Web\FAQ;

use App\Http\Controllers\Web\BaseParam;

/**
*/
class FAQsParam extends BaseParam
{
public function rules(): array
{
return [];
}
}

+ 1
- 1
app/Http/Controllers/Web/WebController.php Näytä tiedosto

@@ -204,7 +204,7 @@ abstract class WebController extends BaseController
if ($e->getStatusCode() === 401) {
return $this->unAuthorizedResponse();
}
throw e;
throw $e;
} catch (Exception $e) {
$this->transaction->rollBack();
logs()->error([


+ 49
- 6
app/Kintone/KintoneAccess.php Näytä tiedosto

@@ -5,7 +5,7 @@ namespace App\Kintone;
use App\Exceptions\ConfigException;
use App\Kintone\Models\KintoneModel;
use Exception;
use Illuminate\Http\Client\Response;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Http;
use Log;
@@ -18,7 +18,7 @@ class KintoneAccess

private string $appName;
private string $host;
private string $apiToken;
private string $apiToken = "";
private int $appId;

private const DEFAULT_FIELDS = [
@@ -38,6 +38,7 @@ class KintoneAccess
private const URL_RECORDS = "/k/v1/records.json";
private const URL_CURSOL = "/k/v1/records/cursor.json";
private const URL_FILE = "/k/v1/file.json";
private const URL_APP_FORM_FIELDS = "/k/v1/app/form/fields.json";


public function __construct(string $appName)
@@ -62,11 +63,23 @@ class KintoneAccess
throw new ConfigException($key, $appId);
}

$this->addAppToken($appName);
$this->host = $host;
$this->apiToken = $apiToken;
$this->appId = $appId;
}

public function addAppToken(string $appName): static
{
$key = "kintone.applications." . $appName . ".apiToken";
$apiToken = config($key);
if (!$apiToken) {
throw new ConfigException($key, $apiToken);
}
$this->apiToken = $this->apiToken ? $this->apiToken . "," . $apiToken : $apiToken;
return $this;
}


public function setFields(array $fields): static
{
$this->fields = [
@@ -366,12 +379,18 @@ class KintoneAccess
return $response;
}

public function filePut($file): string
/**
* ファイルアップロード
*
* @param UploadedFile $file
* @return string fileKey
*/
public function filePut(UploadedFile $file): string
{
$response = Http::withHeaders([
"X-Cybozu-API-Token" => $this->apiToken,
"Content-Type" => "multipart/form-data",
])->post($this->getCursorUrl(), $file);
])->post($this->getFileUrl(), $file);

if ($response->failed()) {
$e = $response->toException();
@@ -380,7 +399,27 @@ class KintoneAccess
throw $e;
}
}
return $response[''];
return $response['fileKey'];
}

public function getAppFormFields(): array
{
$response = Http::withHeaders([
"X-Cybozu-API-Token" => $this->apiToken,

])->get($this->getAppFormFieldsUrl(), [
"app" => $this->appId,
]);

if ($response->failed()) {
$e = $response->toException();
if ($e instanceof Exception) {
Log::error($e->getMessage());
throw $e;
}
}

return $response['properties'];
}

private function getRecordUrl()
@@ -401,6 +440,10 @@ class KintoneAccess
{
return $this->getUrl(self::URL_FILE);
}
private function getAppFormFieldsUrl()
{
return $this->getUrl(self::URL_APP_FORM_FIELDS);
}

private function getUrl(string $path)
{


+ 28
- 0
app/Kintone/Models/Ask.php Näytä tiedosto

@@ -0,0 +1,28 @@
<?php

namespace App\Kintone\Models;

/**
* アプリ名 問い合わせ
*/
class Ask extends KintoneModel
{
const CONFIG_KEY = "KINTONE_APP_ASK";

const FIELD_CUSTOMER_CODE = "顧客コード";
const FIELD_GENRE = "ジャンル";
const FIELD_ASK = "問い合わせ";
const FIELD_ASK_DATETIME = "問い合わせ日時";

protected const FIELDS = [
...parent::FIELDS,
self::FIELD_CUSTOMER_CODE => FieldType::SINGLE_LINE_TEXT,
self::FIELD_GENRE => FieldType::SINGLE_LINE_TEXT,
self::FIELD_ASK => FieldType::MULTI_LINE_TEXT,
self::FIELD_ASK_DATETIME => FieldType::DATETIME,
];

protected const FIELD_NAMES = [
...parent::FIELD_NAMES,
];
}

+ 2
- 0
app/Kintone/Models/Customer.php Näytä tiedosto

@@ -16,6 +16,7 @@ class Customer extends KintoneModel
const FIELD_CUSTOMER_NAME_KANA = "顧客名カナ";
const FIELD_EMAIL = "メールアドレス";
const FIELD_PHONE_NUMBER = "電話番号";
const FIELD_STUDENT_LICENSE_IMAGES = "学生証画像";

protected const FIELDS = [
...parent::FIELDS,
@@ -24,6 +25,7 @@ class Customer extends KintoneModel
self::FIELD_CUSTOMER_NAME_KANA => FieldType::SINGLE_LINE_TEXT,
self::FIELD_EMAIL => FieldType::LINK,
self::FIELD_PHONE_NUMBER => FieldType::LINK,
self::FIELD_STUDENT_LICENSE_IMAGES => FieldType::FILE,
];

protected const FIELD_NAMES = [


+ 33
- 0
app/Kintone/Models/FAQ.php Näytä tiedosto

@@ -0,0 +1,33 @@
<?php

namespace App\Kintone\Models;

/**
* アプリ名 FAQ
*/
class FAQ extends KintoneModel
{
const CONFIG_KEY = "KINTONE_APP_FAQ";

const FIELD_GENRE = "ジャンル";
const FIELD_QUESTION = "質問";
const FIELD_ANSWER = "回答";
const FIELD_SHOW_START_DATE = "表示開始日";
const FIELD_SHOW_END_DATE = "表示終了日";

protected const FIELDS = [
...parent::FIELDS,
self::FIELD_GENRE => FieldType::DROP_DOWN,
self::FIELD_QUESTION => FieldType::MULTI_LINE_TEXT,
self::FIELD_ANSWER => FieldType::MULTI_LINE_TEXT,
self::FIELD_SHOW_START_DATE => FieldType::DATE,
self::FIELD_SHOW_END_DATE => FieldType::DATE,
];

protected const FIELD_NAMES = [
...parent::FIELD_NAMES,
self::FIELD_GENRE => 'genre',
self::FIELD_QUESTION => 'question',
self::FIELD_ANSWER => 'answer',
];
}

+ 16
- 0
app/Kintone/Models/KintoneModel.php Näytä tiedosto

@@ -197,6 +197,22 @@ abstract class KintoneModel
return $ret;
}

public static function getDropDownOptions(string $fieldCode): array
{
$ret = [];
$properties = static::getAccess()->getAppFormFields();
$options = Arr::get($properties, sprintf("%s.options", $fieldCode));
$ret = Arr::pluck(Arr::sort($options, function ($option) {
return data_get($option, "index");
}), "label");
// foreach ($options as $option) {
// $index = data_get($option, "index");
// $label = data_get($option, "label");
// $ret[$index] = $label;
// }
return $ret;
}

/**
* 変更前データを現在データで上書きする
*


+ 45
- 0
app/Logic/AskManager.php Näytä tiedosto

@@ -0,0 +1,45 @@
<?php

namespace App\Logic;

use App\Features\InstanceAble;
use App\Kintone\Models\Ask;
use App\Kintone\Models\Customer;
use App\Util\DateUtil;
use LogicException;

class AskManager
{

use InstanceAble;

private Customer|null $customer = null;

public function __construct(private Ask $model)
{
}

public function setCustomer(Customer $customer): static
{
$this->customer = $customer;
return $this;
}


public function register(string $genre, string $ask)
{
if ($this->customer === null) {
throw new LogicException("顧客NULL");
}


$this->model->set(Ask::FIELD_ASK_DATETIME, DateUtil::now());
$this->model->set(Ask::FIELD_GENRE, $genre);
$this->model->set(Ask::FIELD_ASK, $ask);
$this->model->set(Ask::FIELD_CUSTOMER_CODE, $this->customer->getStr(Customer::FIELD_CUSTOMER_CODE));

$this->model->getAccess()
->addAppToken(Customer::class)
->create($this->model);
}
}

+ 2
- 0
config/kintone.php Näytä tiedosto

@@ -31,6 +31,8 @@ return [
...App\Kintone\Models\SeasonTicketContract::setConfig(),
...App\Kintone\Models\PaymentPlan::setConfig(),
...App\Kintone\Models\GeneralApplication::setConfig(),
...App\Kintone\Models\FAQ::setConfig(),
...App\Kintone\Models\Ask::setConfig(),
],

];

+ 20
- 0
lang/en/auth.php Näytä tiedosto

@@ -0,0 +1,20 @@
<?php

return [

/*
|--------------------------------------------------------------------------
| Authentication Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used during authentication for various
| messages that we need to display to the user. You are free to modify
| these language lines according to your application's requirements.
|
*/

'failed' => 'These credentials do not match our records.',
'password' => 'The provided password is incorrect.',
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',

];

+ 19
- 0
lang/en/pagination.php Näytä tiedosto

@@ -0,0 +1,19 @@
<?php

return [

/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/

'previous' => '&laquo; Previous',
'next' => 'Next &raquo;',

];

+ 22
- 0
lang/en/passwords.php Näytä tiedosto

@@ -0,0 +1,22 @@
<?php

return [

/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/

'reset' => 'Your password has been reset.',
'sent' => 'We have emailed your password reset link.',
'throttled' => 'Please wait before retrying.',
'token' => 'This password reset token is invalid.',
'user' => "We can't find a user with that email address.",

];

+ 184
- 0
lang/en/validation.php Näytä tiedosto

@@ -0,0 +1,184 @@
<?php

return [

/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/

'accepted' => 'The :attribute field must be accepted.',
'accepted_if' => 'The :attribute field must be accepted when :other is :value.',
'active_url' => 'The :attribute field must be a valid URL.',
'after' => 'The :attribute field must be a date after :date.',
'after_or_equal' => 'The :attribute field must be a date after or equal to :date.',
'alpha' => 'The :attribute field must only contain letters.',
'alpha_dash' => 'The :attribute field must only contain letters, numbers, dashes, and underscores.',
'alpha_num' => 'The :attribute field must only contain letters and numbers.',
'array' => 'The :attribute field must be an array.',
'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.',
'before' => 'The :attribute field must be a date before :date.',
'before_or_equal' => 'The :attribute field must be a date before or equal to :date.',
'between' => [
'array' => 'The :attribute field must have between :min and :max items.',
'file' => 'The :attribute field must be between :min and :max kilobytes.',
'numeric' => 'The :attribute field must be between :min and :max.',
'string' => 'The :attribute field must be between :min and :max characters.',
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute field confirmation does not match.',
'current_password' => 'The password is incorrect.',
'date' => 'The :attribute field must be a valid date.',
'date_equals' => 'The :attribute field must be a date equal to :date.',
'date_format' => 'The :attribute field must match the format :format.',
'decimal' => 'The :attribute field must have :decimal decimal places.',
'declined' => 'The :attribute field must be declined.',
'declined_if' => 'The :attribute field must be declined when :other is :value.',
'different' => 'The :attribute field and :other must be different.',
'digits' => 'The :attribute field must be :digits digits.',
'digits_between' => 'The :attribute field must be between :min and :max digits.',
'dimensions' => 'The :attribute field has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'doesnt_end_with' => 'The :attribute field must not end with one of the following: :values.',
'doesnt_start_with' => 'The :attribute field must not start with one of the following: :values.',
'email' => 'The :attribute field must be a valid email address.',
'ends_with' => 'The :attribute field must end with one of the following: :values.',
'enum' => 'The selected :attribute is invalid.',
'exists' => 'The selected :attribute is invalid.',
'file' => 'The :attribute field must be a file.',
'filled' => 'The :attribute field must have a value.',
'gt' => [
'array' => 'The :attribute field must have more than :value items.',
'file' => 'The :attribute field must be greater than :value kilobytes.',
'numeric' => 'The :attribute field must be greater than :value.',
'string' => 'The :attribute field must be greater than :value characters.',
],
'gte' => [
'array' => 'The :attribute field must have :value items or more.',
'file' => 'The :attribute field must be greater than or equal to :value kilobytes.',
'numeric' => 'The :attribute field must be greater than or equal to :value.',
'string' => 'The :attribute field must be greater than or equal to :value characters.',
],
'image' => 'The :attribute field must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field must exist in :other.',
'integer' => 'The :attribute field must be an integer.',
'ip' => 'The :attribute field must be a valid IP address.',
'ipv4' => 'The :attribute field must be a valid IPv4 address.',
'ipv6' => 'The :attribute field must be a valid IPv6 address.',
'json' => 'The :attribute field must be a valid JSON string.',
'lowercase' => 'The :attribute field must be lowercase.',
'lt' => [
'array' => 'The :attribute field must have less than :value items.',
'file' => 'The :attribute field must be less than :value kilobytes.',
'numeric' => 'The :attribute field must be less than :value.',
'string' => 'The :attribute field must be less than :value characters.',
],
'lte' => [
'array' => 'The :attribute field must not have more than :value items.',
'file' => 'The :attribute field must be less than or equal to :value kilobytes.',
'numeric' => 'The :attribute field must be less than or equal to :value.',
'string' => 'The :attribute field must be less than or equal to :value characters.',
],
'mac_address' => 'The :attribute field must be a valid MAC address.',
'max' => [
'array' => 'The :attribute field must not have more than :max items.',
'file' => 'The :attribute field must not be greater than :max kilobytes.',
'numeric' => 'The :attribute field must not be greater than :max.',
'string' => 'The :attribute field must not be greater than :max characters.',
],
'max_digits' => 'The :attribute field must not have more than :max digits.',
'mimes' => 'The :attribute field must be a file of type: :values.',
'mimetypes' => 'The :attribute field must be a file of type: :values.',
'min' => [
'array' => 'The :attribute field must have at least :min items.',
'file' => 'The :attribute field must be at least :min kilobytes.',
'numeric' => 'The :attribute field must be at least :min.',
'string' => 'The :attribute field must be at least :min characters.',
],
'min_digits' => 'The :attribute field must have at least :min digits.',
'missing' => 'The :attribute field must be missing.',
'missing_if' => 'The :attribute field must be missing when :other is :value.',
'missing_unless' => 'The :attribute field must be missing unless :other is :value.',
'missing_with' => 'The :attribute field must be missing when :values is present.',
'missing_with_all' => 'The :attribute field must be missing when :values are present.',
'multiple_of' => 'The :attribute field must be a multiple of :value.',
'not_in' => 'The selected :attribute is invalid.',
'not_regex' => 'The :attribute field format is invalid.',
'numeric' => 'The :attribute field must be a number.',
'password' => [
'letters' => 'The :attribute field must contain at least one letter.',
'mixed' => 'The :attribute field must contain at least one uppercase and one lowercase letter.',
'numbers' => 'The :attribute field must contain at least one number.',
'symbols' => 'The :attribute field must contain at least one symbol.',
'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.',
],
'present' => 'The :attribute field must be present.',
'prohibited' => 'The :attribute field is prohibited.',
'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',
'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',
'prohibits' => 'The :attribute field prohibits :other from being present.',
'regex' => 'The :attribute field format is invalid.',
'required' => 'The :attribute field is required.',
'required_array_keys' => 'The :attribute field must contain entries for: :values.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_if_accepted' => 'The :attribute field is required when :other is accepted.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values are present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute field must match :other.',
'size' => [
'array' => 'The :attribute field must contain :size items.',
'file' => 'The :attribute field must be :size kilobytes.',
'numeric' => 'The :attribute field must be :size.',
'string' => 'The :attribute field must be :size characters.',
],
'starts_with' => 'The :attribute field must start with one of the following: :values.',
'string' => 'The :attribute field must be a string.',
'timezone' => 'The :attribute field must be a valid timezone.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'uppercase' => 'The :attribute field must be uppercase.',
'url' => 'The :attribute field must be a valid URL.',
'ulid' => 'The :attribute field must be a valid ULID.',
'uuid' => 'The :attribute field must be a valid UUID.',

/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/

'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],

/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/

'attributes' => [],

];

+ 20
- 0
lang/ja/auth.php Näytä tiedosto

@@ -0,0 +1,20 @@
<?php

return [

/*
|--------------------------------------------------------------------------
| Authentication Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used during authentication for various
| messages that we need to display to the user. You are free to modify
| these language lines according to your application's requirements.
|
*/

'failed' => 'These credentials do not match our records.',
'password' => 'The provided password is incorrect.',
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',

];

+ 19
- 0
lang/ja/pagination.php Näytä tiedosto

@@ -0,0 +1,19 @@
<?php

return [

/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/

'previous' => '&laquo; Previous',
'next' => 'Next &raquo;',

];

+ 22
- 0
lang/ja/passwords.php Näytä tiedosto

@@ -0,0 +1,22 @@
<?php

return [

/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/

'reset' => 'Your password has been reset.',
'sent' => 'We have emailed your password reset link.',
'throttled' => 'Please wait before retrying.',
'token' => 'This password reset token is invalid.',
'user' => "We can't find a user with that email address.",

];

+ 205
- 0
lang/ja/validation.php Näytä tiedosto

@@ -0,0 +1,205 @@
<?php

return array_merge([

/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/

'accepted' => 'The :attribute field must be accepted.',
'accepted_if' => 'The :attribute field must be accepted when :other is :value.',
'active_url' => 'The :attribute field must be a valid URL.',
'after' => 'The :attribute field must be a date after :date.',
'after_or_equal' => 'The :attribute field must be a date after or equal to :date.',
'alpha' => 'The :attribute field must only contain letters.',
'alpha_dash' => 'The :attribute field must only contain letters, numbers, dashes, and underscores.',
'alpha_num' => 'The :attribute field must only contain letters and numbers.',
'array' => 'The :attribute field must be an array.',
'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.',
'before' => 'The :attribute field must be a date before :date.',
'before_or_equal' => 'The :attribute field must be a date before or equal to :date.',
'between' => [
'array' => 'The :attribute field must have between :min and :max items.',
'file' => 'The :attribute field must be between :min and :max kilobytes.',
'numeric' => 'The :attribute field must be between :min and :max.',
'string' => 'The :attribute field must be between :min and :max characters.',
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute field confirmation does not match.',
'current_password' => 'The password is incorrect.',
'date' => 'The :attribute field must be a valid date.',
'date_equals' => 'The :attribute field must be a date equal to :date.',
'date_format' => 'The :attribute field must match the format :format.',
'decimal' => 'The :attribute field must have :decimal decimal places.',
'declined' => 'The :attribute field must be declined.',
'declined_if' => 'The :attribute field must be declined when :other is :value.',
'different' => 'The :attribute field and :other must be different.',
'digits' => 'The :attribute field must be :digits digits.',
'digits_between' => 'The :attribute field must be between :min and :max digits.',
'dimensions' => 'The :attribute field has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'doesnt_end_with' => 'The :attribute field must not end with one of the following: :values.',
'doesnt_start_with' => 'The :attribute field must not start with one of the following: :values.',
'email' => 'The :attribute field must be a valid email address.',
'ends_with' => 'The :attribute field must end with one of the following: :values.',
'enum' => 'The selected :attribute is invalid.',
'exists' => 'The selected :attribute is invalid.',
'file' => 'The :attribute field must be a file.',
'filled' => 'The :attribute field must have a value.',
'gt' => [
'array' => 'The :attribute field must have more than :value items.',
'file' => 'The :attribute field must be greater than :value kilobytes.',
'numeric' => 'The :attribute field must be greater than :value.',
'string' => 'The :attribute field must be greater than :value characters.',
],
'gte' => [
'array' => 'The :attribute field must have :value items or more.',
'file' => 'The :attribute field must be greater than or equal to :value kilobytes.',
'numeric' => 'The :attribute field must be greater than or equal to :value.',
'string' => 'The :attribute field must be greater than or equal to :value characters.',
],
'image' => 'The :attribute field must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field must exist in :other.',
'integer' => 'The :attribute field must be an integer.',
'ip' => 'The :attribute field must be a valid IP address.',
'ipv4' => 'The :attribute field must be a valid IPv4 address.',
'ipv6' => 'The :attribute field must be a valid IPv6 address.',
'json' => 'The :attribute field must be a valid JSON string.',
'lowercase' => 'The :attribute field must be lowercase.',
'lt' => [
'array' => 'The :attribute field must have less than :value items.',
'file' => 'The :attribute field must be less than :value kilobytes.',
'numeric' => 'The :attribute field must be less than :value.',
'string' => 'The :attribute field must be less than :value characters.',
],
'lte' => [
'array' => 'The :attribute field must not have more than :value items.',
'file' => 'The :attribute field must be less than or equal to :value kilobytes.',
'numeric' => 'The :attribute field must be less than or equal to :value.',
'string' => 'The :attribute field must be less than or equal to :value characters.',
],
'mac_address' => 'The :attribute field must be a valid MAC address.',
'max' => [
'array' => 'The :attribute field must not have more than :max items.',
'file' => 'The :attribute field must not be greater than :max kilobytes.',
'numeric' => 'The :attribute field must not be greater than :max.',
'string' => 'The :attribute field must not be greater than :max characters.',
],
'max_digits' => 'The :attribute field must not have more than :max digits.',
'mimes' => 'The :attribute field must be a file of type: :values.',
'mimetypes' => 'The :attribute field must be a file of type: :values.',
'min' => [
'array' => 'The :attribute field must have at least :min items.',
'file' => 'The :attribute field must be at least :min kilobytes.',
'numeric' => 'The :attribute field must be at least :min.',
'string' => 'The :attribute field must be at least :min characters.',
],
'min_digits' => 'The :attribute field must have at least :min digits.',
'missing' => 'The :attribute field must be missing.',
'missing_if' => 'The :attribute field must be missing when :other is :value.',
'missing_unless' => 'The :attribute field must be missing unless :other is :value.',
'missing_with' => 'The :attribute field must be missing when :values is present.',
'missing_with_all' => 'The :attribute field must be missing when :values are present.',
'multiple_of' => 'The :attribute field must be a multiple of :value.',
'not_in' => 'The selected :attribute is invalid.',
'not_regex' => 'The :attribute field format is invalid.',
'numeric' => 'The :attribute field must be a number.',
'password' => [
'letters' => 'The :attribute field must contain at least one letter.',
'mixed' => 'The :attribute field must contain at least one uppercase and one lowercase letter.',
'numbers' => 'The :attribute field must contain at least one number.',
'symbols' => 'The :attribute field must contain at least one symbol.',
'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.',
],
'present' => 'The :attribute field must be present.',
'prohibited' => 'The :attribute field is prohibited.',
'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',
'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',
'prohibits' => 'The :attribute field prohibits :other from being present.',
'regex' => 'The :attribute field format is invalid.',
'required' => 'The :attribute field is required.',
'required_array_keys' => 'The :attribute field must contain entries for: :values.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_if_accepted' => 'The :attribute field is required when :other is accepted.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values are present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute field must match :other.',
'size' => [
'array' => 'The :attribute field must contain :size items.',
'file' => 'The :attribute field must be :size kilobytes.',
'numeric' => 'The :attribute field must be :size.',
'string' => 'The :attribute field must be :size characters.',
],
'starts_with' => 'The :attribute field must start with one of the following: :values.',
'string' => 'The :attribute field must be a string.',
'timezone' => 'The :attribute field must be a valid timezone.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'uppercase' => 'The :attribute field must be uppercase.',
'url' => 'The :attribute field must be a valid URL.',
'ulid' => 'The :attribute field must be a valid ULID.',
'uuid' => 'The :attribute field must be a valid UUID.',

/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/

'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],

/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/

'attributes' => [],

], [
'after' => '日付の前後関係が正しくありません',
'after_or_equal' => '日付の前後関係が正しくありません',
'before_or_equal' => '日付の前後関係が正しくありません',
'between' => [
'string' => ':min から :max 文字入力してください',
],
'date' => '日付を入力してください',
'email' => 'Emailの形式が正しくありません',
'enum' => '正しい項目を選択してください',
'exists' => '存在しません',
'max' => [
'string' => ':max 文字まで入力できます',
],
'numeric' => '数値を入力してください',
'required' => '必須項目です',
'size' => [
'string' => ':size 桁で入力してください.',
],
'string' => '文字を入力してください',
'unique' => 'すでに使われています',
]);

+ 5
- 0
routes/api.php Näytä tiedosto

@@ -24,3 +24,8 @@ RouteHelper::post('/season-ticket-contract/sticker-re-order', App\Http\Controlle
RouteHelper::post('/season-ticket-contract/parking-certificate-order', App\Http\Controllers\Web\SeasonTicketContract\ParkingCertificateOrderController::class);
RouteHelper::post('/season-ticket-contract/termination-order', App\Http\Controllers\Web\SeasonTicketContract\TerminationOrderController::class);
RouteHelper::post('/season-ticket-contract/update-vehicle-info-order', App\Http\Controllers\Web\SeasonTicketContract\UpdateVehicleInfoOrderController::class);

RouteHelper::get('/faq', App\Http\Controllers\Web\FAQ\FAQsController::class);
RouteHelper::get('/faq/genres', App\Http\Controllers\Web\FAQ\FAQGenresController::class);
RouteHelper::post('/ask', App\Http\Controllers\Web\FAQ\AskController::class);
RouteHelper::post('/upload/student-license-images', App\Http\Controllers\Web\Customer\UploadStudentLicenseImagesController::class);

+ 9
- 0
tests/Feature/KintoneAccessTest.php Näytä tiedosto

@@ -3,6 +3,7 @@
namespace Tests\Feature;

use App\Kintone\Models\Customer;
use App\Kintone\Models\FAQ;
use App\Kintone\Models\SeasonTicketContract;
use Illuminate\Support\Carbon;
use Tests\TestCase;
@@ -55,4 +56,12 @@ class KintoneAccessTest extends TestCase
$this->assertEquals("2023/05/01", $array['contract_start_date']);
$this->assertEquals("2121/12/31", $array['contract_end_date']);
}

public function test_app_form_field(): void
{

$options = FAQ::getDropDownOptions(FAQ::FIELD_GENRE);

$this->assertTrue(true);
}
}

Loading…
Peruuta
Tallenna