20260522114117_AddStoreSchema.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  1. using System;
  2. using Microsoft.EntityFrameworkCore.Migrations;
  3. #nullable disable
  4. namespace Infrastructure.Migrations.AppDb
  5. {
  6. /// <inheritdoc />
  7. public partial class AddStoreSchema : Migration
  8. {
  9. /// <inheritdoc />
  10. protected override void Up(MigrationBuilder migrationBuilder)
  11. {
  12. migrationBuilder.AddColumn<int>(
  13. name: "DonationAmount",
  14. table: "WithdrawalRequest",
  15. type: "int",
  16. nullable: false,
  17. defaultValue: 0,
  18. comment: "후원 수익(Donation) 잔액에서 차감되는 금액");
  19. migrationBuilder.AddColumn<int>(
  20. name: "StoreRevenueAmount",
  21. table: "WithdrawalRequest",
  22. type: "int",
  23. nullable: false,
  24. defaultValue: 0,
  25. comment: "상품 판매 수익(StoreRevenue) 잔액에서 차감되는 금액");
  26. migrationBuilder.CreateTable(
  27. name: "Game",
  28. columns: table => new
  29. {
  30. ID = table.Column<int>(type: "int", nullable: false)
  31. .Annotation("SqlServer:Identity", "1, 1"),
  32. Name = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false, comment: "게임 이름"),
  33. Publisher = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false, comment: "게임사/퍼블리셔"),
  34. Thumbnail = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true),
  35. Description = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: true),
  36. CommissionRate = table.Column<decimal>(type: "decimal(5,2)", precision: 5, scale: 2, nullable: false, comment: "게임사 수익률(%)"),
  37. ChannelCommissionRate = table.Column<decimal>(type: "decimal(5,2)", precision: 5, scale: 2, nullable: false, comment: "후원 채널 보상률(%)"),
  38. IsActive = table.Column<bool>(type: "bit", nullable: false),
  39. Order = table.Column<int>(type: "int", nullable: false),
  40. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
  41. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true)
  42. },
  43. constraints: table =>
  44. {
  45. table.PrimaryKey("PK_Game", x => x.ID);
  46. },
  47. comment: "상점 제휴 게임");
  48. migrationBuilder.CreateTable(
  49. name: "MemberAddress",
  50. columns: table => new
  51. {
  52. ID = table.Column<int>(type: "int", nullable: false)
  53. .Annotation("SqlServer:Identity", "1, 1"),
  54. MemberID = table.Column<int>(type: "int", nullable: false),
  55. IsDefault = table.Column<bool>(type: "bit", nullable: false),
  56. RecipientName_Encrypted = table.Column<string>(type: "nvarchar(max)", nullable: false, comment: "수령인명 (암호화)"),
  57. RecipientName_Hash = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false, comment: "수령인명 SHA-256 hex (검색용)"),
  58. Phone_Encrypted = table.Column<string>(type: "nvarchar(max)", nullable: false, comment: "연락처 (암호화)"),
  59. ZipCode = table.Column<string>(type: "nvarchar(10)", maxLength: 10, nullable: false),
  60. Address1_Encrypted = table.Column<string>(type: "nvarchar(max)", nullable: false, comment: "기본 주소 (암호화)"),
  61. Address2_Encrypted = table.Column<string>(type: "nvarchar(max)", nullable: false, comment: "상세 주소 (암호화)"),
  62. KeyVersion = table.Column<int>(type: "int", nullable: false, comment: "암호화 키 버전"),
  63. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
  64. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true)
  65. },
  66. constraints: table =>
  67. {
  68. table.PrimaryKey("PK_MemberAddress", x => x.ID);
  69. table.ForeignKey(
  70. name: "FK_MemberAddress_Member_MemberID",
  71. column: x => x.MemberID,
  72. principalTable: "Member",
  73. principalColumn: "ID",
  74. onDelete: ReferentialAction.Cascade);
  75. },
  76. comment: "회원 배송 주소 (AES-GCM 암호화)");
  77. migrationBuilder.CreateTable(
  78. name: "Order",
  79. columns: table => new
  80. {
  81. ID = table.Column<int>(type: "int", nullable: false)
  82. .Annotation("SqlServer:Identity", "1, 1"),
  83. OrderNumber = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: false, comment: "주문 번호 (UNIQUE)"),
  84. MemberID = table.Column<int>(type: "int", nullable: false),
  85. ChannelID = table.Column<int>(type: "int", nullable: true, comment: "후원 채널 (선택)"),
  86. TotalAmount = table.Column<int>(type: "int", nullable: false, comment: "총 결제 금액"),
  87. PlatformFeeAmount = table.Column<int>(type: "int", nullable: false, comment: "dpot 몫"),
  88. GameRevenueAmount = table.Column<int>(type: "int", nullable: false, comment: "게임사 정산 큐 적재 금액"),
  89. ChannelRewardAmount = table.Column<int>(type: "int", nullable: false, comment: "채널주 StoreRevenue 입금 금액"),
  90. Status = table.Column<int>(type: "int", nullable: false, comment: "주문 상태"),
  91. CancelReason = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true),
  92. RefundReason = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true),
  93. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
  94. PaidAt = table.Column<DateTime>(type: "datetime2", nullable: true),
  95. RowVersion = table.Column<byte[]>(type: "rowversion", rowVersion: true, nullable: false)
  96. },
  97. constraints: table =>
  98. {
  99. table.PrimaryKey("PK_Order", x => x.ID);
  100. table.ForeignKey(
  101. name: "FK_Order_Channel_ChannelID",
  102. column: x => x.ChannelID,
  103. principalTable: "Channel",
  104. principalColumn: "ID");
  105. table.ForeignKey(
  106. name: "FK_Order_Member_MemberID",
  107. column: x => x.MemberID,
  108. principalTable: "Member",
  109. principalColumn: "ID",
  110. onDelete: ReferentialAction.Restrict);
  111. },
  112. comment: "상점 주문 헤더");
  113. migrationBuilder.CreateTable(
  114. name: "GameSettlement",
  115. columns: table => new
  116. {
  117. ID = table.Column<int>(type: "int", nullable: false)
  118. .Annotation("SqlServer:Identity", "1, 1"),
  119. GameID = table.Column<int>(type: "int", nullable: false),
  120. Year = table.Column<int>(type: "int", nullable: false),
  121. Month = table.Column<int>(type: "int", nullable: false),
  122. TotalRevenueAmount = table.Column<int>(type: "int", nullable: false),
  123. OrderCount = table.Column<int>(type: "int", nullable: false),
  124. Status = table.Column<int>(type: "int", nullable: false, comment: "정산 상태 (1=Pending, 2=Settled)"),
  125. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
  126. SettledAt = table.Column<DateTime>(type: "datetime2", nullable: true),
  127. SettledByAdminID = table.Column<int>(type: "int", nullable: true),
  128. AdminMemo = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true)
  129. },
  130. constraints: table =>
  131. {
  132. table.PrimaryKey("PK_GameSettlement", x => x.ID);
  133. table.ForeignKey(
  134. name: "FK_GameSettlement_Game_GameID",
  135. column: x => x.GameID,
  136. principalTable: "Game",
  137. principalColumn: "ID",
  138. onDelete: ReferentialAction.Restrict);
  139. table.ForeignKey(
  140. name: "FK_GameSettlement_Member_SettledByAdminID",
  141. column: x => x.SettledByAdminID,
  142. principalTable: "Member",
  143. principalColumn: "ID");
  144. },
  145. comment: "게임사 월별 정산 큐");
  146. migrationBuilder.CreateTable(
  147. name: "Product",
  148. columns: table => new
  149. {
  150. ID = table.Column<int>(type: "int", nullable: false)
  151. .Annotation("SqlServer:Identity", "1, 1"),
  152. GameID = table.Column<int>(type: "int", nullable: false, comment: "게임 ID (필수)"),
  153. Name = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false, comment: "상품명"),
  154. Description = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: true),
  155. Thumbnail = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true),
  156. Type = table.Column<int>(type: "int", nullable: false, comment: "상품 유형 (1=Physical, 2=Digital)"),
  157. Price = table.Column<int>(type: "int", nullable: false, comment: "판매가 (KRW)"),
  158. Stock = table.Column<int>(type: "int", nullable: false, comment: "재고 (-1=무제한)"),
  159. IsActive = table.Column<bool>(type: "bit", nullable: false),
  160. Order = table.Column<int>(type: "int", nullable: false),
  161. SaleStartAt = table.Column<DateTime>(type: "datetime2", nullable: true),
  162. SaleEndAt = table.Column<DateTime>(type: "datetime2", nullable: true),
  163. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
  164. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true),
  165. RowVersion = table.Column<byte[]>(type: "rowversion", rowVersion: true, nullable: false)
  166. },
  167. constraints: table =>
  168. {
  169. table.PrimaryKey("PK_Product", x => x.ID);
  170. table.ForeignKey(
  171. name: "FK_Product_Game_GameID",
  172. column: x => x.GameID,
  173. principalTable: "Game",
  174. principalColumn: "ID",
  175. onDelete: ReferentialAction.Restrict);
  176. },
  177. comment: "상점 상품");
  178. migrationBuilder.CreateTable(
  179. name: "OrderRefund",
  180. columns: table => new
  181. {
  182. ID = table.Column<int>(type: "int", nullable: false)
  183. .Annotation("SqlServer:Identity", "1, 1"),
  184. OrderID = table.Column<int>(type: "int", nullable: false),
  185. Type = table.Column<int>(type: "int", nullable: false, comment: "유형 (1=Cancel, 2=Return, 3=Exchange, 4=Refund)"),
  186. Status = table.Column<int>(type: "int", nullable: false, comment: "상태 (1=Requested, 2=Approved, 3=Rejected, 4=Completed)"),
  187. Amount = table.Column<int>(type: "int", nullable: false),
  188. Reason = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: false),
  189. AdminMemo = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true),
  190. AdminID = table.Column<int>(type: "int", nullable: true),
  191. RequestedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
  192. ResolvedAt = table.Column<DateTime>(type: "datetime2", nullable: true)
  193. },
  194. constraints: table =>
  195. {
  196. table.PrimaryKey("PK_OrderRefund", x => x.ID);
  197. table.ForeignKey(
  198. name: "FK_OrderRefund_Member_AdminID",
  199. column: x => x.AdminID,
  200. principalTable: "Member",
  201. principalColumn: "ID");
  202. table.ForeignKey(
  203. name: "FK_OrderRefund_Order_OrderID",
  204. column: x => x.OrderID,
  205. principalTable: "Order",
  206. principalColumn: "ID",
  207. onDelete: ReferentialAction.Cascade);
  208. },
  209. comment: "통합 환불 이력 (취소/반품/교환/환불)");
  210. migrationBuilder.CreateTable(
  211. name: "Shipment",
  212. columns: table => new
  213. {
  214. ID = table.Column<int>(type: "int", nullable: false)
  215. .Annotation("SqlServer:Identity", "1, 1"),
  216. OrderID = table.Column<int>(type: "int", nullable: false),
  217. RecipientName_Encrypted = table.Column<string>(type: "nvarchar(max)", nullable: false),
  218. Phone_Encrypted = table.Column<string>(type: "nvarchar(max)", nullable: false),
  219. ZipCode = table.Column<string>(type: "nvarchar(10)", maxLength: 10, nullable: false),
  220. Address1_Encrypted = table.Column<string>(type: "nvarchar(max)", nullable: false),
  221. Address2_Encrypted = table.Column<string>(type: "nvarchar(max)", nullable: false),
  222. KeyVersion = table.Column<int>(type: "int", nullable: false),
  223. Status = table.Column<int>(type: "int", nullable: false),
  224. Carrier = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true),
  225. TrackingNumber = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true),
  226. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
  227. ShippedAt = table.Column<DateTime>(type: "datetime2", nullable: true),
  228. DeliveredAt = table.Column<DateTime>(type: "datetime2", nullable: true)
  229. },
  230. constraints: table =>
  231. {
  232. table.PrimaryKey("PK_Shipment", x => x.ID);
  233. table.ForeignKey(
  234. name: "FK_Shipment_Order_OrderID",
  235. column: x => x.OrderID,
  236. principalTable: "Order",
  237. principalColumn: "ID",
  238. onDelete: ReferentialAction.Cascade);
  239. },
  240. comment: "배송 (주문 시점 주소 스냅샷, 암호화)");
  241. migrationBuilder.CreateTable(
  242. name: "Coupon",
  243. columns: table => new
  244. {
  245. ID = table.Column<int>(type: "int", nullable: false)
  246. .Annotation("SqlServer:Identity", "1, 1"),
  247. ProductID = table.Column<int>(type: "int", nullable: false),
  248. GameID = table.Column<int>(type: "int", nullable: false, comment: "게임 ID (필수)"),
  249. Name = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
  250. ExpiresAt = table.Column<DateTime>(type: "datetime2", nullable: true),
  251. UsagePolicy = table.Column<int>(type: "int", nullable: false),
  252. GeneratedCount = table.Column<int>(type: "int", nullable: false),
  253. UsedCount = table.Column<int>(type: "int", nullable: false),
  254. LowStockThreshold = table.Column<int>(type: "int", nullable: false, defaultValue: 10),
  255. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
  256. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true)
  257. },
  258. constraints: table =>
  259. {
  260. table.PrimaryKey("PK_Coupon", x => x.ID);
  261. table.ForeignKey(
  262. name: "FK_Coupon_Game_GameID",
  263. column: x => x.GameID,
  264. principalTable: "Game",
  265. principalColumn: "ID",
  266. onDelete: ReferentialAction.Restrict);
  267. table.ForeignKey(
  268. name: "FK_Coupon_Product_ProductID",
  269. column: x => x.ProductID,
  270. principalTable: "Product",
  271. principalColumn: "ID",
  272. onDelete: ReferentialAction.Restrict);
  273. },
  274. comment: "쿠폰 메타 (코드 풀의 상위)");
  275. migrationBuilder.CreateTable(
  276. name: "CouponCode",
  277. columns: table => new
  278. {
  279. ID = table.Column<int>(type: "int", nullable: false)
  280. .Annotation("SqlServer:Identity", "1, 1"),
  281. CouponID = table.Column<int>(type: "int", nullable: false),
  282. Code = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false, comment: "코드 평문 (사용자 표시용)"),
  283. CodeHash = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: false, comment: "SHA-256 hex (UNIQUE, 조회용)"),
  284. Status = table.Column<int>(type: "int", nullable: false, comment: "상태 (1=Available, 2=Reserved, 3=Issued, 4=Used)"),
  285. IssuedToMemberID = table.Column<int>(type: "int", nullable: true),
  286. IssuedAt = table.Column<DateTime>(type: "datetime2", nullable: true),
  287. UsedAt = table.Column<DateTime>(type: "datetime2", nullable: true),
  288. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
  289. RowVersion = table.Column<byte[]>(type: "rowversion", rowVersion: true, nullable: false)
  290. },
  291. constraints: table =>
  292. {
  293. table.PrimaryKey("PK_CouponCode", x => x.ID);
  294. table.ForeignKey(
  295. name: "FK_CouponCode_Coupon_CouponID",
  296. column: x => x.CouponID,
  297. principalTable: "Coupon",
  298. principalColumn: "ID",
  299. onDelete: ReferentialAction.Cascade);
  300. table.ForeignKey(
  301. name: "FK_CouponCode_Member_IssuedToMemberID",
  302. column: x => x.IssuedToMemberID,
  303. principalTable: "Member",
  304. principalColumn: "ID");
  305. },
  306. comment: "쿠폰 코드 풀 (Code 평문 + CodeHash SHA-256 hex)");
  307. migrationBuilder.CreateTable(
  308. name: "OrderItem",
  309. columns: table => new
  310. {
  311. ID = table.Column<int>(type: "int", nullable: false)
  312. .Annotation("SqlServer:Identity", "1, 1"),
  313. OrderID = table.Column<int>(type: "int", nullable: false),
  314. ProductID = table.Column<int>(type: "int", nullable: false),
  315. Quantity = table.Column<int>(type: "int", nullable: false),
  316. UnitPrice = table.Column<int>(type: "int", nullable: false, comment: "주문 시점 상품 단가 스냅샷"),
  317. IssuedCouponCodeID = table.Column<int>(type: "int", nullable: true, comment: "Digital 상품 발급 쿠폰 코드"),
  318. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false)
  319. },
  320. constraints: table =>
  321. {
  322. table.PrimaryKey("PK_OrderItem", x => x.ID);
  323. table.ForeignKey(
  324. name: "FK_OrderItem_CouponCode_IssuedCouponCodeID",
  325. column: x => x.IssuedCouponCodeID,
  326. principalTable: "CouponCode",
  327. principalColumn: "ID");
  328. table.ForeignKey(
  329. name: "FK_OrderItem_Order_OrderID",
  330. column: x => x.OrderID,
  331. principalTable: "Order",
  332. principalColumn: "ID",
  333. onDelete: ReferentialAction.Cascade);
  334. table.ForeignKey(
  335. name: "FK_OrderItem_Product_ProductID",
  336. column: x => x.ProductID,
  337. principalTable: "Product",
  338. principalColumn: "ID",
  339. onDelete: ReferentialAction.Restrict);
  340. },
  341. comment: "주문 라인");
  342. migrationBuilder.CreateTable(
  343. name: "MemberInventory",
  344. columns: table => new
  345. {
  346. ID = table.Column<int>(type: "int", nullable: false)
  347. .Annotation("SqlServer:Identity", "1, 1"),
  348. MemberID = table.Column<int>(type: "int", nullable: false),
  349. OrderItemID = table.Column<int>(type: "int", nullable: false),
  350. CouponCodeID = table.Column<int>(type: "int", nullable: false),
  351. AcquiredAt = table.Column<DateTime>(type: "datetime2", nullable: false),
  352. UsedAt = table.Column<DateTime>(type: "datetime2", nullable: true),
  353. ExpiresAt = table.Column<DateTime>(type: "datetime2", nullable: true)
  354. },
  355. constraints: table =>
  356. {
  357. table.PrimaryKey("PK_MemberInventory", x => x.ID);
  358. table.ForeignKey(
  359. name: "FK_MemberInventory_CouponCode_CouponCodeID",
  360. column: x => x.CouponCodeID,
  361. principalTable: "CouponCode",
  362. principalColumn: "ID",
  363. onDelete: ReferentialAction.Restrict);
  364. table.ForeignKey(
  365. name: "FK_MemberInventory_Member_MemberID",
  366. column: x => x.MemberID,
  367. principalTable: "Member",
  368. principalColumn: "ID",
  369. onDelete: ReferentialAction.Cascade);
  370. table.ForeignKey(
  371. name: "FK_MemberInventory_OrderItem_OrderItemID",
  372. column: x => x.OrderItemID,
  373. principalTable: "OrderItem",
  374. principalColumn: "ID",
  375. onDelete: ReferentialAction.Restrict);
  376. },
  377. comment: "회원 보관함 (Digital 상품)");
  378. migrationBuilder.CreateIndex(
  379. name: "IX_Coupon_GameID",
  380. table: "Coupon",
  381. column: "GameID");
  382. migrationBuilder.CreateIndex(
  383. name: "IX_Coupon_ProductID",
  384. table: "Coupon",
  385. column: "ProductID");
  386. migrationBuilder.CreateIndex(
  387. name: "IX_CouponCode_CodeHash",
  388. table: "CouponCode",
  389. column: "CodeHash",
  390. unique: true);
  391. migrationBuilder.CreateIndex(
  392. name: "IX_CouponCode_CouponID_Status",
  393. table: "CouponCode",
  394. columns: new[] { "CouponID", "Status" });
  395. migrationBuilder.CreateIndex(
  396. name: "IX_CouponCode_IssuedToMemberID",
  397. table: "CouponCode",
  398. column: "IssuedToMemberID");
  399. migrationBuilder.CreateIndex(
  400. name: "IX_Game_IsActive_Order",
  401. table: "Game",
  402. columns: new[] { "IsActive", "Order" });
  403. migrationBuilder.CreateIndex(
  404. name: "IX_Game_Name",
  405. table: "Game",
  406. column: "Name",
  407. unique: true);
  408. migrationBuilder.CreateIndex(
  409. name: "IX_GameSettlement_GameID_Year_Month",
  410. table: "GameSettlement",
  411. columns: new[] { "GameID", "Year", "Month" },
  412. unique: true);
  413. migrationBuilder.CreateIndex(
  414. name: "IX_GameSettlement_SettledByAdminID",
  415. table: "GameSettlement",
  416. column: "SettledByAdminID");
  417. migrationBuilder.CreateIndex(
  418. name: "IX_GameSettlement_Year_Month_Status",
  419. table: "GameSettlement",
  420. columns: new[] { "Year", "Month", "Status" });
  421. migrationBuilder.CreateIndex(
  422. name: "IX_MemberAddress_MemberID_IsDefault",
  423. table: "MemberAddress",
  424. columns: new[] { "MemberID", "IsDefault" });
  425. migrationBuilder.CreateIndex(
  426. name: "IX_MemberAddress_RecipientName_Hash",
  427. table: "MemberAddress",
  428. column: "RecipientName_Hash");
  429. migrationBuilder.CreateIndex(
  430. name: "IX_MemberInventory_CouponCodeID",
  431. table: "MemberInventory",
  432. column: "CouponCodeID",
  433. unique: true);
  434. migrationBuilder.CreateIndex(
  435. name: "IX_MemberInventory_MemberID_UsedAt",
  436. table: "MemberInventory",
  437. columns: new[] { "MemberID", "UsedAt" });
  438. migrationBuilder.CreateIndex(
  439. name: "IX_MemberInventory_OrderItemID",
  440. table: "MemberInventory",
  441. column: "OrderItemID");
  442. migrationBuilder.CreateIndex(
  443. name: "IX_Order_ChannelID",
  444. table: "Order",
  445. column: "ChannelID");
  446. migrationBuilder.CreateIndex(
  447. name: "IX_Order_MemberID_Status_CreatedAt",
  448. table: "Order",
  449. columns: new[] { "MemberID", "Status", "CreatedAt" });
  450. migrationBuilder.CreateIndex(
  451. name: "IX_Order_OrderNumber",
  452. table: "Order",
  453. column: "OrderNumber",
  454. unique: true);
  455. migrationBuilder.CreateIndex(
  456. name: "IX_Order_Status_CreatedAt",
  457. table: "Order",
  458. columns: new[] { "Status", "CreatedAt" });
  459. migrationBuilder.CreateIndex(
  460. name: "IX_OrderItem_IssuedCouponCodeID",
  461. table: "OrderItem",
  462. column: "IssuedCouponCodeID");
  463. migrationBuilder.CreateIndex(
  464. name: "IX_OrderItem_OrderID",
  465. table: "OrderItem",
  466. column: "OrderID");
  467. migrationBuilder.CreateIndex(
  468. name: "IX_OrderItem_ProductID",
  469. table: "OrderItem",
  470. column: "ProductID");
  471. migrationBuilder.CreateIndex(
  472. name: "IX_OrderRefund_AdminID",
  473. table: "OrderRefund",
  474. column: "AdminID");
  475. migrationBuilder.CreateIndex(
  476. name: "IX_OrderRefund_OrderID_Status",
  477. table: "OrderRefund",
  478. columns: new[] { "OrderID", "Status" });
  479. migrationBuilder.CreateIndex(
  480. name: "IX_OrderRefund_Status",
  481. table: "OrderRefund",
  482. column: "Status");
  483. migrationBuilder.CreateIndex(
  484. name: "IX_Product_GameID_IsActive_Order",
  485. table: "Product",
  486. columns: new[] { "GameID", "IsActive", "Order" });
  487. migrationBuilder.CreateIndex(
  488. name: "IX_Product_IsActive_Type",
  489. table: "Product",
  490. columns: new[] { "IsActive", "Type" });
  491. migrationBuilder.CreateIndex(
  492. name: "IX_Shipment_OrderID",
  493. table: "Shipment",
  494. column: "OrderID",
  495. unique: true);
  496. migrationBuilder.CreateIndex(
  497. name: "IX_Shipment_Status",
  498. table: "Shipment",
  499. column: "Status");
  500. migrationBuilder.CreateIndex(
  501. name: "IX_Shipment_TrackingNumber",
  502. table: "Shipment",
  503. column: "TrackingNumber");
  504. // 기존 WithdrawalRequest row 백필: 신규 분개 컬럼(DonationAmount/StoreRevenueAmount)이 0 으로 채워졌으나,
  505. // 기존 row 는 모두 후원 잔액(Donation) 단일 출금이었으므로 DonationAmount = RequestedAmount 로 백필.
  506. migrationBuilder.Sql("UPDATE WithdrawalRequest SET DonationAmount = RequestedAmount WHERE DonationAmount = 0 AND RequestedAmount > 0;");
  507. }
  508. /// <inheritdoc />
  509. protected override void Down(MigrationBuilder migrationBuilder)
  510. {
  511. migrationBuilder.DropTable(
  512. name: "GameSettlement");
  513. migrationBuilder.DropTable(
  514. name: "MemberAddress");
  515. migrationBuilder.DropTable(
  516. name: "MemberInventory");
  517. migrationBuilder.DropTable(
  518. name: "OrderRefund");
  519. migrationBuilder.DropTable(
  520. name: "Shipment");
  521. migrationBuilder.DropTable(
  522. name: "OrderItem");
  523. migrationBuilder.DropTable(
  524. name: "CouponCode");
  525. migrationBuilder.DropTable(
  526. name: "Order");
  527. migrationBuilder.DropTable(
  528. name: "Coupon");
  529. migrationBuilder.DropTable(
  530. name: "Product");
  531. migrationBuilder.DropTable(
  532. name: "Game");
  533. migrationBuilder.DropColumn(
  534. name: "DonationAmount",
  535. table: "WithdrawalRequest");
  536. migrationBuilder.DropColumn(
  537. name: "StoreRevenueAmount",
  538. table: "WithdrawalRequest");
  539. }
  540. }
  541. }