From 2a1b7ba82d86b537e121585f36ad930fe7465921 Mon Sep 17 00:00:00 2001 From: ekk1mukk Date: Sat, 28 Mar 2026 10:59:39 +0100 Subject: [PATCH] db, admin --- db/jukebox.mwb | Bin 0 -> 10586 bytes db/script.sql | 122 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 db/jukebox.mwb create mode 100644 db/script.sql diff --git a/db/jukebox.mwb b/db/jukebox.mwb new file mode 100644 index 0000000000000000000000000000000000000000..77777c279cc5a0492c65af49dca9812ad24a7f8f GIT binary patch literal 10586 zcmZ{~1#lfb&?S1WIc8>#nVFd#L(I&~j4?AiF*7qWv#*(AX2;BI$4t-p-u|^)uik1( zEzPKVN+W6J9QCw<3^)Wj;9qK2^VZ=tZp?xHtpCdppV`LV*qWJxnT?AJpzxm}7yt&K zr0%T)ew$Y5M*#p3w1WeXKNU^vja_X`?OYga-HjMLY;DeUwVl_v(tUFDw{HagUd#_6 z#1l)|xti13c6cc#6tcRpq)=kP__M4fmXeflW$X74ldsg1U&E$B+^Lr9U>f^^IX+DR z!=10@K74Z|C^yC8L$A*cm3QH@-Y?e#-v%rtzEeoMp$&{CnhEBl-w4WkOkgTAkK5IU zwLL!l-38t03ueCZ%U^gi8@Esr88hV1O&UDH=XAf#jgEfbv}i=89A7i~K4B>8wk=N^%0-tJ~D8~=kXVbFQaZ_|}mZEhIZ7EybP9k~JP zmcmec(|j3gh~vBEIrzXyD~$eKM53T!;kGi$(1D1PLBd}SO*6K#llS`S_L$}`%T2w> zPt%Sx^HDk9pZlv6m>Pc?=uc$#5(No!)Mn6lJtv7AxHbopi(xz?*yXkHYnug0)?KJn&5LFe!pUy?wxu+tP zDj6}CX6LfbRhhl@hjf4HqotKzKQ@6ceO-4Tl2Iz5TNlg_DEx?=n%bv|6Llzn$7lad zQZ3yU@kjz(RXYiFef?sbHTiL5UN`|017k{Z< zqS!?>uOJ&5Ghac-t^1ZS2x(@u1+3DXKn{mQ89GqgcOBuc;I!) z)spaIH>y*k!W06jHU5WZ>R>|{`+CXvch_%QnuJ)PfvDbjzKzx4bRS)RZokf%!FIpd zqYkU-XN#`BU;YsWw89*bj!oHHifB^ATgUm(aP^VGtz&iO`ZjV!T1*LNi)_dS@4>LO z8yb4f#|X$+2))YRIX_k9E{d;+y?d!{1poA#+OeD(hy3t~leU^`rO_a@px7f`IZ%Je z(Rd7qIGLS3VG(1S)OO=2Q;khwSE!xcG@lX87}iG}KL&qz*w6|xIoJrhG)`CDGfJ>r zq;{kzzQyCtJW-vyZPvR_!gL=(`Dly^thre8tRpzXgE3_7btxFr@suVx;{`sz)0F@i z@F4!yjG-+H9HYFe7yW90X;Fu*r3u?55un1YrAe{&()+1mu;GqF8I}jm2sdqkU$avc zR!0ESaLqKt(YMTY6dRvNPW5c-gt6&|+#v1N!P%44cT^7Z!dzI$?QNw9IZ1LnV#MP$ zvG5e;V$RN%abBHYtu3yEvEHicebU~~ww%3lR;AWHvh%XF@Y>&cg}bUY5M z%ZfXxjW(}rcZIxG9qN7+_$h*EmSb7Rvr4iRfA>NE@zLC6!8-KvcaAjD%DsfX7b){b z6V%WTjgmEQ8(XpydR)S#ojhyt&^tp@)NSe6gWpW26T8+-q9j3HIp5k9Sw24HOCWz3 z=OGOh8O4plN@0x#V*#n{35tcsbR5Dz7H;ho|>zOik>JlWiB`MT)Ay zXD@QIjY$`=PDq6K_e&4CvRO^$$Cu)Z1-dmSL@=G}{J6h3Ogon5At9zWBM4CiT;a*x z)U9)3n;Bw8TzF{EPAn78FvAG#co3u9#@b&3P}P4u9-oFGofynmtYu=<6fg9Xf@$ER z(A9fyPETfc{ja?G&+z4)u;h7d@lE zsPDOI7XQ1=xU+pJojNYCMr}_AIhLWnD;AuPMmNS&#IL82+q)9|F6Hjs&;~m!Jdc1a zQKCCL(fpSdB|yr_lTcr8QZh`=L1-;D_KopcwnW>R{g>2v+0Pc&5wk&1lUG2S<+PGA zi*C$g{QZ+5x*3x0Q2~A!DVlmz=XnidPv-nKG5e3z7aXk3B@6x6?n>_#9sfnZ0EgI? z3q=5vJfYV2V$)zmPIc?)jQRD0Bb8tc^0!&`g_zM29j8BTE~^7@(|MAI<51o-55vj) z$1CAl6SwN1aTM40i|5ykLDLtUG*Tzb^$qk2>ti|L>UQTw3Lq~^vF-dYjo1m}jq*q^ zSgk&!&w%F{+os8+56GE+=z9hyVhlx{iE_(a^Q~JDXyMTQDLoekb3}-D zR8nHafEPJqua=8m(&Iw(jS|l<7Uo@DnOOt53Wn??kpa}Ta+BkI=^pua-fWv8&eGMmyf#5SM|HstV4L(RtTA zz0k9wi-EMFi1-RqJ_qaI@AVX$g} zYXw0a4HLR%cZo^)(h&J6hB=MtqWahYtu0+G?yqGYezgVOnw0fv+wFl_MoyQy>h)<> z*{#rYCy?E^tLRp!9j6oAI&!O_wcX?U+~B?-53A_>=E)okPQEY!6ucr*=%dwmCNJzY zUr#eEbJ1qa&P(I@25DOO18W*u0|QF;RJoFuw7)x(yqrx8?rDLt*@8nP|3$iLqb3)`H}R5}e6dK5(5c5?>d|#|~fNi`Xji-Cyn__erWPyK_!iv-U326{3jY zdc@^d?u76H+7VVKrD%rE%{md^ikaA^(&oieUA{PSXYBc|+Hd|gyB=gb-$gg>G1jam z$6P4?X?w?~=Hx4eDo^p#T+s9r6?=`Gzd2^nzpDA@|9K{s+-%&R)F-2iP8b`N zrxIeBL9757B5#aJMyY05ES9g#s}hD~u1c4SR78`akBH5c53VAG41lr<511D=m<3=j zuNMdx$MBLPYjDn9AtS4l*OV$1WluJ#lsWZH2v?|}2>6r6wz)AuBv~yOjgzR97h`$g zma14=ovcQwv=!JGkHtl(bO09LNvIu|=;CN@ve zzzU`};Wa_zag#9YK|}(uTD7Vzd@v1y1OtGY=0i8!1ri9TwnD#>>z{)oltqPNemSGdpyIuEQ zVGms$ad_fL5l8FyzjMtrL}+%-CAX(E75APUj;O!TzoK@9VX5 zCrl2X?*T#UwnMZM5B+@XFG|$2=U%kCt%#ae34p9}FPrJGwcKwsgLD?(xx{VSpuUYO#$gd{lk`v)oGVjX~C|FomvO&3r|)qrkSxZf+2_rGRS~E55R0MFwj*=Zd-waZ~+?8 zu&PlAv>r$bSF%HKgoliV@+Cboqf=~yq)xgqE+9Wb3*QJnmrF%~4OtY*KR-J+l`|VD z7lsizBj3<5yb|@{xIJztG!QeSY&*O-G*|;)L1C_pgk%|r4uNhH8Tbz&D|ulTW7zo6 zgITe0O)9I+nU;fjc(VHpGGyUj;GqJ+%hyxX!mA5~B2-=W9%4Qz`o zhFG-V*2l`Owp#O!l`CmE3kmUm=F)PWH5+h3*ezSmz_pS%fDqRm3@}^i7jq<}P~5({(fSet28{z7F2F^V@C87!ynzTr7Os4bG*ZR#+?zI9 zAj-h61L4b{p~S>cEm##4ip%C5OGvK`)G8`1#l)-1I0tP~X|m567LeH_LZD14p8ax> zv+GA3wOjvy5o2rKw<53QK)!Xwm|0%#>qT(g55<661|5cCd?old8bOYrnw&o$cc-S8 zH0i|^No$?c)0tSfBh7SMAwRDA$1Y&4a1_R=)W$Wk?E|#TUaivZWkPb3flctGrb6_} zu%r_Z|EkTK>2Uh^5n5)XW-Q|Y8pV?XCHWVKxk+VCXM{0oL-#)FcvZ4VY0MU;e^=RM zbuWU{BqXb%&r@@gfK?MmjV!wICtQhYp)hlhRTCZxKfMqwOosx3)}3{y$NbgII?<|wgmV@)?;>c@;yeUZOH^-F2=bL$ zM*54g7k4ZD-o+e8s+#avjZ zjVx6Z0vN9DfU0O(Iu~>;96CB}ysGH1F9Eus-4%A5<-kBS2@rq(Kt0tz)44jRs78v8})7;OgG@x zR2tDtjZreD$PkBO9_9q2rnk*Pcs)%fZ4u?g{Z$v~bzMbo_RVH7gA$OpYekW!QVBeXgWWG!G!-C# z_@&la#|81LJsJm4SbyOY2$X^bFRa)80RmGp%YgC!>mZcQI7>S)Gv<(mNzkn42#L5j zFr7y;gCO6Cg)OxNUd?ylpBGe}-(_cG1NfAQ#i$MF@JN4*HqqgK2EZe2{Du;^x&p}2 zT4?oMiXrJ*`-4HXtBET=T|Z~3blKpn&yVh7F1end8>I38InSc-+D{+vZZL4tIxun#Y_{Dz^>VURyz?(oB)C4Dun{N9D0*fQU)HYo-7 z>O+a%t?7C#6p+A~te~PlHzWO{eQ$YRHS*b{RCVbU>BinjvheA+FwwxLB(g=Pi_zL0X^S0= zA@~FVIOh}b)T+#oa`4omUA97d5w`cXW^(Z9Jo5m0rO=GQ2|>afw`27<;LKyf9IU=8 zvM)sIHE?6S@H_ zJmRS^VZc&CTopVbO+`2rB=79r#bgb11^!Axnz=t)d)|n3Y1vK!M#SKigltK-u6t&0 z<4-)OnV=kMx-jSxCO#Je!mLH`VL?8jb66{N2ay@kYZ___sKJW-h&PKY1sZ)2yxob( zO6C!dYdtcU9n5+yk=^on2<`u(Oa@cv7k@9DgV|>4`>@5a(o1j1d9jQ96~AR`9yPeXC>*ib`(xWlX@ zY%tIk_>gR4#psAaUxkcmEhhTul(y6r|MMwGLJ&KOHHcr3Xnb98v>V}vwJxlcSVez% zB&7~rlA|&4+qQJaw!w9@38&KGvN9A4$A&0|3tz@Z5%hVx5+=<`qVQel$@xtolcqbiVB|7pzQ?Y*3$KWI0UgN0wWEpHOSK~%2Iuw}pf6W!%y^m-8j@Z7dSK{qefbJD_B_o2(1CEqt>o%h~-q<^BuJ0}sG!EfuPrAy@; z@}9ZvwaDOV>05!Oo;&o_eL-tTPHgNS-_UK%RgV|uHLwZh@2zx@j4c$6Y7iUG`-1J#u&T zeA_>HdrARuKRaH0`83`=T7s+_doJRok`!D!Bm|f25#@UR1oJ{p?j|Ktmnt0jvJ4`l zfrWv|pI#b_oPx4ClFGxF@?Tn?j!%}AiqNn-jb#?3pocLXY=E3S^-j@46_99@fErA3 z=cMcQC&wJ6s#ZgPrr9JsmY-mp^GSGWXM}_ToR!$e|K^l18qfFb?|Y3tqgTtVb*HLJ z1~zUx8VI1tfGo-%Zs_XAk4|6d!O6mzi0orDPsZIM^qSi6R|PBPsuZ!a8x2}XY= z1P5(=vwjh>2a|$89?R2D?+FDZi@_Aqc&8Qq_nu( zK^U5sdYCO?1l&P+#K3{w#X%YA{JD-|+QrVa+J^aCjEh4AbHV=YCNNzKlDDLVF~07Q~VsGlBJNlDh}xMqbZOgXJf+WqG^rovQ25g8w3yLRCN2PF-g!NS;OlUI!-DU$zJ9FVXy5$@Ct-GfWU0?5|EsU@U#{L>6E|2%-o=SpyjK}j1BqA02m$LO=t8QPd zvbNhU*~KeN-$faSmvoq#b?kC`dDe}tD;N>6V!p_LT$4jjtG~2>@z`)fL-MSVX3rr_ zE9Q7+O9+`ebKvH_++3s}rNlVM=gJZK5NCFDzdC4Ip>gt+R^a9q1o3d=!31NY%wyP> zPnpPFX$%1;PKj>u=@274ogz)Qe3^bTe>%FHYoa`}%?TL~xQk7`=pPY?_1xYkbq$JcTqO7;b1SKpAj) z2`@>?He^18A#wX1qc5o6`Qo(l+70*QU-W>0JWIW>-kYeQo7c>6$W)T?x&OOw}9}MX6Wcq=r=4_ zp9I7Y>CTb>ofSyxcO?t8(qE? zNa=E|-1QHt=<>P7y*lJGXdn-&sM4jqk&5SebY6YUqe(T`R?(cf&+=F&otHJNjBiL? zOO&OkzKjtg9(cDTQmQbUxqTp#;9a&cY?M(rvB6e3wL3JOs zVNhkEQ^JHkgg>}LjdQ8Lrc6q20t^c;rQ911-!MbPg`sbVvxNLxq0cys-#EhV4keru zoM!%0tYMf^B&5DNs6}-;Ui`R36~hl@ETVhw>(kC)HtXp__Rkl|%u0J#ybYYG>Di>^_Jy`5gbG|&IkVIl>-pQVt2A@9 zE?F-DyQ8rf!PbsZ1n#*r3K=SGzvWBl793{%G%vzSq8@1BvM0;Iw+|Z^KT+OJpG|tR z*G}W>91#}}uxnk8KJF?W3PXDw4mX@na5NLV3Dl%s1+rg;gUybL8?j%&1lLs%Hc*h`8TRwqxPVx3Kj0DAC z4zIaOW{>F0&Siu@lY)%^M?A?#uD#K~_x>VrCtv2j6A$0W`DY4{gkcxfj3OE!8cbCf z#oDp}=Q53lGr@n?0i4U3!iXpIh@6vYtsb04KdKPC8*=d+-1!#Lj+IMDAb@0Jo1wtZ^#;ch|^GpgX`_ z&$@iKxp3K^_nYHkZy8ZB4`_&B?JNJKA@~+>%X9J#qW`a9zw=oyxc2fh6rt4}({@BZ zZyeYTV5jrM4$Mje0{L(R1)3E?IZFU#xap0MLk=r&A>);g6MzrMRM*l*gIQb*1#mU* z-$QdTu;>6X1%P2ZU2=|2%fMb>uV)nwA_Y32#IKjzVJZwK_D8R!MO?r5SbQyA*V(n^ z6*p_gGaaAxNA6?pi2kEx=Ap}w^9O9f z@s;nlFg!(E$_R%cQHpl4U#d(+(vS9zD8;wo0%z>F7shDM7u;Mne0mzVK|YQCz}IzPFcjV3y3%SB~| zflR{!s!85r#9HG|Dn~5X*7qB?kWqxa^XwarKH#41`EBzq%E;R8#99cwfxTzPi4W($ zwq{y72v6;YPFthG6&m*yBT3KIi|*he<;5v?s{5qIisn6$*$ZmR7Y6cQjd%KFGj!(K z5^I^~1jPJovQra-(MIlXU{+<)NFp! z@JK5sLaNTOCs_NFtL-!4Cvd6q$>t&^Cb7al+1!}?0<5R{Lfg=KxoiWPGlHFgL|xC1 zXtLM_(`6;QT3WBAZFGde5wA5gV~`gH_svvy?y94HQ%T{;?XU`wRl&0Z$HF_Xe8XKO zL$#v0;MCxK+GcqbGha9C++MmfwMOEc?8ArF%RQ)v<{%`Up9MvQ+NK!p10=s!No-KM z4XV~xZhIL~7o4x4zqZmG_PcrvOC7CSc+}T;=%bbfGYSiXty~hs@AE^(FEDWsV zo}M!k?VtOoeU8vK6mTxO(?fS$)B=2drB&sPkf`s~Uxc2SjB^sWV7@96_UA=Au9vZA zBV0zyPwiWz4@f@-x~YAK9K45jLV?SITee)DBHlX6N<$!)MjSFRsE2dPB z;_og@>N+vCbxG%6AS}Vlnr`}a={~YVT41h!v{%NQ5mTu1%-` zTv@nXA)VYghMctU>~SxhR8%*4kxJ;0gk_}{P>I&qBZ;<>U%?CVN_mesGv{l|_Y-(I zIV5U+HZd5Xx=SzTk(_>dJtH-XS_iv)qYKYbf+7VQ=(Ce%Md;UkN=HAX%KG_k_7bYY78j0D>c|Q5J%su{sTUCe@8;ugC8UvL zUshtN)ZVDb;qYHB(GVl!smvGHX@8!m4NVgpr;_22` z>+ZA)%$AtSj*fGV#dM#8dRf^ow=114+rPr-n2eE$ znqy0^o3i<2*amkqQIEIb)|9!x(S0c+z+BmWs);nZGG;SrdFU8V&Nh+mmS7q*DsV6U zK55KeBWOQ8=Jiq8nmx=@@F;G!Vct4wA%N0|cmLdXcXz`g@cumalSO@|#qZhge+R4m zi)!<b?YY60;^{ga1e^8>4L$Q+* zoLBn7fkXKYTClW^qrO{O=rt7Yo_cTJJ3SrnK>mWLzgNHO`E~lfq!*u`I!xbjg=nHf z2ZMk##L+X<01+vXwXIH@=N^%y&0l29WXw-EU*36tF12cut6a??QljO=KFe>O;COz; zNiJKXSbo-A3id`;Dbj;}88ZGA(#uvHtc*p0G;Pe*d4o*}5`X@sJ$c~Bu{KiDD!mb4 z){)nQTLz=m;p{Ox6RT2GPV>w0aK?+03@AsihQIP+Z7Oes%H>=CZf?qr?_xNayfd4Y zFzBP0&;22sCLt^&`aWspbNZ^(GUQ+wyKM}@)7C>;P$^PNag+H0`IXV-IDX@KG=R&b zuVBLc2ISJ%`IXXLQDIIjSzo~jEMV)q!r&kaOT4@gb_sKVK$g>TkS0FlFF$x%>Cu}H z3~~x&n0N3b73IGrU$ayL&$`Y&FJ6Ri<+8J9A z%h{Wl+7KH$8CzJonG!QIFu~gXyF%}5Y+-6^=*&ZG>uF*{M{MP4ZE9ri0sH>|$L}i5 literal 0 HcmV?d00001 diff --git a/db/script.sql b/db/script.sql new file mode 100644 index 0000000..f259650 --- /dev/null +++ b/db/script.sql @@ -0,0 +1,122 @@ +CREATE DATABASE IF NOT EXISTS jukebox CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +USE jukebox; + +DROP TABLE IF EXISTS track_genre; +DROP TABLE IF EXISTS artist_track; +DROP TABLE IF EXISTS likes; +DROP TABLE IF EXISTS tracks; +DROP TABLE IF EXISTS artists; +DROP TABLE IF EXISTS albums; +DROP TABLE IF EXISTS genres; +DROP TABLE IF EXISTS users; +DROP TABLE IF EXISTS roles; +DROP TABLE IF EXISTS labels; + +CREATE TABLE roles ( + id INT AUTO_INCREMENT PRIMARY KEY, + name ENUM('admin', 'user') NOT NULL UNIQUE +) ENGINE=InnoDB; + +CREATE TABLE labels ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL UNIQUE +) ENGINE=InnoDB; + +CREATE TABLE genres ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL UNIQUE +) ENGINE=InnoDB; + +CREATE TABLE users ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50) NOT NULL, + email VARCHAR(100) NOT NULL UNIQUE, + password VARCHAR(255) NOT NULL, + role_id INT NOT NULL, + CONSTRAINT fk_users_role + FOREIGN KEY (role_id) REFERENCES roles(id) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB; + +CREATE TABLE albums ( + id INT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(255) NOT NULL, + cover_path VARCHAR(255), + release_date DATETIME, + duration_seconds INT, + type ENUM('single', 'ep', 'lp', 'album', 'compilation') NOT NULL DEFAULT 'album', + label_id INT, + CONSTRAINT fk_albums_label + FOREIGN KEY (label_id) REFERENCES labels(id) + ON UPDATE CASCADE + ON DELETE SET NULL +) ENGINE=InnoDB; + +CREATE TABLE artists ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + cover_path VARCHAR(255), + release_date DATETIME, + label_id INT, + duration INT, + CONSTRAINT fk_artists_label + FOREIGN KEY (label_id) REFERENCES labels(id) + ON UPDATE CASCADE + ON DELETE SET NULL +) ENGINE=InnoDB; + +CREATE TABLE tracks ( + id INT AUTO_INCREMENT PRIMARY KEY, + file_path VARCHAR(255) NOT NULL, + title VARCHAR(255) NOT NULL, + duration_seconds INT NOT NULL, + album_id INT, + CONSTRAINT fk_tracks_album + FOREIGN KEY (album_id) REFERENCES albums(id) + ON UPDATE CASCADE + ON DELETE SET NULL +) ENGINE=InnoDB; + +CREATE TABLE likes ( + user_id INT NOT NULL, + track_id INT NOT NULL, + PRIMARY KEY (user_id, track_id), + CONSTRAINT fk_likes_user + FOREIGN KEY (user_id) REFERENCES users(id) + ON UPDATE CASCADE + ON DELETE CASCADE, + CONSTRAINT fk_likes_track + FOREIGN KEY (track_id) REFERENCES tracks(id) + ON UPDATE CASCADE + ON DELETE CASCADE +) ENGINE=InnoDB; + +CREATE TABLE artist_track ( + artist_id INT NOT NULL, + track_id INT NOT NULL, + PRIMARY KEY (artist_id, track_id), + CONSTRAINT fk_artist_track_artist + FOREIGN KEY (artist_id) REFERENCES artists(id) + ON UPDATE CASCADE + ON DELETE CASCADE, + CONSTRAINT fk_artist_track_track + FOREIGN KEY (track_id) REFERENCES tracks(id) + ON UPDATE CASCADE + ON DELETE CASCADE +) ENGINE=InnoDB; + +CREATE TABLE track_genre ( + track_id INT NOT NULL, + genre_id INT NOT NULL, + PRIMARY KEY (track_id, genre_id), + CONSTRAINT fk_track_genre_track + FOREIGN KEY (track_id) REFERENCES tracks(id) + ON UPDATE CASCADE + ON DELETE CASCADE, + CONSTRAINT fk_track_genre_genre + FOREIGN KEY (genre_id) REFERENCES genres(id) + ON UPDATE CASCADE + ON DELETE CASCADE +) ENGINE=InnoDB;