using System; using Microsoft.EntityFrameworkCore.Migrations; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; #nullable disable namespace UniVerse.Infrastructure.Data.Migrations { /// public partial class Initial : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AlterDatabase() .Annotation("Npgsql:Enum:coin_transaction_type.coin_transaction_type", "review_reward,achievement_reward,attendance_reward,admin_adjustment") .Annotation("Npgsql:Enum:review_llm_status.review_llm_status", "pending,analyzed,rejected") .Annotation("Npgsql:Enum:review_sentiment.review_sentiment", "positive,neutral,negative") .Annotation("Npgsql:Enum:tag_type.tag_type", "institute,faculty,subject,organization,topic,other") .Annotation("Npgsql:Enum:user_role.user_role", "student,teacher,admin"); migrationBuilder.CreateTable( name: "achievements", columns: table => new { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), name = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), description = table.Column(type: "text", nullable: true), icon_url = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), xp_reward = table.Column(type: "integer", nullable: false, defaultValue: 0), coin_reward = table.Column(type: "integer", nullable: false, defaultValue: 0), condition = table.Column(type: "text", nullable: true), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()") }, constraints: table => { table.PrimaryKey("PK_achievements", x => x.id); }); migrationBuilder.CreateTable( name: "courses", columns: table => new { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), name = table.Column(type: "character varying(500)", maxLength: 500, nullable: false), description = table.Column(type: "text", nullable: true), external_id = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), is_synced = table.Column(type: "boolean", nullable: false, defaultValue: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()") }, constraints: table => { table.PrimaryKey("PK_courses", x => x.id); }); migrationBuilder.CreateTable( name: "locations", columns: table => new { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), name = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), building = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), room = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), address = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), external_id = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()") }, constraints: table => { table.PrimaryKey("PK_locations", x => x.id); }); migrationBuilder.CreateTable( name: "tags", columns: table => new { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), name = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), type = table.Column(type: "integer", nullable: false), parent_id = table.Column(type: "integer", nullable: true), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()") }, constraints: table => { table.PrimaryKey("PK_tags", x => x.id); table.ForeignKey( name: "FK_tags_tags_parent_id", column: x => x.parent_id, principalTable: "tags", principalColumn: "id", onDelete: ReferentialAction.SetNull); }); migrationBuilder.CreateTable( name: "users", columns: table => new { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), email = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), display_name = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), avatar_url = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), role = table.Column(type: "integer", nullable: false), is_active = table.Column(type: "boolean", nullable: false, defaultValue: true), microsoft_id = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), xp = table.Column(type: "integer", nullable: false, defaultValue: 0), coins = table.Column(type: "integer", nullable: false, defaultValue: 0), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()") }, constraints: table => { table.PrimaryKey("PK_users", x => x.id); }); migrationBuilder.CreateTable( name: "course_tags", columns: table => new { course_id = table.Column(type: "integer", nullable: false), tag_id = table.Column(type: "integer", nullable: false), id = table.Column(type: "integer", nullable: false) }, constraints: table => { table.PrimaryKey("PK_course_tags", x => new { x.course_id, x.tag_id }); table.ForeignKey( name: "FK_course_tags_courses_course_id", column: x => x.course_id, principalTable: "courses", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_course_tags_tags_tag_id", column: x => x.tag_id, principalTable: "tags", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "lectures", columns: table => new { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), course_id = table.Column(type: "integer", nullable: false), teacher_id = table.Column(type: "integer", nullable: true), location_id = table.Column(type: "integer", nullable: true), title = table.Column(type: "character varying(500)", maxLength: 500, nullable: false), description = table.Column(type: "text", nullable: true), format = table.Column(type: "integer", nullable: false), starts_at = table.Column(type: "timestamp with time zone", nullable: false), ends_at = table.Column(type: "timestamp with time zone", nullable: false), is_open = table.Column(type: "boolean", nullable: false, defaultValue: true), max_enrollments = table.Column(type: "integer", nullable: false, defaultValue: 0), external_id = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), online_url = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()") }, constraints: table => { table.PrimaryKey("PK_lectures", x => x.id); table.ForeignKey( name: "FK_lectures_courses_course_id", column: x => x.course_id, principalTable: "courses", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_lectures_locations_location_id", column: x => x.location_id, principalTable: "locations", principalColumn: "id", onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "FK_lectures_users_teacher_id", column: x => x.teacher_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.SetNull); }); migrationBuilder.CreateTable( name: "refresh_tokens", columns: table => new { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), user_id = table.Column(type: "integer", nullable: false), token = table.Column(type: "character varying(500)", maxLength: 500, nullable: false), expires_at = table.Column(type: "timestamp with time zone", nullable: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()"), revoked_at = table.Column(type: "timestamp with time zone", nullable: true) }, constraints: table => { table.PrimaryKey("PK_refresh_tokens", x => x.id); table.ForeignKey( name: "FK_refresh_tokens_users_user_id", column: x => x.user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "student_profiles", columns: table => new { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), user_id = table.Column(type: "integer", nullable: false), student_id = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), group_name = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), enrollment_year = table.Column(type: "integer", nullable: true), faculty = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), specialty = table.Column(type: "character varying(255)", maxLength: 255, nullable: true) }, constraints: table => { table.PrimaryKey("PK_student_profiles", x => x.id); table.ForeignKey( name: "FK_student_profiles_users_user_id", column: x => x.user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "teacher_profiles", columns: table => new { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), user_id = table.Column(type: "integer", nullable: false), department = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), title = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), bio = table.Column(type: "text", nullable: true), modeus_id = table.Column(type: "character varying(255)", maxLength: 255, nullable: true) }, constraints: table => { table.PrimaryKey("PK_teacher_profiles", x => x.id); table.ForeignKey( name: "FK_teacher_profiles_users_user_id", column: x => x.user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "user_achievements", columns: table => new { user_id = table.Column(type: "integer", nullable: false), achievement_id = table.Column(type: "integer", nullable: false), id = table.Column(type: "integer", nullable: false), awarded_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()") }, constraints: table => { table.PrimaryKey("PK_user_achievements", x => new { x.user_id, x.achievement_id }); table.ForeignKey( name: "FK_user_achievements_achievements_achievement_id", column: x => x.achievement_id, principalTable: "achievements", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_user_achievements_users_user_id", column: x => x.user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "lecture_enrollments", columns: table => new { lecture_id = table.Column(type: "integer", nullable: false), user_id = table.Column(type: "integer", nullable: false), id = table.Column(type: "integer", nullable: false), attended = table.Column(type: "boolean", nullable: false, defaultValue: false), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()") }, constraints: table => { table.PrimaryKey("PK_lecture_enrollments", x => new { x.lecture_id, x.user_id }); table.ForeignKey( name: "FK_lecture_enrollments_lectures_lecture_id", column: x => x.lecture_id, principalTable: "lectures", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_lecture_enrollments_users_user_id", column: x => x.user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "reviews", columns: table => new { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), lecture_id = table.Column(type: "integer", nullable: false), user_id = table.Column(type: "integer", nullable: false), rating = table.Column(type: "integer", nullable: false), text = table.Column(type: "text", nullable: true), llm_status = table.Column(type: "integer", nullable: false, defaultValue: 0), sentiment = table.Column(type: "integer", nullable: true), quality_score = table.Column(type: "double precision", nullable: true), is_informative = table.Column(type: "boolean", nullable: true), llm_tags = table.Column(type: "text[]", nullable: true), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()"), updated_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()") }, constraints: table => { table.PrimaryKey("PK_reviews", x => x.id); table.ForeignKey( name: "FK_reviews_lectures_lecture_id", column: x => x.lecture_id, principalTable: "lectures", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_reviews_users_user_id", column: x => x.user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "coin_transactions", columns: table => new { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), user_id = table.Column(type: "integer", nullable: false), amount = table.Column(type: "integer", nullable: false), type = table.Column(type: "integer", nullable: false), review_id = table.Column(type: "integer", nullable: true), achievement_id = table.Column(type: "integer", nullable: true), description = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), created_at = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "NOW()") }, constraints: table => { table.PrimaryKey("PK_coin_transactions", x => x.id); table.ForeignKey( name: "FK_coin_transactions_achievements_achievement_id", column: x => x.achievement_id, principalTable: "achievements", principalColumn: "id", onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "FK_coin_transactions_reviews_review_id", column: x => x.review_id, principalTable: "reviews", principalColumn: "id", onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "FK_coin_transactions_users_user_id", column: x => x.user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateIndex( name: "IX_coin_transactions_achievement_id", table: "coin_transactions", column: "achievement_id"); migrationBuilder.CreateIndex( name: "IX_coin_transactions_review_id", table: "coin_transactions", column: "review_id"); migrationBuilder.CreateIndex( name: "IX_coin_transactions_user_id", table: "coin_transactions", column: "user_id"); migrationBuilder.CreateIndex( name: "IX_course_tags_course_id_tag_id", table: "course_tags", columns: new[] { "course_id", "tag_id" }, unique: true); migrationBuilder.CreateIndex( name: "IX_course_tags_tag_id", table: "course_tags", column: "tag_id"); migrationBuilder.CreateIndex( name: "IX_courses_external_id", table: "courses", column: "external_id", unique: true, filter: "external_id IS NOT NULL"); migrationBuilder.CreateIndex( name: "IX_lecture_enrollments_lecture_id_user_id", table: "lecture_enrollments", columns: new[] { "lecture_id", "user_id" }, unique: true); migrationBuilder.CreateIndex( name: "IX_lecture_enrollments_user_id", table: "lecture_enrollments", column: "user_id"); migrationBuilder.CreateIndex( name: "IX_lectures_course_id", table: "lectures", column: "course_id"); migrationBuilder.CreateIndex( name: "IX_lectures_external_id", table: "lectures", column: "external_id", unique: true, filter: "external_id IS NOT NULL"); migrationBuilder.CreateIndex( name: "IX_lectures_location_id", table: "lectures", column: "location_id"); migrationBuilder.CreateIndex( name: "IX_lectures_starts_at", table: "lectures", column: "starts_at"); migrationBuilder.CreateIndex( name: "IX_lectures_teacher_id", table: "lectures", column: "teacher_id"); migrationBuilder.CreateIndex( name: "IX_locations_external_id", table: "locations", column: "external_id", unique: true, filter: "external_id IS NOT NULL"); migrationBuilder.CreateIndex( name: "IX_refresh_tokens_token", table: "refresh_tokens", column: "token", unique: true); migrationBuilder.CreateIndex( name: "IX_refresh_tokens_user_id", table: "refresh_tokens", column: "user_id"); migrationBuilder.CreateIndex( name: "IX_reviews_lecture_id_user_id", table: "reviews", columns: new[] { "lecture_id", "user_id" }, unique: true); migrationBuilder.CreateIndex( name: "IX_reviews_llm_status", table: "reviews", column: "llm_status"); migrationBuilder.CreateIndex( name: "IX_reviews_user_id", table: "reviews", column: "user_id"); migrationBuilder.CreateIndex( name: "IX_student_profiles_user_id", table: "student_profiles", column: "user_id", unique: true); migrationBuilder.CreateIndex( name: "IX_tags_parent_id", table: "tags", column: "parent_id"); migrationBuilder.CreateIndex( name: "IX_teacher_profiles_user_id", table: "teacher_profiles", column: "user_id", unique: true); migrationBuilder.CreateIndex( name: "IX_user_achievements_achievement_id", table: "user_achievements", column: "achievement_id"); migrationBuilder.CreateIndex( name: "IX_user_achievements_user_id_achievement_id", table: "user_achievements", columns: new[] { "user_id", "achievement_id" }, unique: true); migrationBuilder.CreateIndex( name: "IX_users_email", table: "users", column: "email", unique: true); migrationBuilder.CreateIndex( name: "IX_users_microsoft_id", table: "users", column: "microsoft_id", unique: true, filter: "microsoft_id IS NOT NULL"); } /// protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( name: "coin_transactions"); migrationBuilder.DropTable( name: "course_tags"); migrationBuilder.DropTable( name: "lecture_enrollments"); migrationBuilder.DropTable( name: "refresh_tokens"); migrationBuilder.DropTable( name: "student_profiles"); migrationBuilder.DropTable( name: "teacher_profiles"); migrationBuilder.DropTable( name: "user_achievements"); migrationBuilder.DropTable( name: "reviews"); migrationBuilder.DropTable( name: "tags"); migrationBuilder.DropTable( name: "achievements"); migrationBuilder.DropTable( name: "lectures"); migrationBuilder.DropTable( name: "courses"); migrationBuilder.DropTable( name: "locations"); migrationBuilder.DropTable( name: "users"); } } }