| @@ -0,0 +1,96 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\LoginUser; | |||||
| use App\Codes\UserRole; | |||||
| use App\Exceptions\AppCommonException; | |||||
| use App\Exceptions\ExclusiveException; | |||||
| use App\Features\LoginUser; | |||||
| use App\Http\Controllers\Web\IParam; | |||||
| use App\Http\Controllers\Web\WebController; | |||||
| use App\Logic\User\LoginUserManager; | |||||
| use App\Repositories\LoginUserRepository; | |||||
| use Illuminate\Http\JsonResponse; | |||||
| use Illuminate\Http\Request; | |||||
| use Illuminate\Support\Facades\Auth; | |||||
| class ChangePasswordController extends WebController | |||||
| { | |||||
| use LoginUser; | |||||
| public function name(): string | |||||
| { | |||||
| return "ログインユーザーパスワード変更"; | |||||
| } | |||||
| public function description(): string | |||||
| { | |||||
| return "ログインユーザーのパスワードを変更する"; | |||||
| } | |||||
| public function __construct( | |||||
| protected ChangePasswordParam $param, | |||||
| private LoginUserManager $manager | |||||
| ) { | |||||
| parent::__construct(); | |||||
| $this->roleAllow(UserRole::NORMAL_ADMIN); | |||||
| } | |||||
| protected function getParam(): IParam | |||||
| { | |||||
| return $this->param; | |||||
| } | |||||
| protected function run(Request $request): JsonResponse | |||||
| { | |||||
| $param = $this->param; | |||||
| try { | |||||
| $this->transaction->beginTransaction(); | |||||
| $currentContract = $this->loginUser()->getCurrentContract(); | |||||
| if (!$currentContract) { | |||||
| throw new AppCommonException("認証不正"); | |||||
| } | |||||
| $this->manager->initForModify($currentContract, $this->getTartgetUserId()); | |||||
| if (!$this->param->checkTimestamp($this->manager->getTimestamp())) { | |||||
| throw new ExclusiveException(); | |||||
| } | |||||
| $messages = $this->manager | |||||
| ->fill($param->toArray()) | |||||
| ->update(); | |||||
| if (count($messages) !== 0) { | |||||
| $this->transaction->rollBack(); | |||||
| return $this->validateErrorResponse($messages); | |||||
| } | |||||
| $this->transaction->commit(); | |||||
| } catch (Exception $e) { | |||||
| $this->transaction->rollBack(); | |||||
| throw $e; | |||||
| } | |||||
| return $this->successResponse(); | |||||
| } | |||||
| private function getTartgetUserId(): string | |||||
| { | |||||
| $loginUserRole = $this->loginUser()->user()->role; | |||||
| if ($this->param->id !== null) { | |||||
| if ($loginUserRole === UserRole::CONTRACT_ADMIN || $loginUserRole === UserRole::SUPER_ADMIN) { | |||||
| return $this->param->id; | |||||
| } else { | |||||
| throw new AppCommonException('認証不正'); | |||||
| } | |||||
| } | |||||
| return $this->loginUser()->user()->id; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,29 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\LoginUser; | |||||
| use App\Http\Controllers\Web\BaseParam; | |||||
| use App\Models\User; | |||||
| use App\Rules\LoginPassword; | |||||
| use Illuminate\Support\Carbon; | |||||
| /** | |||||
| * @property string $password | |||||
| * @property string? $id | |||||
| * @property Carbon $timestamp | |||||
| */ | |||||
| class ChangePasswordParam extends BaseParam | |||||
| { | |||||
| public function rules(): array | |||||
| { | |||||
| return array_merge( | |||||
| [ | |||||
| User::COL_NAME_PASSWORD => $this->str([new LoginPassword()]), | |||||
| User::COL_NAME_ID => $this->str(true), | |||||
| ], | |||||
| $this->timestamp() | |||||
| ); | |||||
| } | |||||
| } | |||||
| @@ -2,8 +2,10 @@ | |||||
| namespace App\Repositories; | namespace App\Repositories; | ||||
| use App\Models\Contract; | |||||
| use App\Models\User; | use App\Models\User; | ||||
| use App\Repositories\BaseRepository; | use App\Repositories\BaseRepository; | ||||
| use Illuminate\Database\Query\JoinClause; | |||||
| use Illuminate\Support\Collection; | use Illuminate\Support\Collection; | ||||
| use Illuminate\Support\Facades\DB; | use Illuminate\Support\Facades\DB; | ||||
| @@ -18,6 +20,7 @@ class LoginUserRepository extends BaseRepository | |||||
| const CONDITION_CONTRACT_ID = 'contract_id'; | const CONDITION_CONTRACT_ID = 'contract_id'; | ||||
| const TABLE_USER = "user"; | const TABLE_USER = "user"; | ||||
| const TABLE_CONTRACT = 'contract'; | |||||
| /** | /** | ||||
| @@ -30,6 +33,12 @@ class LoginUserRepository extends BaseRepository | |||||
| { | { | ||||
| $table = User::getBuilder(static::TABLE_USER); | $table = User::getBuilder(static::TABLE_USER); | ||||
| $table->joinSub(Contract::getBuilder(), static::TABLE_CONTRACT, function (JoinClause $join) { | |||||
| $join->on( | |||||
| $this->makeColumnName([static::TABLE_USER, User::COL_NAME_CONTRACT_ID]), | |||||
| $this->makeColumnName([static::TABLE_CONTRACT, Contract::COL_NAME_ID]) | |||||
| ); | |||||
| }); | |||||
| // -----検索条件 | // -----検索条件 | ||||
| // ID | // ID | ||||
| @@ -67,12 +76,23 @@ class LoginUserRepository extends BaseRepository | |||||
| private function columns() | private function columns() | ||||
| { | { | ||||
| $user = static::TABLE_USER; | $user = static::TABLE_USER; | ||||
| $contract = static::TABLE_CONTRACT; | |||||
| $columns = [ | $columns = [ | ||||
| $this->makeColumnNameForSelect([$user, User::COL_NAME_ID]), | $this->makeColumnNameForSelect([$user, User::COL_NAME_ID]), | ||||
| $this->makeColumnNameForSelect([$user, User::COL_NAME_NAME]), | $this->makeColumnNameForSelect([$user, User::COL_NAME_NAME]), | ||||
| $this->makeColumnNameForSelect([$user, User::COL_NAME_ROLE]), | $this->makeColumnNameForSelect([$user, User::COL_NAME_ROLE]), | ||||
| $this->makeColumnNameForSelect([$user, User::COL_NAME_EMAIL]), | $this->makeColumnNameForSelect([$user, User::COL_NAME_EMAIL]), | ||||
| $this->makeColumnNameForSelect([$user, User::COL_NAME_UPDATED_AT]), | |||||
| // 契約とログイン情報の大きい方 | |||||
| DB::raw( | |||||
| sprintf( | |||||
| 'GREATEST("%s"."%s","%s"."%s") as updated_at', | |||||
| $user, | |||||
| User::COL_NAME_UPDATED_AT, | |||||
| $contract, | |||||
| Contract::COL_NAME_UPDATED_AT, | |||||
| ) | |||||
| ), | |||||
| ]; | ]; | ||||
| @@ -32,6 +32,7 @@ RouteHelper::get('/contracts', App\Http\Controllers\Web\Contract\ContractsContro | |||||
| RouteHelper::get('/users', App\Http\Controllers\Web\LoginUser\LoginUsersController::class); | RouteHelper::get('/users', App\Http\Controllers\Web\LoginUser\LoginUsersController::class); | ||||
| RouteHelper::post('/user/create', App\Http\Controllers\Web\LoginUser\CreateController::class); | RouteHelper::post('/user/create', App\Http\Controllers\Web\LoginUser\CreateController::class); | ||||
| RouteHelper::post('/user/change-password', App\Http\Controllers\Web\LoginUser\ChangePasswordController::class); | |||||
| // Custom for HelloTechno | // Custom for HelloTechno | ||||