Skip to content

Commit ba1342a

Browse files
authored
Merge pull request #2177 from opensource-workshop/csv-import-report-evaluation
[課題管理]レポート評価のインポート機能を追加しました
2 parents 38f9bf9 + cffeee2 commit ba1342a

35 files changed

+4437
-2
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Enums;
4+
5+
use App\Enums\EnumsBase;
6+
7+
/**
8+
* 課題管理インポートタイプ
9+
*/
10+
final class LearningtaskImportType extends EnumsBase
11+
{
12+
// 定数メンバ
13+
const report = 'report';
14+
15+
// key/valueの連想配列
16+
const enum = [
17+
self::report => 'レポート評価',
18+
];
19+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
3+
namespace App\Plugins\User\Learningtasks\Contracts;
4+
5+
/**
6+
* 課題管理CSVインポートにおけるカラム定義を提供するクラスのためのインターフェース
7+
*
8+
* 実装クラスは、特定のインポートタイプ(例:レポート評価、試験評価)に応じた
9+
* ヘッダーリスト、カラムマッピング、基本的なバリデーションルールを提供する責務を持つ。
10+
*/
11+
interface ColumnDefinitionInterface
12+
{
13+
/**
14+
* 現在のコンテキスト(例: 課題投稿の設定など)に基づいて、
15+
* CSVで期待される(または処理対象となる)ヘッダーカラム名のリストを取得する。
16+
*
17+
* @return array ヘッダー文字列の配列。例: ['ログインID', '評価', '評価コメント']
18+
*/
19+
public function getHeaders(): array;
20+
21+
/**
22+
* この定義クラスが扱う可能性のある全てのCSVヘッダー名と、
23+
* それに対応する内部キー名の完全なマッピング配列を取得する。
24+
* Importer が列インデックスと内部キーを紐付けるために利用する。
25+
*
26+
* @return array ['CSVヘッダー名' => '内部キー名', ...]
27+
*/
28+
public function getColumnMap(): array;
29+
30+
/**
31+
* 指定されたCSVヘッダー名に対応する内部キー名を取得する。
32+
* マッピングが存在しない場合は null を返す。
33+
*
34+
* @param string $header_name CSVヘッダー名。例: '評価コメント'
35+
* @return string|null 内部キー名。例: 'comment'。見つからない場合は null。
36+
*/
37+
public function getInternalKey(string $header_name): ?string;
38+
39+
/**
40+
* このカラム定義(インポートタイプ)に対応する基本的なバリデーションルールを取得する。
41+
* ルールは内部キー名に対して定義された連想配列として返す。
42+
* Importer はこの基本ルールを利用してバリデーションを行う。
43+
*
44+
* @return array ['内部キー名' => ['ルール1', 'ルール2', ...], ...]
45+
* 例: ['userid' => ['required', 'exists:users,userid'], 'grade' => ['nullable']]
46+
*/
47+
public function getValidationRulesBase(): array;
48+
49+
/**
50+
* (任意) このカラム定義に対応するカスタムバリデーションメッセージを取得する。
51+
* メッセージは '内部キー名.ルール名' をキーとする連想配列で返す。
52+
* 実装クラスで不要な場合は空配列を返せば良い。
53+
*
54+
* @return array ['内部キー名.ルール名' => 'メッセージ文字列', ...]
55+
* 例: ['userid.required' => 'ログインIDは必須です。']
56+
*/
57+
public function getValidationMessages(): array;
58+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace App\Plugins\User\Learningtasks\Contracts;
4+
5+
use Illuminate\Validation\ValidationException;
6+
use Throwable;
7+
8+
/**
9+
* CSV行処理中の例外ハンドリング戦略を定義するインターフェース
10+
*/
11+
interface RowProcessorExceptionHandlerInterface
12+
{
13+
// 結果を表す定数
14+
public const OUTCOME_ERROR = 'error';
15+
public const OUTCOME_SKIP = 'skip';
16+
17+
// ログレベルを表す定数 (Log ファサードのメソッド名に合わせる)
18+
public const LOG_ERROR = 'error';
19+
public const LOG_WARN = 'warning';
20+
public const LOG_INFO = 'info';
21+
public const LOG_DEBUG = 'debug';
22+
23+
// 配列キーを示す定数
24+
public const KEY_OUTCOME = 'outcome';
25+
public const KEY_TYPE = 'type';
26+
public const KEY_LOG_LEVEL = 'logLevel';
27+
28+
/**
29+
* 捕捉された例外を処理し、その結果(エラーかスキップか、詳細タイプ、ログレベル)を返す。
30+
*
31+
* @param Throwable $e 捕捉された例外オブジェクト
32+
* @return array|null 処理方法を示す配列 ['outcome' => 'error'|'skip', 'type' => string, 'log_level' => string] を返す。
33+
* 処理できない/予期せぬ例外の場合は null を返すことも可能(その場合は Importer 側で 'unexpected_error' として扱われる)。
34+
*/
35+
public function handle(Throwable $e): ?array;
36+
37+
/**
38+
* ValidationException から整形済みのメッセージを取得するヘルパ
39+
* @param Throwable $e 捕捉された例外オブジェクト
40+
* @return string
41+
*/
42+
public function formatValidationMessage(ValidationException $e): string;
43+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace App\Plugins\User\Learningtasks\Contracts;
4+
5+
use App\Models\Common\Page;
6+
use App\Models\User\Learningtasks\LearningtasksPosts;
7+
use App\User;
8+
use Exception; // エラー発生時に基底例外を投げることを想定
9+
10+
/**
11+
* インポート時に検証済みのCSVデータ1行分を処理するためのインターフェース
12+
*/
13+
interface RowProcessorInterface
14+
{
15+
/**
16+
* 検証済みのデータ1行分を処理する。
17+
*
18+
* このメソッドの実装クラスが、CSVの1行に対応する
19+
* データベースレコードの検索、更新、または作成といった
20+
* コアなビジネスロジックを担当します。
21+
*
22+
* @param array $validated_data 検証済みデータ(内部キー名 => 値 の連想配列)
23+
* 例: ['userid' => '123', 'grade' => 'A', 'comment' => 'Good']
24+
* @param LearningtasksPosts $post インポート対象の課題投稿コンテキスト
25+
* @param User $importer インポート操作を実行しているユーザー (評価者ID等に利用)
26+
* @return void
27+
* @throws Exception 処理中にエラーが発生した場合 (例: 関連データが見つからない、DBエラー)。
28+
* より具体的なカスタム例外を定義して投げるのが望ましい。
29+
*/
30+
public function process(array $validated_data, LearningtasksPosts $post, Page $page, User $importer): void;
31+
}

0 commit comments

Comments
 (0)