<commit_before><?php

namespace App\Http\Controllers;

use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

use App\Http\Requests\BookCreateRequest as CreateRequest;
use App\Http\Requests\BookEditRequest as EditRequest;
use App\Http\Requests\BookDeleteRequest as DeleteRequest;

use App\Book;
use App\User;

use Facades\ {
    App\Libs\NDL
};

class BookActionController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * 本の登録に必要な書籍番号とユーザー情報を含んだヘッダを生成する。
     *
     * @return array
     */
    public function getHeader()
    {
        return [
            'id' => \Auth::user()['next_id'],
            'user_id' => \Auth::id(),
        ];
    }

    /**
     * 登録済みの本の一覧を返す。
     *
     * @param Request $request
     * @return array
     */
    public function index(Request $request)
    {
        if (isset($request->offset) && isset($request->limit)) {
            $books = Book::offset($request->offset)
                ->limit($request->limit)
                ->get();
        } else {
            $books = Book::get();
        }

        return [
            'data' => $books,
            'total' => Book::count(),
        ];
    }

    /**
     * 本を登録する。
     * DB上にすでに登録されていた場合は409、
     * 国会図書館に存在しない場合は404を返す。
     *
     * @param CreateRequest $request
     * @param return Book|Response
     */
    public function create(CreateRequest $request)
    {
        $book = NDL::query($request->code);
        if (isset($book)) {
            try {
                $book = array_merge($this->getHeader(), $book);
                Book::create($book);

                $user = \Auth::user();
                $user->next_id++;
                $user->save();

                return [ 'response' => $book, 'statusCode' => 200 ];
            } catch (QueryException $e) {
                return [ 'response' => $book, 'statusCode' => 409 ];
            }
        } else {
            return [ 'response' => NULL, 'statusCode' => 404 ];
        }
    }

    /**
     * 登録済みの本を編集する。
     *
     * @param EditRequest $request
     * @return Book
     */
    public function edit(EditRequest $request)
    {
        $book = Book::find($request->id);
        $book->fill($request->all())->save();

        return $book;
    }

    /**
     * 登録されている本を削除する。
     * 削除に成功した場合は204、他のセッションで削除済みの場合は404を返す。
     *
     * @param DeleteRequest $request
     * @return Response
     */
    public function delete(DeleteRequest $request)
    {
        \DB::beginTransaction();
        try {
            Book::destroy($request->ids);

            return response(\DB::commit(), 204);
        } catch (\Exception $e) {
            return response(\DB::rollback(), 400);
        }
    }
}<commit_msg>一括削除が失敗した時は DB をロールバックするように<commit_after><?php

namespace App\Http\Controllers;

use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

use App\Http\Requests\BookCreateRequest as CreateRequest;
use App\Http\Requests\BookEditRequest as EditRequest;
use App\Http\Requests\BookDeleteRequest as DeleteRequest;

use App\Book;
use App\User;

use Facades\ {
    App\Libs\NDL
};

class BookActionController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * 本の登録に必要な書籍番号とユーザー情報を含んだヘッダを生成する。
     *
     * @return array
     */
    public function getHeader()
    {
        return [
            'id' => \Auth::user()['next_id'],
            'user_id' => \Auth::id(),
        ];
    }

    /**
     * 登録済みの本の一覧を返す。
     *
     * @param Request $request
     * @return array
     */
    public function index(Request $request)
    {
        if (isset($request->offset) && isset($request->limit)) {
            $books = Book::offset($request->offset)
                ->limit($request->limit)
                ->get();
        } else {
            $books = Book::get();
        }

        return [
            'data' => $books,
            'total' => Book::count(),
        ];
    }

    /**
     * 本を登録する。
     * DB上にすでに登録されていた場合は409、
     * 国会図書館に存在しない場合は404を返す。
     *
     * @param CreateRequest $request
     * @param return Book|Response
     */
    public function create(CreateRequest $request)
    {
        $book = NDL::query($request->code);
        if (isset($book)) {
            try {
                $book = array_merge($this->getHeader(), $book);
                Book::create($book);

                $user = \Auth::user();
                $user->next_id++;
                $user->save();

                return [ 'response' => $book, 'statusCode' => 200 ];
            } catch (QueryException $e) {
                return [ 'response' => $book, 'statusCode' => 409 ];
            }
        } else {
            return [ 'response' => NULL, 'statusCode' => 404 ];
        }
    }

    /**
     * 登録済みの本を編集する。
     *
     * @param EditRequest $request
     * @return Book
     */
    public function edit(EditRequest $request)
    {
        $book = Book::find($request->id);
        $book->fill($request->all())->save();

        return $book;
    }

    /**
     * 登録されている本を削除する。
     * 削除に成功した場合は204、他のセッションで削除済みの場合は404を返す。
     *
     * @param DeleteRequest $request
     * @return Response
     */
    public function delete(DeleteRequest $request)
    {
        \DB::beginTransaction();
        try {
            if(!Book::destroy($request->ids)) {
                return response(\DB::rollback(), 400);
            }

            return response(\DB::commit(), 204);
        } catch (\Exception $e) {
            return response(\DB::rollback(), 500);
        }
    }
}
{'fraction_non_alphanumeric': 0.14436320353681348, 'fraction_numerical': 0.009692229212718926, 'mean_word_length': 1.7810874704491726, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 55, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3621925', 'n_tokens_mistral': 1999, 'n_tokens_neox': 1962, 'n_words': 329}