From ce2be046ce3a277753647bf38d6518f18596f00b Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 20 Sep 2022 17:24:47 +0900 Subject: [PATCH 001/148] =?UTF-8?q?feat[#1]=20:=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20initialize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 117 +++++++++ build.gradle | 33 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 240 ++++++++++++++++++ gradlew.bat | 91 +++++++ settings.gradle | 1 + .../server/hispath/HispathApplication.java | 13 + src/main/resources/application.properties | 1 + .../hispath/HispathApplicationTests.java | 13 + 10 files changed, 514 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/com/server/hispath/HispathApplication.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/com/server/hispath/HispathApplicationTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ad8b31f --- /dev/null +++ b/.gitignore @@ -0,0 +1,117 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +## Config file +/src/main/resources/*.yaml +/src/main/resources/*.yml + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +log/ \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..94dbea8 --- /dev/null +++ b/build.gradle @@ -0,0 +1,33 @@ +plugins { + id 'org.springframework.boot' version '2.7.3' + id 'io.spring.dependency-management' version '1.0.13.RELEASE' + id 'java' +} + +group = 'com.server' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '11' + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + runtimeOnly 'com.h2database:h2' + runtimeOnly 'mysql:mysql-connector-java' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..249e5832f090a2944b7473328c07c9755baa3196 GIT binary patch literal 60756 zcmb5WV{~QRw(p$^Dz@00IL3?^hro$gg*4VI_WAaTyVM5Foj~O|-84 z$;06hMwt*rV;^8iB z1~&0XWpYJmG?Ts^K9PC62H*`G}xom%S%yq|xvG~FIfP=9*f zZoDRJBm*Y0aId=qJ?7dyb)6)JGWGwe)MHeNSzhi)Ko6J<-m@v=a%NsP537lHe0R* z`If4$aaBA#S=w!2z&m>{lpTy^Lm^mg*3?M&7HFv}7K6x*cukLIGX;bQG|QWdn{%_6 zHnwBKr84#B7Z+AnBXa16a?or^R?+>$4`}{*a_>IhbjvyTtWkHw)|ay)ahWUd-qq$~ zMbh6roVsj;_qnC-R{G+Cy6bApVOinSU-;(DxUEl!i2)1EeQ9`hrfqj(nKI7?Z>Xur zoJz-a`PxkYit1HEbv|jy%~DO^13J-ut986EEG=66S}D3!L}Efp;Bez~7tNq{QsUMm zh9~(HYg1pA*=37C0}n4g&bFbQ+?-h-W}onYeE{q;cIy%eZK9wZjSwGvT+&Cgv z?~{9p(;bY_1+k|wkt_|N!@J~aoY@|U_RGoWX<;p{Nu*D*&_phw`8jYkMNpRTWx1H* z>J-Mi_!`M468#5Aix$$u1M@rJEIOc?k^QBc?T(#=n&*5eS#u*Y)?L8Ha$9wRWdH^3D4|Ps)Y?m0q~SiKiSfEkJ!=^`lJ(%W3o|CZ zSrZL-Xxc{OrmsQD&s~zPfNJOpSZUl%V8tdG%ei}lQkM+z@-4etFPR>GOH9+Y_F<3=~SXln9Kb-o~f>2a6Xz@AS3cn^;c_>lUwlK(n>z?A>NbC z`Ud8^aQy>wy=$)w;JZzA)_*Y$Z5hU=KAG&htLw1Uh00yE!|Nu{EZkch zY9O6x7Y??>!7pUNME*d!=R#s)ghr|R#41l!c?~=3CS8&zr6*aA7n9*)*PWBV2w+&I zpW1-9fr3j{VTcls1>ua}F*bbju_Xq%^v;-W~paSqlf zolj*dt`BBjHI)H9{zrkBo=B%>8}4jeBO~kWqO!~Thi!I1H(in=n^fS%nuL=X2+s!p}HfTU#NBGiwEBF^^tKU zbhhv+0dE-sbK$>J#t-J!B$TMgN@Wh5wTtK2BG}4BGfsZOoRUS#G8Cxv|6EI*n&Xxq zt{&OxCC+BNqz$9b0WM7_PyBJEVObHFh%%`~!@MNZlo*oXDCwDcFwT~Rls!aApL<)^ zbBftGKKBRhB!{?fX@l2_y~%ygNFfF(XJzHh#?`WlSL{1lKT*gJM zs>bd^H9NCxqxn(IOky5k-wALFowQr(gw%|`0991u#9jXQh?4l|l>pd6a&rx|v=fPJ z1mutj{YzpJ_gsClbWFk(G}bSlFi-6@mwoQh-XeD*j@~huW4(8ub%^I|azA)h2t#yG z7e_V_<4jlM3D(I+qX}yEtqj)cpzN*oCdYHa!nm%0t^wHm)EmFP*|FMw!tb@&`G-u~ zK)=Sf6z+BiTAI}}i{*_Ac$ffr*Wrv$F7_0gJkjx;@)XjYSh`RjAgrCck`x!zP>Ifu z&%he4P|S)H*(9oB4uvH67^0}I-_ye_!w)u3v2+EY>eD3#8QR24<;7?*hj8k~rS)~7 zSXs5ww)T(0eHSp$hEIBnW|Iun<_i`}VE0Nc$|-R}wlSIs5pV{g_Dar(Zz<4X3`W?K z6&CAIl4U(Qk-tTcK{|zYF6QG5ArrEB!;5s?tW7 zrE3hcFY&k)+)e{+YOJ0X2uDE_hd2{|m_dC}kgEKqiE9Q^A-+>2UonB+L@v3$9?AYw zVQv?X*pK;X4Ovc6Ev5Gbg{{Eu*7{N3#0@9oMI~}KnObQE#Y{&3mM4`w%wN+xrKYgD zB-ay0Q}m{QI;iY`s1Z^NqIkjrTlf`B)B#MajZ#9u41oRBC1oM1vq0i|F59> z#StM@bHt|#`2)cpl_rWB($DNJ3Lap}QM-+A$3pe}NyP(@+i1>o^fe-oxX#Bt`mcQc zb?pD4W%#ep|3%CHAYnr*^M6Czg>~L4?l16H1OozM{P*en298b+`i4$|w$|4AHbzqB zHpYUsHZET$Z0ztC;U+0*+amF!@PI%^oUIZy{`L{%O^i{Xk}X0&nl)n~tVEpcAJSJ} zverw15zP1P-O8h9nd!&hj$zuwjg?DoxYIw{jWM zW5_pj+wFy8Tsa9g<7Qa21WaV&;ejoYflRKcz?#fSH_)@*QVlN2l4(QNk| z4aPnv&mrS&0|6NHq05XQw$J^RR9T{3SOcMKCXIR1iSf+xJ0E_Wv?jEc*I#ZPzyJN2 zUG0UOXHl+PikM*&g$U@g+KbG-RY>uaIl&DEtw_Q=FYq?etc!;hEC_}UX{eyh%dw2V zTTSlap&5>PY{6I#(6`j-9`D&I#|YPP8a;(sOzgeKDWsLa!i-$frD>zr-oid!Hf&yS z!i^cr&7tN}OOGmX2)`8k?Tn!!4=tz~3hCTq_9CdiV!NIblUDxHh(FJ$zs)B2(t5@u z-`^RA1ShrLCkg0)OhfoM;4Z{&oZmAec$qV@ zGQ(7(!CBk<5;Ar%DLJ0p0!ResC#U<+3i<|vib1?{5gCebG7$F7URKZXuX-2WgF>YJ^i zMhHDBsh9PDU8dlZ$yJKtc6JA#y!y$57%sE>4Nt+wF1lfNIWyA`=hF=9Gj%sRwi@vd z%2eVV3y&dvAgyuJ=eNJR+*080dbO_t@BFJO<@&#yqTK&+xc|FRR;p;KVk@J3$S{p` zGaMj6isho#%m)?pOG^G0mzOAw0z?!AEMsv=0T>WWcE>??WS=fII$t$(^PDPMU(P>o z_*0s^W#|x)%tx8jIgZY~A2yG;US0m2ZOQt6yJqW@XNY_>_R7(Nxb8Ged6BdYW6{prd!|zuX$@Q2o6Ona8zzYC1u!+2!Y$Jc9a;wy+pXt}o6~Bu1oF1c zp7Y|SBTNi@=I(K%A60PMjM#sfH$y*c{xUgeSpi#HB`?|`!Tb&-qJ3;vxS!TIzuTZs-&%#bAkAyw9m4PJgvey zM5?up*b}eDEY+#@tKec)-c(#QF0P?MRlD1+7%Yk*jW;)`f;0a-ZJ6CQA?E%>i2Dt7T9?s|9ZF|KP4;CNWvaVKZ+Qeut;Jith_y{v*Ny6Co6!8MZx;Wgo z=qAi%&S;8J{iyD&>3CLCQdTX*$+Rx1AwA*D_J^0>suTgBMBb=*hefV+Ars#mmr+YsI3#!F@Xc1t4F-gB@6aoyT+5O(qMz*zG<9Qq*f0w^V!03rpr*-WLH}; zfM{xSPJeu6D(%8HU%0GEa%waFHE$G?FH^kMS-&I3)ycx|iv{T6Wx}9$$D&6{%1N_8 z_CLw)_9+O4&u94##vI9b-HHm_95m)fa??q07`DniVjAy`t7;)4NpeyAY(aAk(+T_O z1om+b5K2g_B&b2DCTK<>SE$Ode1DopAi)xaJjU>**AJK3hZrnhEQ9E`2=|HHe<^tv z63e(bn#fMWuz>4erc47}!J>U58%<&N<6AOAewyzNTqi7hJc|X{782&cM zHZYclNbBwU6673=!ClmxMfkC$(CykGR@10F!zN1Se83LR&a~$Ht&>~43OX22mt7tcZUpa;9@q}KDX3O&Ugp6< zLZLfIMO5;pTee1vNyVC$FGxzK2f>0Z-6hM82zKg44nWo|n}$Zk6&;5ry3`(JFEX$q zK&KivAe${e^5ZGc3a9hOt|!UOE&OocpVryE$Y4sPcs4rJ>>Kbi2_subQ9($2VN(3o zb~tEzMsHaBmBtaHAyES+d3A(qURgiskSSwUc9CfJ@99&MKp2sooSYZu+-0t0+L*!I zYagjOlPgx|lep9tiU%ts&McF6b0VE57%E0Ho%2oi?=Ks+5%aj#au^OBwNwhec zta6QAeQI^V!dF1C)>RHAmB`HnxyqWx?td@4sd15zPd*Fc9hpDXP23kbBenBxGeD$k z;%0VBQEJ-C)&dTAw_yW@k0u?IUk*NrkJ)(XEeI z9Y>6Vel>#s_v@=@0<{4A{pl=9cQ&Iah0iD0H`q)7NeCIRz8zx;! z^OO;1+IqoQNak&pV`qKW+K0^Hqp!~gSohcyS)?^P`JNZXw@gc6{A3OLZ?@1Uc^I2v z+X!^R*HCm3{7JPq{8*Tn>5;B|X7n4QQ0Bs79uTU%nbqOJh`nX(BVj!#f;#J+WZxx4 z_yM&1Y`2XzhfqkIMO7tB3raJKQS+H5F%o83bM+hxbQ zeeJm=Dvix$2j|b4?mDacb67v-1^lTp${z=jc1=j~QD>7c*@+1?py>%Kj%Ejp7Y-!? z8iYRUlGVrQPandAaxFfks53@2EC#0)%mrnmGRn&>=$H$S8q|kE_iWko4`^vCS2aWg z#!`RHUGyOt*k?bBYu3*j3u0gB#v(3tsije zgIuNNWNtrOkx@Pzs;A9un+2LX!zw+p3_NX^Sh09HZAf>m8l@O*rXy_82aWT$Q>iyy zqO7Of)D=wcSn!0+467&!Hl))eff=$aneB?R!YykdKW@k^_uR!+Q1tR)+IJb`-6=jj zymzA>Sv4>Z&g&WWu#|~GcP7qP&m*w-S$)7Xr;(duqCTe7p8H3k5>Y-n8438+%^9~K z3r^LIT_K{i7DgEJjIocw_6d0!<;wKT`X;&vv+&msmhAAnIe!OTdybPctzcEzBy88_ zWO{6i4YT%e4^WQZB)KHCvA(0tS zHu_Bg+6Ko%a9~$EjRB90`P(2~6uI@SFibxct{H#o&y40MdiXblu@VFXbhz>Nko;7R z70Ntmm-FePqhb%9gL+7U8@(ch|JfH5Fm)5${8|`Lef>LttM_iww6LW2X61ldBmG0z zax3y)njFe>j*T{i0s8D4=L>X^j0)({R5lMGVS#7(2C9@AxL&C-lZQx~czI7Iv+{%1 z2hEG>RzX4S8x3v#9sgGAnPzptM)g&LB}@%E>fy0vGSa(&q0ch|=ncKjNrK z`jA~jObJhrJ^ri|-)J^HUyeZXz~XkBp$VhcTEcTdc#a2EUOGVX?@mYx#Vy*!qO$Jv zQ4rgOJ~M*o-_Wptam=~krnmG*p^j!JAqoQ%+YsDFW7Cc9M%YPiBOrVcD^RY>m9Pd< zu}#9M?K{+;UIO!D9qOpq9yxUquQRmQNMo0pT`@$pVt=rMvyX)ph(-CCJLvUJy71DI zBk7oc7)-%ngdj~s@76Yse3L^gV0 z2==qfp&Q~L(+%RHP0n}+xH#k(hPRx(!AdBM$JCfJ5*C=K3ts>P?@@SZ_+{U2qFZb>4kZ{Go37{# zSQc+-dq*a-Vy4?taS&{Ht|MLRiS)Sn14JOONyXqPNnpq&2y~)6wEG0oNy>qvod$FF z`9o&?&6uZjhZ4_*5qWVrEfu(>_n2Xi2{@Gz9MZ8!YmjYvIMasE9yVQL10NBrTCczq zcTY1q^PF2l!Eraguf{+PtHV3=2A?Cu&NN&a8V(y;q(^_mFc6)%Yfn&X&~Pq zU1?qCj^LF(EQB1F`8NxNjyV%fde}dEa(Hx=r7$~ts2dzDwyi6ByBAIx$NllB4%K=O z$AHz1<2bTUb>(MCVPpK(E9wlLElo(aSd(Os)^Raum`d(g9Vd_+Bf&V;l=@mM=cC>) z)9b0enb)u_7V!!E_bl>u5nf&Rl|2r=2F3rHMdb7y9E}}F82^$Rf+P8%dKnOeKh1vs zhH^P*4Ydr^$)$h@4KVzxrHyy#cKmWEa9P5DJ|- zG;!Qi35Tp7XNj60=$!S6U#!(${6hyh7d4q=pF{`0t|N^|L^d8pD{O9@tF~W;#Je*P z&ah%W!KOIN;SyAEhAeTafJ4uEL`(RtnovM+cb(O#>xQnk?dzAjG^~4$dFn^<@-Na3 z395;wBnS{t*H;Jef2eE!2}u5Ns{AHj>WYZDgQJt8v%x?9{MXqJsGP|l%OiZqQ1aB! z%E=*Ig`(!tHh>}4_z5IMpg{49UvD*Pp9!pxt_gdAW%sIf3k6CTycOT1McPl=_#0?8 zVjz8Hj*Vy9c5-krd-{BQ{6Xy|P$6LJvMuX$* zA+@I_66_ET5l2&gk9n4$1M3LN8(yEViRx&mtd#LD}AqEs?RW=xKC(OCWH;~>(X6h!uDxXIPH06xh z*`F4cVlbDP`A)-fzf>MuScYsmq&1LUMGaQ3bRm6i7OsJ|%uhTDT zlvZA1M}nz*SalJWNT|`dBm1$xlaA>CCiQ zK`xD-RuEn>-`Z?M{1%@wewf#8?F|(@1e0+T4>nmlSRrNK5f)BJ2H*$q(H>zGD0>eL zQ!tl_Wk)k*e6v^m*{~A;@6+JGeWU-q9>?+L_#UNT%G?4&BnOgvm9@o7l?ov~XL+et zbGT)|G7)KAeqb=wHSPk+J1bdg7N3$vp(ekjI1D9V$G5Cj!=R2w=3*4!z*J-r-cyeb zd(i2KmX!|Lhey!snRw z?#$Gu%S^SQEKt&kep)up#j&9}e+3=JJBS(s>MH+|=R(`8xK{mmndWo_r`-w1#SeRD&YtAJ#GiVI*TkQZ}&aq<+bU2+coU3!jCI6E+Ad_xFW*ghnZ$q zAoF*i&3n1j#?B8x;kjSJD${1jdRB;)R*)Ao!9bd|C7{;iqDo|T&>KSh6*hCD!rwv= zyK#F@2+cv3=|S1Kef(E6Niv8kyLVLX&e=U;{0x{$tDfShqkjUME>f8d(5nzSkY6@! z^-0>DM)wa&%m#UF1F?zR`8Y3X#tA!*7Q$P3lZJ%*KNlrk_uaPkxw~ zxZ1qlE;Zo;nb@!SMazSjM>;34ROOoygo%SF);LL>rRonWwR>bmSd1XD^~sGSu$Gg# zFZ`|yKU0%!v07dz^v(tY%;So(e`o{ZYTX`hm;@b0%8|H>VW`*cr8R%3n|ehw2`(9B+V72`>SY}9^8oh$En80mZK9T4abVG*to;E z1_S6bgDOW?!Oy1LwYy=w3q~KKdbNtyH#d24PFjX)KYMY93{3-mPP-H>@M-_>N~DDu zENh~reh?JBAK=TFN-SfDfT^=+{w4ea2KNWXq2Y<;?(gf(FgVp8Zp-oEjKzB%2Iqj;48GmY3h=bcdYJ}~&4tS`Q1sb=^emaW$IC$|R+r-8V- zf0$gGE(CS_n4s>oicVk)MfvVg#I>iDvf~Ov8bk}sSxluG!6#^Z_zhB&U^`eIi1@j( z^CK$z^stBHtaDDHxn+R;3u+>Lil^}fj?7eaGB z&5nl^STqcaBxI@v>%zG|j))G(rVa4aY=B@^2{TFkW~YP!8!9TG#(-nOf^^X-%m9{Z zCC?iC`G-^RcBSCuk=Z`(FaUUe?hf3{0C>>$?Vs z`2Uud9M+T&KB6o4o9kvdi^Q=Bw!asPdxbe#W-Oaa#_NP(qpyF@bVxv5D5))srkU#m zj_KA+#7sqDn*Ipf!F5Byco4HOSd!Ui$l94|IbW%Ny(s1>f4|Mv^#NfB31N~kya9!k zWCGL-$0ZQztBate^fd>R!hXY_N9ZjYp3V~4_V z#eB)Kjr8yW=+oG)BuNdZG?jaZlw+l_ma8aET(s+-x+=F-t#Qoiuu1i`^x8Sj>b^U} zs^z<()YMFP7CmjUC@M=&lA5W7t&cxTlzJAts*%PBDAPuqcV5o7HEnqjif_7xGt)F% zGx2b4w{@!tE)$p=l3&?Bf#`+!-RLOleeRk3 z7#pF|w@6_sBmn1nECqdunmG^}pr5(ZJQVvAt$6p3H(16~;vO>?sTE`Y+mq5YP&PBo zvq!7#W$Gewy`;%6o^!Dtjz~x)T}Bdk*BS#=EY=ODD&B=V6TD2z^hj1m5^d6s)D*wk zu$z~D7QuZ2b?5`p)E8e2_L38v3WE{V`bVk;6fl#o2`) z99JsWhh?$oVRn@$S#)uK&8DL8>An0&S<%V8hnGD7Z^;Y(%6;^9!7kDQ5bjR_V+~wp zfx4m3z6CWmmZ<8gDGUyg3>t8wgJ5NkkiEm^(sedCicP^&3D%}6LtIUq>mXCAt{9eF zNXL$kGcoUTf_Lhm`t;hD-SE)m=iBnxRU(NyL}f6~1uH)`K!hmYZjLI%H}AmEF5RZt z06$wn63GHnApHXZZJ}s^s)j9(BM6e*7IBK6Bq(!)d~zR#rbxK9NVIlgquoMq z=eGZ9NR!SEqP6=9UQg#@!rtbbSBUM#ynF);zKX+|!Zm}*{H z+j=d?aZ2!?@EL7C~%B?6ouCKLnO$uWn;Y6Xz zX8dSwj732u(o*U3F$F=7xwxm>E-B+SVZH;O-4XPuPkLSt_?S0)lb7EEg)Mglk0#eS z9@jl(OnH4juMxY+*r03VDfPx_IM!Lmc(5hOI;`?d37f>jPP$?9jQQIQU@i4vuG6MagEoJrQ=RD7xt@8E;c zeGV*+Pt+t$@pt!|McETOE$9k=_C!70uhwRS9X#b%ZK z%q(TIUXSS^F0`4Cx?Rk07C6wI4!UVPeI~-fxY6`YH$kABdOuiRtl73MqG|~AzZ@iL&^s?24iS;RK_pdlWkhcF z@Wv-Om(Aealfg)D^adlXh9Nvf~Uf@y;g3Y)i(YP zEXDnb1V}1pJT5ZWyw=1i+0fni9yINurD=EqH^ciOwLUGi)C%Da)tyt=zq2P7pV5-G zR7!oq28-Fgn5pW|nlu^b!S1Z#r7!Wtr{5J5PQ>pd+2P7RSD?>(U7-|Y z7ZQ5lhYIl_IF<9?T9^IPK<(Hp;l5bl5tF9>X-zG14_7PfsA>6<$~A338iYRT{a@r_ zuXBaT=`T5x3=s&3=RYx6NgG>No4?5KFBVjE(swfcivcIpPQFx5l+O;fiGsOrl5teR z_Cm+;PW}O0Dwe_(4Z@XZ)O0W-v2X><&L*<~*q3dg;bQW3g7)a#3KiQP>+qj|qo*Hk z?57>f2?f@`=Fj^nkDKeRkN2d$Z@2eNKpHo}ksj-$`QKb6n?*$^*%Fb3_Kbf1(*W9K>{L$mud2WHJ=j0^=g30Xhg8$#g^?36`p1fm;;1@0Lrx+8t`?vN0ZorM zSW?rhjCE8$C|@p^sXdx z|NOHHg+fL;HIlqyLp~SSdIF`TnSHehNCU9t89yr@)FY<~hu+X`tjg(aSVae$wDG*C zq$nY(Y494R)hD!i1|IIyP*&PD_c2FPgeY)&mX1qujB1VHPG9`yFQpLFVQ0>EKS@Bp zAfP5`C(sWGLI?AC{XEjLKR4FVNw(4+9b?kba95ukgR1H?w<8F7)G+6&(zUhIE5Ef% z=fFkL3QKA~M@h{nzjRq!Y_t!%U66#L8!(2-GgFxkD1=JRRqk=n%G(yHKn%^&$dW>; zSjAcjETMz1%205se$iH_)ZCpfg_LwvnsZQAUCS#^FExp8O4CrJb6>JquNV@qPq~3A zZ<6dOU#6|8+fcgiA#~MDmcpIEaUO02L5#T$HV0$EMD94HT_eXLZ2Zi&(! z&5E>%&|FZ`)CN10tM%tLSPD*~r#--K(H-CZqIOb99_;m|D5wdgJ<1iOJz@h2Zkq?} z%8_KXb&hf=2Wza(Wgc;3v3TN*;HTU*q2?#z&tLn_U0Nt!y>Oo>+2T)He6%XuP;fgn z-G!#h$Y2`9>Jtf}hbVrm6D70|ERzLAU>3zoWhJmjWfgM^))T+2u$~5>HF9jQDkrXR z=IzX36)V75PrFjkQ%TO+iqKGCQ-DDXbaE;C#}!-CoWQx&v*vHfyI>$HNRbpvm<`O( zlx9NBWD6_e&J%Ous4yp~s6)Ghni!I6)0W;9(9$y1wWu`$gs<$9Mcf$L*piP zPR0Av*2%ul`W;?-1_-5Zy0~}?`e@Y5A&0H!^ApyVTT}BiOm4GeFo$_oPlDEyeGBbh z1h3q&Dx~GmUS|3@4V36&$2uO8!Yp&^pD7J5&TN{?xphf*-js1fP?B|`>p_K>lh{ij zP(?H%e}AIP?_i^f&Li=FDSQ`2_NWxL+BB=nQr=$ zHojMlXNGauvvwPU>ZLq!`bX-5F4jBJ&So{kE5+ms9UEYD{66!|k~3vsP+mE}x!>%P za98bAU0!h0&ka4EoiDvBM#CP#dRNdXJcb*(%=<(g+M@<)DZ!@v1V>;54En?igcHR2 zhubQMq}VSOK)onqHfczM7YA@s=9*ow;k;8)&?J3@0JiGcP! zP#00KZ1t)GyZeRJ=f0^gc+58lc4Qh*S7RqPIC6GugG1gXe$LIQMRCo8cHf^qXgAa2 z`}t>u2Cq1CbSEpLr~E=c7~=Qkc9-vLE%(v9N*&HF`(d~(0`iukl5aQ9u4rUvc8%m) zr2GwZN4!s;{SB87lJB;veebPmqE}tSpT>+`t?<457Q9iV$th%i__Z1kOMAswFldD6 ztbOvO337S5o#ZZgN2G99_AVqPv!?Gmt3pzgD+Hp3QPQ`9qJ(g=kjvD+fUSS3upJn! zqoG7acIKEFRX~S}3|{EWT$kdz#zrDlJU(rPkxjws_iyLKU8+v|*oS_W*-guAb&Pj1 z35Z`3z<&Jb@2Mwz=KXucNYdY#SNO$tcVFr9KdKm|%^e-TXzs6M`PBper%ajkrIyUe zp$vVxVs9*>Vp4_1NC~Zg)WOCPmOxI1V34QlG4!aSFOH{QqSVq1^1)- z0P!Z?tT&E-ll(pwf0?=F=yOzik=@nh1Clxr9}Vij89z)ePDSCYAqw?lVI?v?+&*zH z)p$CScFI8rrwId~`}9YWPFu0cW1Sf@vRELs&cbntRU6QfPK-SO*mqu|u~}8AJ!Q$z znzu}50O=YbjwKCuSVBs6&CZR#0FTu)3{}qJJYX(>QPr4$RqWiwX3NT~;>cLn*_&1H zaKpIW)JVJ>b{uo2oq>oQt3y=zJjb%fU@wLqM{SyaC6x2snMx-}ivfU<1- znu1Lh;i$3Tf$Kh5Uk))G!D1UhE8pvx&nO~w^fG)BC&L!_hQk%^p`Kp@F{cz>80W&T ziOK=Sq3fdRu*V0=S53rcIfWFazI}Twj63CG(jOB;$*b`*#B9uEnBM`hDk*EwSRdwP8?5T?xGUKs=5N83XsR*)a4|ijz|c{4tIU+4j^A5C<#5 z*$c_d=5ml~%pGxw#?*q9N7aRwPux5EyqHVkdJO=5J>84!X6P>DS8PTTz>7C#FO?k#edkntG+fJk8ZMn?pmJSO@`x-QHq;7^h6GEXLXo1TCNhH z8ZDH{*NLAjo3WM`xeb=X{((uv3H(8&r8fJJg_uSs_%hOH%JDD?hu*2NvWGYD+j)&` zz#_1%O1wF^o5ryt?O0n;`lHbzp0wQ?rcbW(F1+h7_EZZ9{>rePvLAPVZ_R|n@;b$;UchU=0j<6k8G9QuQf@76oiE*4 zXOLQ&n3$NR#p4<5NJMVC*S);5x2)eRbaAM%VxWu9ohlT;pGEk7;002enCbQ>2r-us z3#bpXP9g|mE`65VrN`+3mC)M(eMj~~eOf)do<@l+fMiTR)XO}422*1SL{wyY(%oMpBgJagtiDf zz>O6(m;};>Hi=t8o{DVC@YigqS(Qh+ix3Rwa9aliH}a}IlOCW1@?%h_bRbq-W{KHF z%Vo?-j@{Xi@=~Lz5uZP27==UGE15|g^0gzD|3x)SCEXrx`*MP^FDLl%pOi~~Il;dc z^hrwp9sYeT7iZ)-ajKy@{a`kr0-5*_!XfBpXwEcFGJ;%kV$0Nx;apKrur zJN2J~CAv{Zjj%FolyurtW8RaFmpn&zKJWL>(0;;+q(%(Hx!GMW4AcfP0YJ*Vz!F4g z!ZhMyj$BdXL@MlF%KeInmPCt~9&A!;cRw)W!Hi@0DY(GD_f?jeV{=s=cJ6e}JktJw zQORnxxj3mBxfrH=x{`_^Z1ddDh}L#V7i}$njUFRVwOX?qOTKjfPMBO4y(WiU<)epb zvB9L=%jW#*SL|Nd_G?E*_h1^M-$PG6Pc_&QqF0O-FIOpa4)PAEPsyvB)GKasmBoEt z?_Q2~QCYGH+hW31x-B=@5_AN870vY#KB~3a*&{I=f);3Kv7q4Q7s)0)gVYx2#Iz9g(F2;=+Iy4 z6KI^8GJ6D@%tpS^8boU}zpi=+(5GfIR)35PzrbuXeL1Y1N%JK7PG|^2k3qIqHfX;G zQ}~JZ-UWx|60P5?d1e;AHx!_;#PG%d=^X(AR%i`l0jSpYOpXoKFW~7ip7|xvN;2^? zsYC9fanpO7rO=V7+KXqVc;Q5z%Bj})xHVrgoR04sA2 zl~DAwv=!(()DvH*=lyhIlU^hBkA0$e*7&fJpB0|oB7)rqGK#5##2T`@_I^|O2x4GO z;xh6ROcV<9>?e0)MI(y++$-ksV;G;Xe`lh76T#Htuia+(UrIXrf9?

L(tZ$0BqX1>24?V$S+&kLZ`AodQ4_)P#Q3*4xg8}lMV-FLwC*cN$< zt65Rf%7z41u^i=P*qO8>JqXPrinQFapR7qHAtp~&RZ85$>ob|Js;GS^y;S{XnGiBc zGa4IGvDl?x%gY`vNhv8wgZnP#UYI-w*^4YCZnxkF85@ldepk$&$#3EAhrJY0U)lR{F6sM3SONV^+$;Zx8BD&Eku3K zKNLZyBni3)pGzU0;n(X@1fX8wYGKYMpLmCu{N5-}epPDxClPFK#A@02WM3!myN%bkF z|GJ4GZ}3sL{3{qXemy+#Uk{4>Kf8v11;f8I&c76+B&AQ8udd<8gU7+BeWC`akUU~U zgXoxie>MS@rBoyY8O8Tc&8id!w+_ooxcr!1?#rc$-|SBBtH6S?)1e#P#S?jFZ8u-Bs&k`yLqW|{j+%c#A4AQ>+tj$Y z^CZajspu$F%73E68Lw5q7IVREED9r1Ijsg#@DzH>wKseye>hjsk^{n0g?3+gs@7`i zHx+-!sjLx^fS;fY!ERBU+Q zVJ!e0hJH%P)z!y%1^ZyG0>PN@5W~SV%f>}c?$H8r;Sy-ui>aruVTY=bHe}$e zi&Q4&XK!qT7-XjCrDaufT@>ieQ&4G(SShUob0Q>Gznep9fR783jGuUynAqc6$pYX; z7*O@@JW>O6lKIk0G00xsm|=*UVTQBB`u1f=6wGAj%nHK_;Aqmfa!eAykDmi-@u%6~ z;*c!pS1@V8r@IX9j&rW&d*}wpNs96O2Ute>%yt{yv>k!6zfT6pru{F1M3P z2WN1JDYqoTB#(`kE{H676QOoX`cnqHl1Yaru)>8Ky~VU{)r#{&s86Vz5X)v15ULHA zAZDb{99+s~qI6;-dQ5DBjHJP@GYTwn;Dv&9kE<0R!d z8tf1oq$kO`_sV(NHOSbMwr=To4r^X$`sBW4$gWUov|WY?xccQJN}1DOL|GEaD_!@& z15p?Pj+>7d`@LvNIu9*^hPN)pwcv|akvYYq)ks%`G>!+!pW{-iXPZsRp8 z35LR;DhseQKWYSD`%gO&k$Dj6_6q#vjWA}rZcWtQr=Xn*)kJ9kacA=esi*I<)1>w^ zO_+E>QvjP)qiSZg9M|GNeLtO2D7xT6vsj`88sd!94j^AqxFLi}@w9!Y*?nwWARE0P znuI_7A-saQ+%?MFA$gttMV-NAR^#tjl_e{R$N8t2NbOlX373>e7Ox=l=;y#;M7asp zRCz*CLnrm$esvSb5{T<$6CjY zmZ(i{Rs_<#pWW>(HPaaYj`%YqBra=Ey3R21O7vUbzOkJJO?V`4-D*u4$Me0Bx$K(lYo`JO}gnC zx`V}a7m-hLU9Xvb@K2ymioF)vj12<*^oAqRuG_4u%(ah?+go%$kOpfb`T96P+L$4> zQ#S+sA%VbH&mD1k5Ak7^^dZoC>`1L%i>ZXmooA!%GI)b+$D&ziKrb)a=-ds9xk#~& z7)3iem6I|r5+ZrTRe_W861x8JpD`DDIYZNm{$baw+$)X^Jtjnl0xlBgdnNY}x%5za zkQ8E6T<^$sKBPtL4(1zi_Rd(tVth*3Xs!ulflX+70?gb&jRTnI8l+*Aj9{|d%qLZ+ z>~V9Z;)`8-lds*Zgs~z1?Fg?Po7|FDl(Ce<*c^2=lFQ~ahwh6rqSjtM5+$GT>3WZW zj;u~w9xwAhOc<kF}~`CJ68 z?(S5vNJa;kriPlim33{N5`C{9?NWhzsna_~^|K2k4xz1`xcui*LXL-1#Y}Hi9`Oo!zQ>x-kgAX4LrPz63uZ+?uG*84@PKq-KgQlMNRwz=6Yes) zY}>YN+qP}nwr$(CZQFjUOI=-6J$2^XGvC~EZ+vrqWaOXB$k?%Suf5k=4>AveC1aJ! ziaW4IS%F$_Babi)kA8Y&u4F7E%99OPtm=vzw$$ zEz#9rvn`Iot_z-r3MtV>k)YvErZ<^Oa${`2>MYYODSr6?QZu+be-~MBjwPGdMvGd!b!elsdi4% z`37W*8+OGulab8YM?`KjJ8e+jM(tqLKSS@=jimq3)Ea2EB%88L8CaM+aG7;27b?5` z4zuUWBr)f)k2o&xg{iZ$IQkJ+SK>lpq4GEacu~eOW4yNFLU!Kgc{w4&D$4ecm0f}~ zTTzquRW@`f0}|IILl`!1P+;69g^upiPA6F{)U8)muWHzexRenBU$E^9X-uIY2%&1w z_=#5*(nmxJ9zF%styBwivi)?#KMG96-H@hD-H_&EZiRNsfk7mjBq{L%!E;Sqn!mVX*}kXhwH6eh;b42eD!*~upVG@ z#smUqz$ICm!Y8wY53gJeS|Iuard0=;k5i5Z_hSIs6tr)R4n*r*rE`>38Pw&lkv{_r!jNN=;#?WbMj|l>cU(9trCq; z%nN~r^y7!kH^GPOf3R}?dDhO=v^3BeP5hF|%4GNQYBSwz;x({21i4OQY->1G=KFyu z&6d`f2tT9Yl_Z8YACZaJ#v#-(gcyeqXMhYGXb=t>)M@fFa8tHp2x;ODX=Ap@a5I=U z0G80^$N0G4=U(>W%mrrThl0DjyQ-_I>+1Tdd_AuB3qpYAqY54upwa3}owa|x5iQ^1 zEf|iTZxKNGRpI>34EwkIQ2zHDEZ=(J@lRaOH>F|2Z%V_t56Km$PUYu^xA5#5Uj4I4RGqHD56xT%H{+P8Ag>e_3pN$4m8n>i%OyJFPNWaEnJ4McUZPa1QmOh?t8~n& z&RulPCors8wUaqMHECG=IhB(-tU2XvHP6#NrLVyKG%Ee*mQ5Ps%wW?mcnriTVRc4J`2YVM>$ixSF2Xi+Wn(RUZnV?mJ?GRdw%lhZ+t&3s7g!~g{%m&i<6 z5{ib-<==DYG93I(yhyv4jp*y3#*WNuDUf6`vTM%c&hiayf(%=x@4$kJ!W4MtYcE#1 zHM?3xw63;L%x3drtd?jot!8u3qeqctceX3m;tWetK+>~q7Be$h>n6riK(5@ujLgRS zvOym)k+VAtyV^mF)$29Y`nw&ijdg~jYpkx%*^ z8dz`C*g=I?;clyi5|!27e2AuSa$&%UyR(J3W!A=ZgHF9OuKA34I-1U~pyD!KuRkjA zbkN!?MfQOeN>DUPBxoy5IX}@vw`EEB->q!)8fRl_mqUVuRu|C@KD-;yl=yKc=ZT0% zB$fMwcC|HE*0f8+PVlWHi>M`zfsA(NQFET?LrM^pPcw`cK+Mo0%8*x8@65=CS_^$cG{GZQ#xv($7J z??R$P)nPLodI;P!IC3eEYEHh7TV@opr#*)6A-;EU2XuogHvC;;k1aI8asq7ovoP!* z?x%UoPrZjj<&&aWpsbr>J$Er-7!E(BmOyEv!-mbGQGeJm-U2J>74>o5x`1l;)+P&~ z>}f^=Rx(ZQ2bm+YE0u=ZYrAV@apyt=v1wb?R@`i_g64YyAwcOUl=C!i>=Lzb$`tjv zOO-P#A+)t-JbbotGMT}arNhJmmGl-lyUpMn=2UacVZxmiG!s!6H39@~&uVokS zG=5qWhfW-WOI9g4!R$n7!|ViL!|v3G?GN6HR0Pt_L5*>D#FEj5wM1DScz4Jv@Sxnl zB@MPPmdI{(2D?;*wd>3#tjAirmUnQoZrVv`xM3hARuJksF(Q)wd4P$88fGYOT1p6U z`AHSN!`St}}UMBT9o7i|G`r$ zrB=s$qV3d6$W9@?L!pl0lf%)xs%1ko^=QY$ty-57=55PvP(^6E7cc zGJ*>m2=;fOj?F~yBf@K@9qwX0hA803Xw+b0m}+#a(>RyR8}*Y<4b+kpp|OS+!whP( zH`v{%s>jsQI9rd$*vm)EkwOm#W_-rLTHcZRek)>AtF+~<(did)*oR1|&~1|e36d-d zgtm5cv1O0oqgWC%Et@P4Vhm}Ndl(Y#C^MD03g#PH-TFy+7!Osv1z^UWS9@%JhswEq~6kSr2DITo59+; ze=ZC}i2Q?CJ~Iyu?vn|=9iKV>4j8KbxhE4&!@SQ^dVa-gK@YfS9xT(0kpW*EDjYUkoj! zE49{7H&E}k%5(>sM4uGY)Q*&3>{aitqdNnRJkbOmD5Mp5rv-hxzOn80QsG=HJ_atI-EaP69cacR)Uvh{G5dTpYG7d zbtmRMq@Sexey)||UpnZ?;g_KMZq4IDCy5}@u!5&B^-=6yyY{}e4Hh3ee!ZWtL*s?G zxG(A!<9o!CL+q?u_utltPMk+hn?N2@?}xU0KlYg?Jco{Yf@|mSGC<(Zj^yHCvhmyx z?OxOYoxbptDK()tsJ42VzXdINAMWL$0Gcw?G(g8TMB)Khw_|v9`_ql#pRd2i*?CZl z7k1b!jQB=9-V@h%;Cnl7EKi;Y^&NhU0mWEcj8B|3L30Ku#-9389Q+(Yet0r$F=+3p z6AKOMAIi|OHyzlHZtOm73}|ntKtFaXF2Fy|M!gOh^L4^62kGUoWS1i{9gsds_GWBc zLw|TaLP64z3z9?=R2|T6Xh2W4_F*$cq>MtXMOy&=IPIJ`;!Tw?PqvI2b*U1)25^<2 zU_ZPoxg_V0tngA0J+mm?3;OYw{i2Zb4x}NedZug!>EoN3DC{1i)Z{Z4m*(y{ov2%- zk(w>+scOO}MN!exSc`TN)!B=NUX`zThWO~M*ohqq;J2hx9h9}|s#?@eR!=F{QTrq~ zTcY|>azkCe$|Q0XFUdpFT=lTcyW##i;-e{}ORB4D?t@SfqGo_cS z->?^rh$<&n9DL!CF+h?LMZRi)qju!meugvxX*&jfD!^1XB3?E?HnwHP8$;uX{Rvp# zh|)hM>XDv$ZGg=$1{+_bA~u-vXqlw6NH=nkpyWE0u}LQjF-3NhATL@9rRxMnpO%f7 z)EhZf{PF|mKIMFxnC?*78(}{Y)}iztV12}_OXffJ;ta!fcFIVjdchyHxH=t%ci`Xd zX2AUB?%?poD6Zv*&BA!6c5S#|xn~DK01#XvjT!w!;&`lDXSJT4_j$}!qSPrb37vc{ z9^NfC%QvPu@vlxaZ;mIbn-VHA6miwi8qJ~V;pTZkKqqOii<1Cs}0i?uUIss;hM4dKq^1O35y?Yp=l4i zf{M!@QHH~rJ&X~8uATV><23zZUbs-J^3}$IvV_ANLS08>k`Td7aU_S1sLsfi*C-m1 z-e#S%UGs4E!;CeBT@9}aaI)qR-6NU@kvS#0r`g&UWg?fC7|b^_HyCE!8}nyh^~o@< zpm7PDFs9yxp+byMS(JWm$NeL?DNrMCNE!I^ko-*csB+dsf4GAq{=6sfyf4wb>?v1v zmb`F*bN1KUx-`ra1+TJ37bXNP%`-Fd`vVQFTwWpX@;s(%nDQa#oWhgk#mYlY*!d>( zE&!|ySF!mIyfING+#%RDY3IBH_fW$}6~1%!G`suHub1kP@&DoAd5~7J55;5_noPI6eLf{t;@9Kf<{aO0`1WNKd?<)C-|?C?)3s z>wEq@8=I$Wc~Mt$o;g++5qR+(6wt9GI~pyrDJ%c?gPZe)owvy^J2S=+M^ z&WhIE`g;;J^xQLVeCtf7b%Dg#Z2gq9hp_%g)-%_`y*zb; zn9`f`mUPN-Ts&fFo(aNTsXPA|J!TJ{0hZp0^;MYHLOcD=r_~~^ymS8KLCSeU3;^QzJNqS z5{5rEAv#l(X?bvwxpU;2%pQftF`YFgrD1jt2^~Mt^~G>T*}A$yZc@(k9orlCGv&|1 zWWvVgiJsCAtamuAYT~nzs?TQFt<1LSEx!@e0~@yd6$b5!Zm(FpBl;(Cn>2vF?k zOm#TTjFwd2D-CyA!mqR^?#Uwm{NBemP>(pHmM}9;;8`c&+_o3#E5m)JzfwN?(f-a4 zyd%xZc^oQx3XT?vcCqCX&Qrk~nu;fxs@JUoyVoi5fqpi&bUhQ2y!Ok2pzsFR(M(|U zw3E+kH_zmTRQ9dUMZWRE%Zakiwc+lgv7Z%|YO9YxAy`y28`Aw;WU6HXBgU7fl@dnt z-fFBV)}H-gqP!1;V@Je$WcbYre|dRdp{xt!7sL3Eoa%IA`5CAA%;Wq8PktwPdULo! z8!sB}Qt8#jH9Sh}QiUtEPZ6H0b*7qEKGJ%ITZ|vH)5Q^2m<7o3#Z>AKc%z7_u`rXA zqrCy{-{8;9>dfllLu$^M5L z-hXs))h*qz%~ActwkIA(qOVBZl2v4lwbM>9l70Y`+T*elINFqt#>OaVWoja8RMsep z6Or3f=oBnA3vDbn*+HNZP?8LsH2MY)x%c13@(XfuGR}R?Nu<|07{$+Lc3$Uv^I!MQ z>6qWgd-=aG2Y^24g4{Bw9ueOR)(9h`scImD=86dD+MnSN4$6 z^U*o_mE-6Rk~Dp!ANp#5RE9n*LG(Vg`1)g6!(XtDzsov$Dvz|Gv1WU68J$CkshQhS zCrc|cdkW~UK}5NeaWj^F4MSgFM+@fJd{|LLM)}_O<{rj z+?*Lm?owq?IzC%U%9EBga~h-cJbIu=#C}XuWN>OLrc%M@Gu~kFEYUi4EC6l#PR2JS zQUkGKrrS#6H7}2l0F@S11DP`@pih0WRkRJl#F;u{c&ZC{^$Z+_*lB)r)-bPgRFE;* zl)@hK4`tEP=P=il02x7-C7p%l=B`vkYjw?YhdJU9!P!jcmY$OtC^12w?vy3<<=tlY zUwHJ_0lgWN9vf>1%WACBD{UT)1qHQSE2%z|JHvP{#INr13jM}oYv_5#xsnv9`)UAO zuwgyV4YZ;O)eSc3(mka6=aRohi!HH@I#xq7kng?Acdg7S4vDJb6cI5fw?2z%3yR+| zU5v@Hm}vy;${cBp&@D=HQ9j7NcFaOYL zj-wV=eYF{|XTkFNM2uz&T8uH~;)^Zo!=KP)EVyH6s9l1~4m}N%XzPpduPg|h-&lL` zAXspR0YMOKd2yO)eMFFJ4?sQ&!`dF&!|niH*!^*Ml##o0M(0*uK9&yzekFi$+mP9s z>W9d%Jb)PtVi&-Ha!o~Iyh@KRuKpQ@)I~L*d`{O8!kRObjO7=n+Gp36fe!66neh+7 zW*l^0tTKjLLzr`x4`_8&on?mjW-PzheTNox8Hg7Nt@*SbE-%kP2hWYmHu#Fn@Q^J(SsPUz*|EgOoZ6byg3ew88UGdZ>9B2Tq=jF72ZaR=4u%1A6Vm{O#?@dD!(#tmR;eP(Fu z{$0O%=Vmua7=Gjr8nY%>ul?w=FJ76O2js&17W_iq2*tb!i{pt#`qZB#im9Rl>?t?0c zicIC}et_4d+CpVPx)i4~$u6N-QX3H77ez z?ZdvXifFk|*F8~L(W$OWM~r`pSk5}#F?j_5u$Obu9lDWIknO^AGu+Blk7!9Sb;NjS zncZA?qtASdNtzQ>z7N871IsPAk^CC?iIL}+{K|F@BuG2>qQ;_RUYV#>hHO(HUPpk@ z(bn~4|F_jiZi}Sad;_7`#4}EmD<1EiIxa48QjUuR?rC}^HRocq`OQPM@aHVKP9E#q zy%6bmHygCpIddPjE}q_DPC`VH_2m;Eey&ZH)E6xGeStOK7H)#+9y!%-Hm|QF6w#A( zIC0Yw%9j$s-#odxG~C*^MZ?M<+&WJ+@?B_QPUyTg9DJGtQN#NIC&-XddRsf3n^AL6 zT@P|H;PvN;ZpL0iv$bRb7|J{0o!Hq+S>_NrH4@coZtBJu#g8#CbR7|#?6uxi8d+$g z87apN>EciJZ`%Zv2**_uiET9Vk{pny&My;+WfGDw4EVL#B!Wiw&M|A8f1A@ z(yFQS6jfbH{b8Z-S7D2?Ixl`j0{+ZnpT=;KzVMLW{B$`N?Gw^Fl0H6lT61%T2AU**!sX0u?|I(yoy&Xveg7XBL&+>n6jd1##6d>TxE*Vj=8lWiG$4=u{1UbAa5QD>5_ z;Te^42v7K6Mmu4IWT6Rnm>oxrl~b<~^e3vbj-GCdHLIB_>59}Ya+~OF68NiH=?}2o zP(X7EN=quQn&)fK>M&kqF|<_*H`}c zk=+x)GU>{Af#vx&s?`UKUsz})g^Pc&?Ka@t5$n$bqf6{r1>#mWx6Ep>9|A}VmWRnowVo`OyCr^fHsf# zQjQ3Ttp7y#iQY8l`zEUW)(@gGQdt(~rkxlkefskT(t%@i8=|p1Y9Dc5bc+z#n$s13 zGJk|V0+&Ekh(F};PJzQKKo+FG@KV8a<$gmNSD;7rd_nRdc%?9)p!|B-@P~kxQG}~B zi|{0}@}zKC(rlFUYp*dO1RuvPC^DQOkX4<+EwvBAC{IZQdYxoq1Za!MW7%p7gGr=j zzWnAq%)^O2$eItftC#TTSArUyL$U54-O7e|)4_7%Q^2tZ^0-d&3J1}qCzR4dWX!)4 zzIEKjgnYgMus^>6uw4Jm8ga6>GBtMjpNRJ6CP~W=37~||gMo_p@GA@#-3)+cVYnU> zE5=Y4kzl+EbEh%dhQokB{gqNDqx%5*qBusWV%!iprn$S!;oN_6E3?0+umADVs4ako z?P+t?m?};gev9JXQ#Q&KBpzkHPde_CGu-y z<{}RRAx=xlv#mVi+Ibrgx~ujW$h{?zPfhz)Kp7kmYS&_|97b&H&1;J-mzrBWAvY} zh8-I8hl_RK2+nnf&}!W0P+>5?#?7>npshe<1~&l_xqKd0_>dl_^RMRq@-Myz&|TKZBj1=Q()) zF{dBjv5)h=&Z)Aevx}+i|7=R9rG^Di!sa)sZCl&ctX4&LScQ-kMncgO(9o6W6)yd< z@Rk!vkja*X_N3H=BavGoR0@u0<}m-7|2v!0+2h~S2Q&a=lTH91OJsvms2MT~ zY=c@LO5i`mLpBd(vh|)I&^A3TQLtr>w=zoyzTd=^f@TPu&+*2MtqE$Avf>l>}V|3-8Fp2hzo3y<)hr_|NO(&oSD z!vEjTWBxbKTiShVl-U{n*B3#)3a8$`{~Pk}J@elZ=>Pqp|MQ}jrGv7KrNcjW%TN_< zZz8kG{#}XoeWf7qY?D)L)8?Q-b@Na&>i=)(@uNo zr;cH98T3$Iau8Hn*@vXi{A@YehxDE2zX~o+RY`)6-X{8~hMpc#C`|8y> zU8Mnv5A0dNCf{Ims*|l-^ z(MRp{qoGohB34|ggDI*p!Aw|MFyJ|v+<+E3brfrI)|+l3W~CQLPbnF@G0)P~Ly!1TJLp}xh8uW`Q+RB-v`MRYZ9Gam3cM%{ zb4Cb*f)0deR~wtNb*8w-LlIF>kc7DAv>T0D(a3@l`k4TFnrO+g9XH7;nYOHxjc4lq zMmaW6qpgAgy)MckYMhl?>sq;-1E)-1llUneeA!ya9KM$)DaNGu57Z5aE>=VST$#vb zFo=uRHr$0M{-ha>h(D_boS4zId;3B|Tpqo|?B?Z@I?G(?&Iei+-{9L_A9=h=Qfn-U z1wIUnQe9!z%_j$F_{rf&`ZFSott09gY~qrf@g3O=Y>vzAnXCyL!@(BqWa)Zqt!#_k zfZHuwS52|&&)aK;CHq9V-t9qt0au{$#6c*R#e5n3rje0hic7c7m{kW$p(_`wB=Gw7 z4k`1Hi;Mc@yA7dp@r~?@rfw)TkjAW++|pkfOG}0N|2guek}j8Zen(!+@7?qt_7ndX zB=BG6WJ31#F3#Vk3=aQr8T)3`{=p9nBHlKzE0I@v`{vJ}h8pd6vby&VgFhzH|q;=aonunAXL6G2y(X^CtAhWr*jI zGjpY@raZDQkg*aMq}Ni6cRF z{oWv}5`nhSAv>usX}m^GHt`f(t8@zHc?K|y5Zi=4G*UG1Sza{$Dpj%X8 zzEXaKT5N6F5j4J|w#qlZP!zS7BT)9b+!ZSJdToqJts1c!)fwih4d31vfb{}W)EgcA zH2pZ^8_k$9+WD2n`6q5XbOy8>3pcYH9 z07eUB+p}YD@AH!}p!iKv><2QF-Y^&xx^PAc1F13A{nUeCDg&{hnix#FiO!fe(^&%Qcux!h znu*S!s$&nnkeotYsDthh1dq(iQrE|#f_=xVgfiiL&-5eAcC-> z5L0l|DVEM$#ulf{bj+Y~7iD)j<~O8CYM8GW)dQGq)!mck)FqoL^X zwNdZb3->hFrbHFm?hLvut-*uK?zXn3q1z|UX{RZ;-WiLoOjnle!xs+W0-8D)kjU#R z+S|A^HkRg$Ij%N4v~k`jyHffKaC~=wg=9)V5h=|kLQ@;^W!o2^K+xG&2n`XCd>OY5Ydi= zgHH=lgy++erK8&+YeTl7VNyVm9-GfONlSlVb3)V9NW5tT!cJ8d7X)!b-$fb!s76{t z@d=Vg-5K_sqHA@Zx-L_}wVnc@L@GL9_K~Zl(h5@AR#FAiKad8~KeWCo@mgXIQ#~u{ zgYFwNz}2b6Vu@CP0XoqJ+dm8px(5W5-Jpis97F`+KM)TuP*X8H@zwiVKDKGVp59pI zifNHZr|B+PG|7|Y<*tqap0CvG7tbR1R>jn70t1X`XJixiMVcHf%Ez*=xm1(CrTSDt z0cle!+{8*Ja&EOZ4@$qhBuKQ$U95Q%rc7tg$VRhk?3=pE&n+T3upZg^ZJc9~c2es% zh7>+|mrmA-p&v}|OtxqmHIBgUxL~^0+cpfkSK2mhh+4b=^F1Xgd2)}U*Yp+H?ls#z zrLxWg_hm}AfK2XYWr!rzW4g;+^^&bW%LmbtRai9f3PjU${r@n`JThy-cphbcwn)rq9{A$Ht`lmYKxOacy z6v2R(?gHhD5@&kB-Eg?4!hAoD7~(h>(R!s1c1Hx#s9vGPePUR|of32bS`J5U5w{F) z>0<^ktO2UHg<0{oxkdOQ;}coZDQph8p6ruj*_?uqURCMTac;>T#v+l1Tc~%^k-Vd@ zkc5y35jVNc49vZpZx;gG$h{%yslDI%Lqga1&&;mN{Ush1c7p>7e-(zp}6E7f-XmJb4nhk zb8zS+{IVbL$QVF8pf8}~kQ|dHJAEATmmnrb_wLG}-yHe>W|A&Y|;muy-d^t^<&)g5SJfaTH@P1%euONny=mxo+C z4N&w#biWY41r8k~468tvuYVh&XN&d#%QtIf9;iVXfWY)#j=l`&B~lqDT@28+Y!0E+MkfC}}H*#(WKKdJJq=O$vNYCb(ZG@p{fJgu;h z21oHQ(14?LeT>n5)s;uD@5&ohU!@wX8w*lB6i@GEH0pM>YTG+RAIWZD;4#F1&F%Jp zXZUml2sH0!lYJT?&sA!qwez6cXzJEd(1ZC~kT5kZSp7(@=H2$Azb_*W&6aA|9iwCL zdX7Q=42;@dspHDwYE?miGX#L^3xD&%BI&fN9^;`v4OjQXPBaBmOF1;#C)8XA(WFlH zycro;DS2?(G&6wkr6rqC>rqDv3nfGw3hmN_9Al>TgvmGsL8_hXx09};l9Ow@)F5@y z#VH5WigLDwZE4nh^7&@g{1FV^UZ%_LJ-s<{HN*2R$OPg@R~Z`c-ET*2}XB@9xvAjrK&hS=f|R8Gr9 zr|0TGOsI7RD+4+2{ZiwdVD@2zmg~g@^D--YL;6UYGSM8i$NbQr4!c7T9rg!8;TM0E zT#@?&S=t>GQm)*ua|?TLT2ktj#`|R<_*FAkOu2Pz$wEc%-=Y9V*$&dg+wIei3b*O8 z2|m$!jJG!J!ZGbbIa!(Af~oSyZV+~M1qGvelMzPNE_%5?c2>;MeeG2^N?JDKjFYCy z7SbPWH-$cWF9~fX%9~v99L!G(wi!PFp>rB!9xj7=Cv|F+7CsGNwY0Q_J%FID%C^CBZQfJ9K(HK%k31j~e#&?hQ zNuD6gRkVckU)v+53-fc} z7ZCzYN-5RG4H7;>>Hg?LU9&5_aua?A0)0dpew1#MMlu)LHe(M;OHjHIUl7|%%)YPo z0cBk;AOY00%Fe6heoN*$(b<)Cd#^8Iu;-2v@>cE-OB$icUF9EEoaC&q8z9}jMTT2I z8`9;jT%z0;dy4!8U;GW{i`)3!c6&oWY`J3669C!tM<5nQFFrFRglU8f)5Op$GtR-3 zn!+SPCw|04sv?%YZ(a7#L?vsdr7ss@WKAw&A*}-1S|9~cL%uA+E~>N6QklFE>8W|% zyX-qAUGTY1hQ-+um`2|&ji0cY*(qN!zp{YpDO-r>jPk*yuVSay<)cUt`t@&FPF_&$ zcHwu1(SQ`I-l8~vYyUxm@D1UEdFJ$f5Sw^HPH7b!9 zzYT3gKMF((N(v0#4f_jPfVZ=ApN^jQJe-X$`A?X+vWjLn_%31KXE*}5_}d8 zw_B1+a#6T1?>M{ronLbHIlEsMf93muJ7AH5h%;i99<~JX^;EAgEB1uHralD*!aJ@F zV2ruuFe9i2Q1C?^^kmVy921eb=tLDD43@-AgL^rQ3IO9%+vi_&R2^dpr}x{bCVPej z7G0-0o64uyWNtr*loIvslyo0%)KSDDKjfThe0hcqs)(C-MH1>bNGBDRTW~scy_{w} zp^aq8Qb!h9Lwielq%C1b8=?Z=&U)ST&PHbS)8Xzjh2DF?d{iAv)Eh)wsUnf>UtXN( zL7=$%YrZ#|^c{MYmhn!zV#t*(jdmYdCpwqpZ{v&L8KIuKn`@IIZfp!uo}c;7J57N` zAxyZ-uA4=Gzl~Ovycz%MW9ZL7N+nRo&1cfNn9(1H5eM;V_4Z_qVann7F>5f>%{rf= zPBZFaV@_Sobl?Fy&KXyzFDV*FIdhS5`Uc~S^Gjo)aiTHgn#<0C=9o-a-}@}xDor;D zZyZ|fvf;+=3MZd>SR1F^F`RJEZo+|MdyJYQAEauKu%WDol~ayrGU3zzbHKsnHKZ*z zFiwUkL@DZ>!*x05ql&EBq@_Vqv83&?@~q5?lVmffQZ+V-=qL+!u4Xs2Z2zdCQ3U7B&QR9_Iggy} z(om{Y9eU;IPe`+p1ifLx-XWh?wI)xU9ik+m#g&pGdB5Bi<`PR*?92lE0+TkRuXI)z z5LP!N2+tTc%cB6B1F-!fj#}>S!vnpgVU~3!*U1ej^)vjUH4s-bd^%B=ItQqDCGbrEzNQi(dJ`J}-U=2{7-d zK8k^Rlq2N#0G?9&1?HSle2vlkj^KWSBYTwx`2?9TU_DX#J+f+qLiZCqY1TXHFxXZqYMuD@RU$TgcnCC{_(vwZ-*uX)~go#%PK z@}2Km_5aQ~(<3cXeJN6|F8X_1@L%@xTzs}$_*E|a^_URF_qcF;Pfhoe?FTFwvjm1o z8onf@OY@jC2tVcMaZS;|T!Ks(wOgPpRzRnFS-^RZ4E!9dsnj9sFt609a|jJbb1Dt@ z<=Gal2jDEupxUSwWu6zp<<&RnAA;d&4gKVG0iu6g(DsST(4)z6R)zDpfaQ}v{5ARt zyhwvMtF%b-YazR5XLz+oh=mn;y-Mf2a8>7?2v8qX;19y?b>Z5laGHvzH;Nu9S`B8} zI)qN$GbXIQ1VL3lnof^6TS~rvPVg4V?Dl2Bb*K2z4E{5vy<(@@K_cN@U>R!>aUIRnb zL*)=787*cs#zb31zBC49x$`=fkQbMAef)L2$dR{)6BAz!t5U_B#1zZG`^neKSS22oJ#5B=gl%U=WeqL9REF2g zZnfCb0?quf?Ztj$VXvDSWoK`0L=Zxem2q}!XWLoT-kYMOx)!7fcgT35uC~0pySEme z`{wGWTkGr7>+Kb^n;W?BZH6ZP(9tQX%-7zF>vc2}LuWDI(9kh1G#7B99r4x6;_-V+k&c{nPUrR zAXJGRiMe~aup{0qzmLNjS_BC4cB#sXjckx{%_c&^xy{M61xEb>KW_AG5VFXUOjAG4 z^>Qlm9A#1N{4snY=(AmWzatb!ngqiqPbBZ7>Uhb3)dTkSGcL#&SH>iMO-IJBPua`u zo)LWZ>=NZLr758j{%(|uQuZ)pXq_4c!!>s|aDM9#`~1bzK3J1^^D#<2bNCccH7~-X}Ggi!pIIF>uFx%aPARGQsnC8ZQc8lrQ5o~smqOg>Ti^GNme94*w z)JZy{_{#$jxGQ&`M z!OMvZMHR>8*^>eS%o*6hJwn!l8VOOjZQJvh)@tnHVW&*GYPuxqXw}%M!(f-SQf`=L z5;=5w2;%82VMH6Xi&-K3W)o&K^+vJCepWZ-rW%+Dc6X3(){z$@4zjYxQ|}8UIojeC zYZpQ1dU{fy=oTr<4VX?$q)LP}IUmpiez^O&N3E_qPpchGTi5ZM6-2ScWlQq%V&R2Euz zO|Q0Hx>lY1Q1cW5xHv5!0OGU~PVEqSuy#fD72d#O`N!C;o=m+YioGu-wH2k6!t<~K zSr`E=W9)!g==~x9VV~-8{4ZN9{~-A9zJpRe%NGg$+MDuI-dH|b@BD)~>pPCGUNNzY zMDg||0@XGQgw`YCt5C&A{_+J}mvV9Wg{6V%2n#YSRN{AP#PY?1FF1#|vO_%e+#`|2*~wGAJaeRX6=IzFNeWhz6gJc8+(03Ph4y6ELAm=AkN7TOgMUEw*N{= z_)EIDQx5q22oUR+_b*tazu9+pX|n1c*IB-}{DqIj z-?E|ks{o3AGRNb;+iKcHkZvYJvFsW&83RAPs1Oh@IWy%l#5x2oUP6ZCtv+b|q>jsf zZ_9XO;V!>n`UxH1LvH8)L4?8raIvasEhkpQoJ`%!5rBs!0Tu(s_D{`4opB;57)pkX z4$A^8CsD3U5*!|bHIEqsn~{q+Ddj$ME@Gq4JXtgVz&7l{Ok!@?EA{B3P~NAqb9)4? zkQo30A^EbHfQ@87G5&EQTd`frrwL)&Yw?%-W@uy^Gn23%j?Y!Iea2xw<-f;esq zf%w5WN@E1}zyXtYv}}`U^B>W`>XPmdLj%4{P298|SisrE;7HvXX;A}Ffi8B#3Lr;1 zHt6zVb`8{#+e$*k?w8|O{Uh|&AG}|DG1PFo1i?Y*cQm$ZwtGcVgMwtBUDa{~L1KT-{jET4w60>{KZ27vXrHJ;fW{6| z=|Y4!&UX020wU1>1iRgB@Q#m~1^Z^9CG1LqDhYBrnx%IEdIty z!46iOoKlKs)c}newDG)rWUikD%j`)p z_w9Ph&e40=(2eBy;T!}*1p1f1SAUDP9iWy^u^Ubdj21Kn{46;GR+hwLO=4D11@c~V zI8x&(D({K~Df2E)Nx_yQvYfh4;MbMJ@Z}=Dt3_>iim~QZ*hZIlEs0mEb z_54+&*?wMD`2#vsQRN3KvoT>hWofI_Vf(^C1ff-Ike@h@saEf7g}<9T`W;HAne-Nd z>RR+&SP35w)xKn8^U$7))PsM!jKwYZ*RzEcG-OlTrX3}9a{q%#Un5E5W{{hp>w~;` zGky+3(vJvQyGwBo`tCpmo0mo((?nM8vf9aXrrY1Ve}~TuVkB(zeds^jEfI}xGBCM2 zL1|#tycSaWCurP+0MiActG3LCas@_@tao@(R1ANlwB$4K53egNE_;!&(%@Qo$>h`^1S_!hN6 z)vZtG$8fN!|BXBJ=SI>e(LAU(y(i*PHvgQ2llulxS8>qsimv7yL}0q_E5WiAz7)(f zC(ahFvG8&HN9+6^jGyLHM~$)7auppeWh_^zKk&C_MQ~8;N??OlyH~azgz5fe^>~7F zl3HnPN3z-kN)I$4@`CLCMQx3sG~V8hPS^}XDXZrQA>}mQPw%7&!sd(Pp^P=tgp-s^ zjl}1-KRPNWXgV_K^HkP__SR`S-|OF0bR-N5>I%ODj&1JUeAQ3$9i;B~$S6}*^tK?= z**%aCiH7y?xdY?{LgVP}S0HOh%0%LI$wRx;$T|~Y8R)Vdwa}kGWv8?SJVm^>r6+%I z#lj1aR94{@MP;t-scEYQWc#xFA30^}?|BeX*W#9OL;Q9#WqaaM546j5j29((^_8Nu z4uq}ESLr~r*O7E7$D{!k9W>`!SLoyA53i9QwRB{!pHe8um|aDE`Cg0O*{jmor)^t)3`>V>SWN-2VJcFmj^1?~tT=JrP`fVh*t zXHarp=8HEcR#vFe+1a%XXuK+)oFs`GDD}#Z+TJ}Ri`FvKO@ek2ayn}yaOi%(8p%2$ zpEu)v0Jym@f}U|-;}CbR=9{#<^z28PzkkTNvyKvJDZe+^VS2bES3N@Jq!-*}{oQlz z@8bgC_KnDnT4}d#&Cpr!%Yb?E!brx0!eVOw~;lLwUoz#Np%d$o%9scc3&zPm`%G((Le|6o1 zM(VhOw)!f84zG^)tZ1?Egv)d8cdNi+T${=5kV+j;Wf%2{3g@FHp^Gf*qO0q!u$=m9 zCaY`4mRqJ;FTH5`a$affE5dJrk~k`HTP_7nGTY@B9o9vvnbytaID;^b=Tzp7Q#DmD zC(XEN)Ktn39z5|G!wsVNnHi) z%^q94!lL|hF`IijA^9NR0F$@h7k5R^ljOW(;Td9grRN0Mb)l_l7##{2nPQ@?;VjXv zaLZG}yuf$r$<79rVPpXg?6iiieX|r#&`p#Con2i%S8*8F}(E) zI5E6c3tG*<;m~6>!&H!GJ6zEuhH7mkAzovdhLy;)q z{H2*8I^Pb}xC4s^6Y}6bJvMu=8>g&I)7!N!5QG$xseeU#CC?ZM-TbjsHwHgDGrsD= z{%f;@Sod+Ch66Ko2WF~;Ty)v>&x^aovCbCbD7>qF*!?BXmOV3(s|nxsb*Lx_2lpB7 zokUnzrk;P=T-&kUHO}td+Zdj!3n&NR?K~cRU zAXU!DCp?51{J4w^`cV#ye}(`SQhGQkkMu}O3M*BWt4UsC^jCFUy;wTINYmhD$AT;4 z?Xd{HaJjP`raZ39qAm;%beDbrLpbRf(mkKbANan7XsL>_pE2oo^$TgdidjRP!5-`% zv0d!|iKN$c0(T|L0C~XD0aS8t{*&#LnhE;1Kb<9&=c2B+9JeLvJr*AyyRh%@jHej=AetOMSlz^=!kxX>>B{2B1uIrQyfd8KjJ+DBy!h)~*(!|&L4^Q_07SQ~E zcemVP`{9CwFvPFu7pyVGCLhH?LhEVb2{7U+Z_>o25#+3<|8%1T^5dh}*4(kfJGry} zm%r#hU+__Z;;*4fMrX=Bkc@7|v^*B;HAl0((IBPPii%X9+u3DDF6%bI&6?Eu$8&aWVqHIM7mK6?Uvq$1|(-T|)IV<>e?!(rY zqkmO1MRaLeTR=)io(0GVtQT@s6rN%C6;nS3@eu;P#ry4q;^O@1ZKCJyp_Jo)Ty^QW z+vweTx_DLm{P-XSBj~Sl<%_b^$=}odJ!S2wAcxenmzFGX1t&Qp8Vxz2VT`uQsQYtdn&_0xVivIcxZ_hnrRtwq4cZSj1c-SG9 z7vHBCA=fd0O1<4*=lu$6pn~_pVKyL@ztw1swbZi0B?spLo56ZKu5;7ZeUml1Ws1?u zqMf1p{5myAzeX$lAi{jIUqo1g4!zWLMm9cfWcnw`k6*BR^?$2(&yW?>w;G$EmTA@a z6?y#K$C~ZT8+v{87n5Dm&H6Pb_EQ@V0IWmG9cG=O;(;5aMWWrIPzz4Q`mhK;qQp~a z+BbQrEQ+w{SeiuG-~Po5f=^EvlouB@_|4xQXH@A~KgpFHrwu%dwuCR)=B&C(y6J4J zvoGk9;lLs9%iA-IJGU#RgnZZR+@{5lYl8(e1h6&>Vc_mvg0d@);X zji4T|n#lB!>pfL|8tQYkw?U2bD`W{na&;*|znjmalA&f;*U++_aBYerq;&C8Kw7mI z7tsG*?7*5j&dU)Lje;^{D_h`%(dK|pB*A*1(Jj)w^mZ9HB|vGLkF1GEFhu&rH=r=8 zMxO42e{Si6$m+Zj`_mXb&w5Q(i|Yxyg?juUrY}78uo@~3v84|8dfgbPd0iQJRdMj< zncCNGdMEcsxu#o#B5+XD{tsg*;j-eF8`mp~K8O1J!Z0+>0=7O=4M}E?)H)ENE;P*F z$Ox?ril_^p0g7xhDUf(q652l|562VFlC8^r8?lQv;TMvn+*8I}&+hIQYh2 z1}uQQaag&!-+DZ@|C+C$bN6W;S-Z@)d1|en+XGvjbOxCa-qAF*LA=6s(Jg+g;82f$ z(Vb)8I)AH@cdjGFAR5Rqd0wiNCu!xtqWbcTx&5kslzTb^7A78~Xzw1($UV6S^VWiP zFd{Rimd-0CZC_Bu(WxBFW7+k{cOW7DxBBkJdJ;VsJ4Z@lERQr%3eVv&$%)b%<~ zCl^Y4NgO}js@u{|o~KTgH}>!* z_iDNqX2(As7T0xivMH|3SC1ivm8Q}6Ffcd7owUKN5lHAtzMM4<0v+ykUT!QiowO;`@%JGv+K$bBx@*S7C8GJVqQ_K>12}M`f_Ys=S zKFh}HM9#6Izb$Y{wYzItTy+l5U2oL%boCJn?R3?jP@n$zSIwlmyGq30Cw4QBO|14` zW5c);AN*J3&eMFAk$SR~2k|&+&Bc$e>s%c{`?d~85S-UWjA>DS5+;UKZ}5oVa5O(N zqqc@>)nee)+4MUjH?FGv%hm2{IlIF-QX}ym-7ok4Z9{V+ZHVZQl$A*x!(q%<2~iVv znUa+BX35&lCb#9VE-~Y^W_f;Xhl%vgjwdjzMy$FsSIj&ok}L+X`4>J=9BkN&nu^E*gbhj3(+D>C4E z@Fwq_=N)^bKFSHTzZk?-gNU$@l}r}dwGyh_fNi=9b|n}J>&;G!lzilbWF4B}BBq4f zYIOl?b)PSh#XTPp4IS5ZR_2C!E)Z`zH0OW%4;&~z7UAyA-X|sh9@~>cQW^COA9hV4 zXcA6qUo9P{bW1_2`eo6%hgbN%(G-F1xTvq!sc?4wN6Q4`e9Hku zFwvlAcRY?6h^Fj$R8zCNEDq8`=uZB8D-xn)tA<^bFFy}4$vA}Xq0jAsv1&5!h!yRA zU()KLJya5MQ`q&LKdH#fwq&(bNFS{sKlEh_{N%{XCGO+po#(+WCLmKW6&5iOHny>g z3*VFN?mx!16V5{zyuMWDVP8U*|BGT$(%IO|)?EF|OI*sq&RovH!N%=>i_c?K*A>>k zyg1+~++zY4Q)J;VWN0axhoIKx;l&G$gvj(#go^pZskEVj8^}is3Jw26LzYYVos0HX zRPvmK$dVxM8(Tc?pHFe0Z3uq){{#OK3i-ra#@+;*=ui8)y6hsRv z4Fxx1c1+fr!VI{L3DFMwXKrfl#Q8hfP@ajgEau&QMCxd{g#!T^;ATXW)nUg&$-n25 zruy3V!!;{?OTobo|0GAxe`Acn3GV@W=&n;~&9 zQM>NWW~R@OYORkJAo+eq1!4vzmf9K%plR4(tB@TR&FSbDoRgJ8qVcH#;7lQub*nq&?Z>7WM=oeEVjkaG zT#f)=o!M2DO5hLR+op>t0CixJCIeXH*+z{-XS|%jx)y(j&}Wo|3!l7{o)HU3m7LYyhv*xF&tq z%IN7N;D4raue&&hm0xM=`qv`+TK@;_xAcGKuK(2|75~ar2Yw)geNLSmVxV@x89bQu zpViVKKnlkwjS&&c|-X6`~xdnh}Ps)Hs z4VbUL^{XNLf7_|Oi>tA%?SG5zax}esF*FH3d(JH^Gvr7Rp*n=t7frH!U;!y1gJB^i zY_M$KL_}mW&XKaDEi9K-wZR|q*L32&m+2n_8lq$xRznJ7p8}V>w+d@?uB!eS3#u<} zIaqi!b!w}a2;_BfUUhGMy#4dPx>)_>yZ`ai?Rk`}d0>~ce-PfY-b?Csd(28yX22L% zI7XI>OjIHYTk_@Xk;Gu^F52^Gn6E1&+?4MxDS2G_#PQ&yXPXP^<-p|2nLTb@AAQEY zI*UQ9Pmm{Kat}wuazpjSyXCdnrD&|C1c5DIb1TnzF}f4KIV6D)CJ!?&l&{T)e4U%3HTSYqsQ zo@zWB1o}ceQSV)<4G<)jM|@@YpL+XHuWsr5AYh^Q{K=wSV99D~4RRU52FufmMBMmd z_H}L#qe(}|I9ZyPRD6kT>Ivj&2Y?qVZq<4bG_co_DP`sE*_Xw8D;+7QR$Uq(rr+u> z8bHUWbV19i#)@@G4bCco@Xb<8u~wVDz9S`#k@ciJtlu@uP1U0X?yov8v9U3VOig2t zL9?n$P3=1U_Emi$#slR>N5wH-=J&T=EdUHA}_Z zZIl3nvMP*AZS9{cDqFanrA~S5BqxtNm9tlu;^`)3X&V4tMAkJ4gEIPl= zoV!Gyx0N{3DpD@)pv^iS*dl2FwANu;1;%EDl}JQ7MbxLMAp>)UwNwe{=V}O-5C*>F zu?Ny+F64jZn<+fKjF01}8h5H_3pey|;%bI;SFg$w8;IC<8l|3#Lz2;mNNik6sVTG3 z+Su^rIE#40C4a-587$U~%KedEEw1%r6wdvoMwpmlXH$xPnNQN#f%Z7|p)nC>WsuO= z4zyqapLS<8(UJ~Qi9d|dQijb_xhA2)v>la)<1md5s^R1N&PiuA$^k|A<+2C?OiHbj z>Bn$~t)>Y(Zb`8hW7q9xQ=s>Rv81V+UiuZJc<23HplI88isqRCId89fb`Kt|CxVIg znWcwprwXnotO>3s&Oypkte^9yJjlUVVxSe%_xlzmje|mYOVPH^vjA=?6xd0vaj0Oz zwJ4OJNiFdnHJX3rw&inskjryukl`*fRQ#SMod5J|KroJRsVXa5_$q7whSQ{gOi*s0 z1LeCy|JBWRsDPn7jCb4s(p|JZiZ8+*ExC@Vj)MF|*Vp{B(ziccSn`G1Br9bV(v!C2 z6#?eqpJBc9o@lJ#^p-`-=`4i&wFe>2)nlPK1p9yPFzJCzBQbpkcR>={YtamIw)3nt z(QEF;+)4`>8^_LU)_Q3 zC5_7lgi_6y>U%m)m@}Ku4C}=l^J=<<7c;99ec3p{aR+v=diuJR7uZi%aQv$oP?dn?@6Yu_+*^>T0ptf(oobdL;6)N-I!TO`zg^Xbv3#L0I~sn@WGk-^SmPh5>W+LB<+1PU}AKa?FCWF|qMNELOgdxR{ zbqE7@jVe+FklzdcD$!(A$&}}H*HQFTJ+AOrJYnhh}Yvta(B zQ_bW4Rr;R~&6PAKwgLWXS{Bnln(vUI+~g#kl{r+_zbngT`Y3`^Qf=!PxN4IYX#iW4 zucW7@LLJA9Zh3(rj~&SyN_pjO8H&)|(v%!BnMWySBJV=eSkB3YSTCyIeJ{i;(oc%_hk{$_l;v>nWSB)oVeg+blh=HB5JSlG_r7@P z3q;aFoZjD_qS@zygYqCn=;Zxjo!?NK!%J$ z52lOP`8G3feEj+HTp@Tnn9X~nG=;tS+z}u{mQX_J0kxtr)O30YD%oo)L@wy`jpQYM z@M>Me=95k1p*FW~rHiV1CIfVc{K8r|#Kt(ApkXKsDG$_>76UGNhHExFCw#Ky9*B-z zNq2ga*xax!HMf_|Vp-86r{;~YgQKqu7%szk8$hpvi_2I`OVbG1doP(`gn}=W<8%Gn z%81#&WjkH4GV;4u43EtSW>K_Ta3Zj!XF?;SO3V#q=<=>Tc^@?A`i;&`-cYj|;^ zEo#Jl5zSr~_V-4}y8pnufXLa80vZY4z2ko7fj>DR)#z=wWuS1$$W!L?(y}YC+yQ|G z@L&`2upy3f>~*IquAjkVNU>}c10(fq#HdbK$~Q3l6|=@-eBbo>B9(6xV`*)sae58*f zym~RRVx;xoCG3`JV`xo z!lFw)=t2Hy)e!IFs?0~7osWk(d%^wxq&>_XD4+U#y&-VF%4z?XH^i4w`TxpF{`XhZ z%G}iEzf!T(l>g;W9<~K+)$g!{UvhW{E0Lis(S^%I8OF&%kr!gJ&fMOpM=&=Aj@wuL zBX?*6i51Qb$uhkwkFYkaD_UDE+)rh1c;(&Y=B$3)J&iJfQSx!1NGgPtK!$c9OtJuu zX(pV$bfuJpRR|K(dp@^j}i&HeJOh@|7lWo8^$*o~Xqo z5Sb+!EtJ&e@6F+h&+_1ETbg7LfP5GZjvIUIN3ibCOldAv z)>YdO|NH$x7AC8dr=<2ekiY1%fN*r~e5h6Yaw<{XIErujKV~tiyrvV_DV0AzEknC- zR^xKM3i<1UkvqBj3C{wDvytOd+YtDSGu!gEMg+!&|8BQrT*|p)(dwQLEy+ zMtMzij3zo40)CA!BKZF~yWg?#lWhqD3@qR)gh~D{uZaJO;{OWV8XZ_)J@r3=)T|kt zUS1pXr6-`!Z}w2QR7nP%d?ecf90;K_7C3d!UZ`N(TZoWNN^Q~RjVhQG{Y<%E1PpV^4 z-m-K+$A~-+VDABs^Q@U*)YvhY4Znn2^w>732H?NRK(5QSS$V@D7yz2BVX4)f5A04~$WbxGOam22>t&uD)JB8-~yiQW6ik;FGblY_I>SvB_z2?PS z*Qm&qbKI{H1V@YGWzpx`!v)WeLT02};JJo*#f$a*FH?IIad-^(;9XC#YTWN6;Z6+S zm4O1KH=#V@FJw7Pha0!9Vb%ZIM$)a`VRMoiN&C|$YA3~ZC*8ayZRY^fyuP6$n%2IU z$#XceYZeqLTXw(m$_z|33I$B4k~NZO>pP6)H_}R{E$i%USGy{l{-jOE;%CloYPEU+ zRFxOn4;7lIOh!7abb23YKD+_-?O z0FP9otcAh+oSj;=f#$&*ExUHpd&e#bSF%#8*&ItcL2H$Sa)?pt0Xtf+t)z$_u^wZi z44oE}r4kIZGy3!Mc8q$B&6JqtnHZ>Znn!Zh@6rgIu|yU+zG8q`q9%B18|T|oN3zMq z`l&D;U!OL~%>vo&q0>Y==~zLiCZk4v%s_7!9DxQ~id1LLE93gf*gg&2$|hB#j8;?3 z5v4S;oM6rT{Y;I+#FdmNw z){d%tNM<<#GN%n9ox7B=3#;u7unZ~tLB_vRZ52a&2=IM)2VkXm=L+Iqq~uk#Dug|x z>S84e+A7EiOY5lj*!q?6HDkNh~0g;0Jy(al!ZHHDtur9T$y-~)94HelX1NHjXWIM7UAe}$?jiz z9?P4`I0JM=G5K{3_%2jPLC^_Mlw?-kYYgb7`qGa3@dn|^1fRMwiyM@Ch z;CB&o7&&?c5e>h`IM;Wnha0QKnEp=$hA8TJgR-07N~U5(>9vJzeoFsSRBkDq=x(YgEMpb=l4TDD`2 zwVJpWGTA_u7}?ecW7s6%rUs&NXD3+n;jB86`X?8(l3MBo6)PdakI6V6a}22{)8ilT zM~T*mU}__xSy|6XSrJ^%lDAR3Lft%+yxC|ZUvSO_nqMX!_ul3;R#*{~4DA=h$bP)%8Yv9X zyp><|e8=_ttI}ZAwOd#dlnSjck#6%273{E$kJuCGu=I@O)&6ID{nWF5@gLb16sj|&Sb~+du4e4O_%_o`Ix4NRrAsyr1_}MuP94s>de8cH-OUkVPk3+K z&jW)It9QiU-ti~AuJkL`XMca8Oh4$SyJ=`-5WU<{cIh+XVH#e4d&zive_UHC!pN>W z3TB;Mn5i)9Qn)#6@lo4QpI3jFYc0~+jS)4AFz8fVC;lD^+idw^S~Qhq>Tg(!3$yLD zzktzoFrU@6s4wwCMz}edpF5i5Q1IMmEJQHzp(LAt)pgN3&O!&d?3W@6U4)I^2V{;- z6A(?zd93hS*uQmnh4T)nHnE{wVhh(=MMD(h(P4+^p83Om6t<*cUW>l(qJzr%5vp@K zN27ka(L{JX=1~e2^)F^i=TYj&;<7jyUUR2Bek^A8+3Up*&Xwc{)1nRR5CT8vG>ExV zHnF3UqXJOAno_?bnhCX-&kwI~Ti8t4`n0%Up>!U`ZvK^w2+0Cs-b9%w%4`$+To|k= zKtgc&l}P`*8IS>8DOe?EB84^kx4BQp3<7P{Pq}&p%xF_81pg!l2|u=&I{AuUgmF5n zJQCTLv}%}xbFGYtKfbba{CBo)lWW%Z>i(_NvLhoQZ*5-@2l&x>e+I~0Nld3UI9tdL zRzu8}i;X!h8LHVvN?C+|M81e>Jr38%&*9LYQec9Ax>?NN+9(_>XSRv&6hlCYB`>Qm z1&ygi{Y()OU4@D_jd_-7vDILR{>o|7-k)Sjdxkjgvi{@S>6GqiF|o`*Otr;P)kLHN zZkpts;0zw_6;?f(@4S1FN=m!4^mv~W+lJA`&7RH%2$)49z0A+8@0BCHtj|yH--AEL z0tW6G%X-+J+5a{5*WKaM0QDznf;V?L5&uQw+yegDNDP`hA;0XPYc6e0;Xv6|i|^F2WB)Z$LR|HR4 zTQsRAby9(^Z@yATyOgcfQw7cKyr^3Tz7lc7+JEwwzA7)|2x+PtEb>nD(tpxJQm)Kn zW9K_*r!L%~N*vS8<5T=iv|o!zTe9k_2jC_j*7ik^M_ zaf%k{WX{-;0*`t`G!&`eW;gChVXnJ-Rn)To8vW-?>>a%QU1v`ZC=U)f8iA@%JG0mZ zDqH;~mgBnrCP~1II<=V9;EBL)J+xzCoiRBaeH&J6rL!{4zIY8tZka?_FBeQeNO3q6 zyG_alW54Ba&wQf{&F1v-r1R6ID)PTsqjIBc+5MHkcW5Fnvi~{-FjKe)t1bl}Y;z@< z=!%zvpRua>>t_x}^}z0<7MI!H2v6|XAyR9!t50q-A)xk0nflgF4*OQlCGK==4S|wc zRMsSscNhRzHMBU8TdcHN!q^I}x0iXJ%uehac|Zs_B$p@CnF)HeXPpB_Za}F{<@6-4 zl%kml@}kHQ(ypD8FsPJ2=14xXJE|b20RUIgs!2|R3>LUMGF6X*B_I|$`Qg=;zm7C z{mEDy9dTmPbued7mlO@phdmAmJ7p@GR1bjCkMw6*G7#4+`k>fk1czdJUB!e@Q(~6# zwo%@p@V5RL0ABU2LH7Asq^quDUho@H>eTZH9f*no9fY0T zD_-9px3e}A!>>kv5wk91%C9R1J_Nh!*&Kk$J3KNxC}c_@zlgpJZ+5L)Nw|^p=2ue}CJtm;uj*Iqr)K})kA$xtNUEvX;4!Px*^&9T_`IN{D z{6~QY=Nau6EzpvufB^hflc#XIsSq0Y9(nf$d~6ZwK}fal92)fr%T3=q{0mP-EyP_G z)UR5h@IX}3Qll2b0oCAcBF>b*@Etu*aTLPU<%C>KoOrk=x?pN!#f_Og-w+;xbFgjQ zXp`et%lDBBh~OcFnMKMUoox0YwBNy`N0q~bSPh@+enQ=4RUw1) zpovN`QoV>vZ#5LvC;cl|6jPr}O5tu!Ipoyib8iXqy}TeJ;4+_7r<1kV0v5?Kv>fYp zg>9L`;XwXa&W7-jf|9~uP2iyF5`5AJ`Q~p4eBU$MCC00`rcSF>`&0fbd^_eqR+}mK z4n*PMMa&FOcc)vTUR zlDUAn-mh`ahi_`f`=39JYTNVjsTa_Y3b1GOIi)6dY)D}xeshB0T8Eov5%UhWd1)u}kjEQ|LDo{tqKKrYIfVz~@dp!! zMOnah@vp)%_-jDTUG09l+;{CkDCH|Q{NqX*uHa1YxFShy*1+;J`gywKaz|2Q{lG8x zP?KBur`}r`!WLKXY_K;C8$EWG>jY3UIh{+BLv0=2)KH%P}6xE2kg)%(-uA6lC?u8}{K(#P*c zE9C8t*u%j2r_{;Rpe1A{9nNXU;b_N0vNgyK!EZVut~}+R2rcbsHilqsOviYh-pYX= zHw@53nlmwYI5W5KP>&`dBZe0Jn?nAdC^HY1wlR6$u^PbpB#AS&5L6zqrXN&7*N2Q` z+Rae1EwS)H=aVSIkr8Ek^1jy2iS2o7mqm~Mr&g5=jjt7VxwglQ^`h#Mx+x2v|9ZAwE$i_9918MjJxTMr?n!bZ6n$}y11u8I9COTU`Z$Fi z!AeAQLMw^gp_{+0QTEJrhL424pVDp%wpku~XRlD3iv{vQ!lAf!_jyqd_h}+Tr1XG| z`*FT*NbPqvHCUsYAkFnM`@l4u_QH&bszpUK#M~XLJt{%?00GXY?u_{gj3Hvs!=N(I z(=AuWPijyoU!r?aFTsa8pLB&cx}$*%;K$e*XqF{~*rA-qn)h^!(-;e}O#B$|S~c+U zN4vyOK0vmtx$5K!?g*+J@G1NmlEI=pyZXZ69tAv=@`t%ag_Hk{LP~OH9iE)I= zaJ69b4kuCkV0V zo(M0#>phpQ_)@j;h%m{-a*LGi(72TP)ws2w*@4|C-3+;=5DmC4s7Lp95%n%@Ko zfdr3-a7m*dys9iIci$A=4NPJ`HfJ;hujLgU)ZRuJI`n;Pw|yksu!#LQnJ#dJysgNb z@@qwR^wrk(jbq4H?d!lNyy72~Dnn87KxsgQ!)|*m(DRM+eC$wh7KnS-mho3|KE)7h zK3k;qZ;K1Lj6uEXLYUYi)1FN}F@-xJ z@@3Hb84sl|j{4$3J}aTY@cbX@pzB_qM~APljrjju6P0tY{C@ zpUCOz_NFmALMv1*blCcwUD3?U6tYs+N%cmJ98D%3)%)Xu^uvzF zS5O!sc#X6?EwsYkvPo6A%O8&y8sCCQH<%f2togVwW&{M;PR!a(ZT_A+jVAbf{@5kL zB@Z(hb$3U{T_}SKA_CoQVU-;j>2J=L#lZ~aQCFg-d<9rzs$_gO&d5N6eFSc z1ml8)P*FSi+k@!^M9nDWR5e@ATD8oxtDu=36Iv2!;dZzidIS(PCtEuXAtlBb1;H%Z zwnC^Ek*D)EX4#Q>R$$WA2sxC_t(!!6Tr?C#@{3}n{<^o;9id1RA&-Pig1e-2B1XpG zliNjgmd3c&%A}s>qf{_j#!Z`fu0xIwm4L0)OF=u(OEmp;bLCIaZX$&J_^Z%4Sq4GZ zPn6sV_#+6pJmDN_lx@1;Zw6Md_p0w9h6mHtzpuIEwNn>OnuRSC2=>fP^Hqgc)xu^4 z<3!s`cORHJh#?!nKI`Et7{3C27+EuH)Gw1f)aoP|B3y?fuVfvpYYmmukx0ya-)TQX zR{ggy5cNf4X|g)nl#jC9p>7|09_S7>1D2GTRBUTW zAkQ=JMRogZqG#v;^=11O6@rPPwvJkr{bW-Qg8`q8GoD#K`&Y+S#%&B>SGRL>;ZunM@49!}Uy zN|bBCJ%sO;@3wl0>0gbl3L@1^O60ONObz8ZI7nder>(udj-jt`;yj^nTQ$L9`OU9W zX4alF#$|GiR47%x@s&LV>2Sz2R6?;2R~5k6V>)nz!o_*1Y!$p>BC5&?hJg_MiE6UBy>RkVZj`9UWbRkN-Hk!S`=BS3t3uyX6)7SF#)71*}`~Ogz z1rap5H6~dhBJ83;q-Y<5V35C2&F^JI-it(=5D#v!fAi9p#UwV~2tZQI+W(Dv?1t9? zfh*xpxxO{-(VGB>!Q&0%^YW_F!@aZS#ucP|YaD#>wd1Fv&Z*SR&mc;asi}1G) z_H>`!akh-Zxq9#io(7%;a$)w+{QH)Y$?UK1Dt^4)up!Szcxnu}kn$0afcfJL#IL+S z5gF_Y30j;{lNrG6m~$Ay?)*V9fZuU@3=kd40=LhazjFrau>(Y>SJNtOz>8x_X-BlA zIpl{i>OarVGj1v(4?^1`R}aQB&WCRQzS~;7R{tDZG=HhgrW@B`W|#cdyj%YBky)P= zpxuOZkW>S6%q7U{VsB#G(^FMsH5QuGXhb(sY+!-R8Bmv6Sx3WzSW<1MPPN1!&PurYky(@`bP9tz z52}LH9Q?+FF5jR6-;|+GVdRA!qtd;}*-h&iIw3Tq3qF9sDIb1FFxGbo&fbG5n8$3F zyY&PWL{ys^dTO}oZ#@sIX^BKW*bon=;te9j5k+T%wJ zNJtoN1~YVj4~YRrlZl)b&kJqp+Z`DqT!la$x&&IxgOQw#yZd-nBP3!7FijBXD|IsU8Zl^ zc6?MKpJQ+7ka|tZQLfchD$PD|;K(9FiLE|eUZX#EZxhG!S-63C$jWX1Yd!6-Yxi-u zjULIr|0-Q%D9jz}IF~S%>0(jOqZ(Ln<$9PxiySr&2Oic7vb<8q=46)Ln%Z|<*z5&> z3f~Zw@m;vR(bESB<=Jqkxn(=#hQw42l(7)h`vMQQTttz9XW6^|^8EK7qhju4r_c*b zJIi`)MB$w@9epwdIfnEBR+?~);yd6C(LeMC& zn&&N*?-g&BBJcV;8&UoZi4Lmxcj16ojlxR~zMrf=O_^i1wGb9X-0@6_rpjPYemIin zmJb+;lHe;Yp=8G)Q(L1bzH*}I>}uAqhj4;g)PlvD9_e_ScR{Ipq|$8NvAvLD8MYr}xl=bU~)f%B3E>r3Bu9_t|ThF3C5~BdOve zEbk^r&r#PT&?^V1cb{72yEWH}TXEE}w>t!cY~rA+hNOTK8FAtIEoszp!qqptS&;r$ zaYV-NX96-h$6aR@1xz6_E0^N49mU)-v#bwtGJm)ibygzJ8!7|WIrcb`$XH~^!a#s& z{Db-0IOTFq#9!^j!n_F}#Z_nX{YzBK8XLPVmc&X`fT7!@$U-@2KM9soGbmOSAmqV z{nr$L^MBo_u^Joyf0E^=eo{Rt0{{e$IFA(#*kP@SQd6lWT2-#>` zP1)7_@IO!9lk>Zt?#CU?cuhiLF&)+XEM9B)cS(gvQT!X3`wL*{fArTS;Ak`J<84du zALKPz4}3nlG8Fo^MH0L|oK2-4xIY!~Oux~1sw!+It)&D3p;+N8AgqKI`ld6v71wy8I!eP0o~=RVcFQR2Gr(eP_JbSytoQ$Yt}l*4r@A8Me94y z8cTDWhqlq^qoAhbOzGBXv^Wa4vUz$(7B!mX`T=x_ueKRRDfg&Uc-e1+z4x$jyW_Pm zp?U;-R#xt^Z8Ev~`m`iL4*c#65Nn)q#=Y0l1AuD&+{|8-Gsij3LUZXpM0Bx0u7WWm zH|%yE@-#XEph2}-$-thl+S;__ciBxSSzHveP%~v}5I%u!z_l_KoW{KRx2=eB33umE zIYFtu^5=wGU`Jab8#}cnYry@9p5UE#U|VVvx_4l49JQ;jQdp(uw=$^A$EA$LM%vmE zvdEOaIcp5qX8wX{mYf0;#51~imYYPn4=k&#DsKTxo{_Mg*;S495?OBY?#gv=edYC* z^O@-sd-qa+U24xvcbL0@C7_6o!$`)sVr-jSJE4XQUQ$?L7}2(}Eixqv;L8AdJAVqc zq}RPgpnDb@E_;?6K58r3h4-!4rT4Ab#rLHLX?eMOfluJk=3i1@Gt1i#iA=O`M0@x! z(HtJP9BMHXEzuD93m|B&woj0g6T?f#^)>J>|I4C5?Gam>n9!8CT%~aT;=oco5d6U8 zMXl(=W;$ND_8+DD*?|5bJ!;8ebESXMUKBAf7YBwNVJibGaJ*(2G`F%wx)grqVPjudiaq^Kl&g$8A2 zWMxMr@_$c}d+;_B`#kUX-t|4VKH&_f^^EP0&=DPLW)H)UzBG%%Tra*5 z%$kyZe3I&S#gfie^z5)!twG={3Cuh)FdeA!Kj<-9** zvT*5%Tb`|QbE!iW-XcOuy39>D3oe6x{>&<#E$o8Ac|j)wq#kQzz|ATd=Z0K!p2$QE zPu?jL8Lb^y3_CQE{*}sTDe!2!dtlFjq&YLY@2#4>XS`}v#PLrpvc4*@q^O{mmnr5D zmyJq~t?8>FWU5vZdE(%4cuZuao0GNjp3~Dt*SLaxI#g_u>hu@k&9Ho*#CZP~lFJHj z(e!SYlLigyc?&5-YxlE{uuk$9b&l6d`uIlpg_z15dPo*iU&|Khx2*A5Fp;8iK_bdP z?T6|^7@lcx2j0T@x>X7|kuuBSB7<^zeY~R~4McconTxA2flHC0_jFxmSTv-~?zVT| zG_|yDqa9lkF*B6_{j=T>=M8r<0s;@z#h)3BQ4NLl@`Xr__o7;~M&dL3J8fP&zLfDfy z);ckcTev{@OUlZ`bCo(-3? z1u1xD`PKgSg?RqeVVsF<1SLF;XYA@Bsa&cY!I48ZJn1V<3d!?s=St?TLo zC0cNr`qD*M#s6f~X>SCNVkva^9A2ZP>CoJ9bvgXe_c}WdX-)pHM5m7O zrHt#g$F0AO+nGA;7dSJ?)|Mo~cf{z2L)Rz!`fpi73Zv)H=a5K)*$5sf_IZypi($P5 zsPwUc4~P-J1@^3C6-r9{V-u0Z&Sl7vNfmuMY4yy*cL>_)BmQF!8Om9Dej%cHxbIzA zhtV0d{=%cr?;bpBPjt@4w=#<>k5ee=TiWAXM2~tUGfm z$s&!Dm0R^V$}fOR*B^kGaipi~rx~A2cS0;t&khV1a4u38*XRUP~f za!rZMtay8bsLt6yFYl@>-y^31(*P!L^^s@mslZy(SMsv9bVoX`O#yBgEcjCmGpyc* zeH$Dw6vB5P*;jor+JOX@;6K#+xc)Z9B8M=x2a@Wx-{snPGpRmOC$zpsqW*JCh@M2Y z#K+M(>=#d^>Of9C`))h<=Bsy)6zaMJ&x-t%&+UcpLjV`jo4R2025 zXaG8EA!0lQa)|dx-@{O)qP6`$rhCkoQqZ`^SW8g-kOwrwsK8 z3ms*AIcyj}-1x&A&vSq{r=QMyp3CHdWH35!sad#!Sm>^|-|afB+Q;|Iq@LFgqIp#Z zD1%H+3I?6RGnk&IFo|u+E0dCxXz4yI^1i!QTu7uvIEH>i3rR{srcST`LIRwdV1P;W z+%AN1NIf@xxvVLiSX`8ILA8MzNqE&7>%jMzGt9wm78bo9<;h*W84i29^w!>V>{N+S zd`5Zmz^G;f=icvoOZfK5#1ctx*~UwD=ab4DGQXehQ!XYnak*dee%YN$_ZPL%KZuz$ zD;$PpT;HM^$KwtQm@7uvT`i6>Hae1CoRVM2)NL<2-k2PiX=eAx+-6j#JI?M}(tuBW zkF%jjLR)O`gI2fcPBxF^HeI|DWwQWHVR!;;{BXXHskxh8F@BMDn`oEi-NHt;CLymW z=KSv5)3dyzec0T5B*`g-MQ<;gz=nIWKUi9ko<|4I(-E0k$QncH>E4l z**1w&#={&zv4Tvhgz#c29`m|;lU-jmaXFMC11 z*dlXDMEOG>VoLMc>!rApwOu2prKSi*!w%`yzGmS+k(zm*CsLK*wv{S_0WX^8A-rKy zbk^Gf_92^7iB_uUF)EE+ET4d|X|>d&mdN?x@vxKAQk`O+r4Qdu>XGy(a(19g;=jU} zFX{O*_NG>!$@jh!U369Lnc+D~qch3uT+_Amyi}*k#LAAwh}k8IPK5a-WZ81ufD>l> z$4cF}GSz>ce`3FAic}6W4Z7m9KGO?(eWqi@L|5Hq0@L|&2flN1PVl}XgQ2q*_n2s3 zt5KtowNkTYB5b;SVuoXA@i5irXO)A&%7?V`1@HGCB&)Wgk+l|^XXChq;u(nyPB}b3 zY>m5jkxpZgi)zfbgv&ec4Zqdvm+D<?Im*mXweS9H+V>)zF#Zp3)bhl$PbISY{5=_z!8&*Jv~NYtI-g!>fDs zmvL5O^U%!^VaKA9gvKw|5?-jk>~%CVGvctKmP$kpnpfN{D8@X*Aazi$txfa%vd-|E z>kYmV66W!lNekJPom29LdZ%(I+ZLZYTXzTg*to~m?7vp%{V<~>H+2}PQ?PPAq`36R z<%wR8v6UkS>Wt#hzGk#44W<%9S=nBfB);6clKwnxY}T*w21Qc3_?IJ@4gYzC7s;WP zVQNI(M=S=JT#xsZy7G`cR(BP9*je0bfeN8JN5~zY(DDs0t{LpHOIbN);?T-69Pf3R zSNe*&p2%AwXHL>__g+xd4Hlc_vu<25H?(`nafS%)3UPP7_4;gk-9ckt8SJRTv5v0M z_Hww`qPudL?ajIR&X*;$y-`<)6dxx1U~5eGS13CB!lX;3w7n&lDDiArbAhSycd}+b zya_3p@A`$kQy;|NJZ~s44Hqo7Hwt}X86NK=(ey>lgWTtGL6k@Gy;PbO!M%1~Wcn2k zUFP|*5d>t-X*RU8g%>|(wwj*~#l4z^Aatf^DWd1Wj#Q*AY0D^V@sC`M zjJc6qXu0I7Y*2;;gGu!plAFzG=J;1%eIOdn zQA>J&e05UN*7I5@yRhK|lbBSfJ+5Uq;!&HV@xfPZrgD}kE*1DSq^=%{o%|LChhl#0 zlMb<^a6ixzpd{kNZr|3jTGeEzuo}-eLT-)Q$#b{!vKx8Tg}swCni>{#%vDY$Ww$84 zew3c9BBovqb}_&BRo#^!G(1Eg((BScRZ}C)Oz?y`T5wOrv);)b^4XR8 zhJo7+<^7)qB>I;46!GySzdneZ>n_E1oWZY;kf94#)s)kWjuJN1c+wbVoNQcmnv}{> zN0pF+Sl3E}UQ$}slSZeLJrwT>Sr}#V(dVaezCQl2|4LN`7L7v&siYR|r7M(*JYfR$ zst3=YaDw$FSc{g}KHO&QiKxuhEzF{f%RJLKe3p*7=oo`WNP)M(9X1zIQPP0XHhY3c znrP{$4#Ol$A0s|4S7Gx2L23dv*Gv2o;h((XVn+9+$qvm}s%zi6nI-_s6?mG! zj{DV;qesJb&owKeEK?=J>UcAlYckA7Sl+I&IN=yasrZOkejir*kE@SN`fk<8Fgx*$ zy&fE6?}G)d_N`){P~U@1jRVA|2*69)KSe_}!~?+`Yb{Y=O~_+@!j<&oVQQMnhoIRU zA0CyF1OFfkK44n*JD~!2!SCPM;PRSk%1XL=0&rz00wxPs&-_eapJy#$h!eqY%nS0{ z!aGg58JIJPF3_ci%n)QSVpa2H`vIe$RD43;#IRfDV&Ibit z+?>HW4{2wOfC6Fw)}4x}i1maDxcE1qi@BS*qcxD2gE@h3#4cgU*D-&3z7D|tVZWt= z-Cy2+*Cm@P4GN_TPUtaVyVesbVDazF@)j8VJ4>XZv!f%}&eO1SvIgr}4`A*3#vat< z_MoByL(qW6L7SFZ#|Gc1fFN)L2PxY+{B8tJp+pxRyz*87)vXR}*=&ahXjBlQKguuf zX6x<<6fQulE^C*KH8~W%ptpaC0l?b=_{~*U4?5Vt;dgM4t_{&UZ1C2j?b>b+5}{IF_CUyvz-@QZPMlJ)r_tS$9kH%RPv#2_nMb zRLj5;chJ72*U`Z@Dqt4$@_+k$%|8m(HqLG!qT4P^DdfvGf&){gKnGCX#H0!;W=AGP zbA&Z`-__a)VTS}kKFjWGk z%|>yE?t*EJ!qeQ%dPk$;xIQ+P0;()PCBDgjJm6Buj{f^awNoVx+9<|lg3%-$G(*f) zll6oOkN|yamn1uyl2*N-lnqRI1cvs_JxLTeahEK=THV$Sz*gQhKNb*p0fNoda#-&F zB-qJgW^g}!TtM|0bS2QZekW7_tKu%GcJ!4?lObt0z_$mZ4rbQ0o=^curCs3bJK6sq z9fu-aW-l#>z~ca(B;4yv;2RZ?tGYAU)^)Kz{L|4oPj zdOf_?de|#yS)p2v8-N||+XL=O*%3+y)oI(HbM)Ds?q8~HPzIP(vs*G`iddbWq}! z(2!VjP&{Z1w+%eUq^ '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..53a6b23 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,91 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..8bebd46 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'hispath' diff --git a/src/main/java/com/server/hispath/HispathApplication.java b/src/main/java/com/server/hispath/HispathApplication.java new file mode 100644 index 0000000..e2d77f7 --- /dev/null +++ b/src/main/java/com/server/hispath/HispathApplication.java @@ -0,0 +1,13 @@ +package com.server.hispath; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class HispathApplication { + + public static void main(String[] args) { + SpringApplication.run(HispathApplication.class, args); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/src/test/java/com/server/hispath/HispathApplicationTests.java b/src/test/java/com/server/hispath/HispathApplicationTests.java new file mode 100644 index 0000000..bf384e0 --- /dev/null +++ b/src/test/java/com/server/hispath/HispathApplicationTests.java @@ -0,0 +1,13 @@ +package com.server.hispath; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class HispathApplicationTests { + + @Test + void contextLoads() { + } + +} From bc2e41035749c92f5abe902767a8f031b16713d1 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 20 Sep 2022 18:21:46 +0900 Subject: [PATCH 002/148] =?UTF-8?q?feat[#1]=20:=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ERD대로 도메인을 구현하였다. - 중간중간 더 추가해야할 부분이 있지만, 이는 팀원들과 상의하고 구현할 것이다. --- .../hispath/activity/domain/Activity.java | 40 ++++++++++++++ .../hispath/activity/domain/ActivityType.java | 5 ++ .../hispath/category/domain/Category.java | 34 ++++++++++++ .../com/server/hispath/common/BaseEntity.java | 34 ++++++++++++ .../server/hispath/major/domain/Major.java | 27 ++++++++++ .../major/presentation/MajorController.java | 4 ++ .../hispath/manager/domain/Manager.java | 34 ++++++++++++ .../server/hispath/notice/domain/Notice.java | 34 ++++++++++++ .../scholarship/domain/Scholarship.java | 24 +++++++++ .../hispath/student/domain/Student.java | 54 +++++++++++++++++++ .../domain/participate/Participant.java | 30 +++++++++++ src/main/resources/application.properties | 1 - 12 files changed, 320 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/server/hispath/activity/domain/Activity.java create mode 100644 src/main/java/com/server/hispath/activity/domain/ActivityType.java create mode 100644 src/main/java/com/server/hispath/category/domain/Category.java create mode 100644 src/main/java/com/server/hispath/common/BaseEntity.java create mode 100644 src/main/java/com/server/hispath/major/domain/Major.java create mode 100644 src/main/java/com/server/hispath/major/presentation/MajorController.java create mode 100644 src/main/java/com/server/hispath/manager/domain/Manager.java create mode 100644 src/main/java/com/server/hispath/notice/domain/Notice.java create mode 100644 src/main/java/com/server/hispath/scholarship/domain/Scholarship.java create mode 100644 src/main/java/com/server/hispath/student/domain/Student.java create mode 100644 src/main/java/com/server/hispath/student/domain/participate/Participant.java delete mode 100644 src/main/resources/application.properties diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java new file mode 100644 index 0000000..4ee2322 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -0,0 +1,40 @@ +package com.server.hispath.activity.domain; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import com.server.hispath.category.domain.Category; +import com.server.hispath.common.BaseEntity; +import com.server.hispath.student.domain.participate.Participant; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Entity +@Getter +@NoArgsConstructor +@Where(clause = "deleted = false") +@SQLDelete(sql = "UPDATE activity SET deleted = true Where id = ?") +public class Activity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + private Category category; + + private String semester; + + private boolean personel; + + private int requestStatus; + + private String date; + + @OneToMany(mappedBy = "activity") + private List participants = new ArrayList<>(); +} diff --git a/src/main/java/com/server/hispath/activity/domain/ActivityType.java b/src/main/java/com/server/hispath/activity/domain/ActivityType.java new file mode 100644 index 0000000..1861c09 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/domain/ActivityType.java @@ -0,0 +1,5 @@ +package com.server.hispath.activity.domain; + +public enum ActivityType { + MILEAGE_ACTIVITY, PROJECT +} diff --git a/src/main/java/com/server/hispath/category/domain/Category.java b/src/main/java/com/server/hispath/category/domain/Category.java new file mode 100644 index 0000000..15e0130 --- /dev/null +++ b/src/main/java/com/server/hispath/category/domain/Category.java @@ -0,0 +1,34 @@ +package com.server.hispath.category.domain; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.activity.domain.ActivityType; +import com.server.hispath.common.BaseEntity; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Entity +@Getter +@NoArgsConstructor +@Where(clause = "deleted = false") +@SQLDelete(sql = "UPDATE category SET deleted = true Where id = ?") +public class Category extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + @OneToMany(mappedBy = "category") + private List activities = new ArrayList<>(); + + @Enumerated(EnumType.STRING) + private ActivityType type; +} diff --git a/src/main/java/com/server/hispath/common/BaseEntity.java b/src/main/java/com/server/hispath/common/BaseEntity.java new file mode 100644 index 0000000..9b2e33f --- /dev/null +++ b/src/main/java/com/server/hispath/common/BaseEntity.java @@ -0,0 +1,34 @@ +package com.server.hispath.common; + + +import java.time.LocalDateTime; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@MappedSuperclass +@NoArgsConstructor +@EntityListeners(AuditingEntityListener.class) +public abstract class BaseEntity { + + @CreatedDate + private LocalDateTime createdAt; + + @LastModifiedDate + private LocalDateTime updatedAt; + + private boolean deleted = Boolean.FALSE; + + public void deleteContent() { + deleted = true; + } + + +} diff --git a/src/main/java/com/server/hispath/major/domain/Major.java b/src/main/java/com/server/hispath/major/domain/Major.java new file mode 100644 index 0000000..d827c20 --- /dev/null +++ b/src/main/java/com/server/hispath/major/domain/Major.java @@ -0,0 +1,27 @@ +package com.server.hispath.major.domain; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +import com.server.hispath.common.BaseEntity; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Entity +@Getter +@NoArgsConstructor +@Where(clause = "deleted = false") +@SQLDelete(sql = "UPDATE major SET deleted = true Where id = ?") +public class Major extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; +} diff --git a/src/main/java/com/server/hispath/major/presentation/MajorController.java b/src/main/java/com/server/hispath/major/presentation/MajorController.java new file mode 100644 index 0000000..83a83db --- /dev/null +++ b/src/main/java/com/server/hispath/major/presentation/MajorController.java @@ -0,0 +1,4 @@ +package com.server.hispath.major.presentation; + +public class MajorController { +} diff --git a/src/main/java/com/server/hispath/manager/domain/Manager.java b/src/main/java/com/server/hispath/manager/domain/Manager.java new file mode 100644 index 0000000..41a597c --- /dev/null +++ b/src/main/java/com/server/hispath/manager/domain/Manager.java @@ -0,0 +1,34 @@ +package com.server.hispath.manager.domain; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import com.server.hispath.common.BaseEntity; +import com.server.hispath.notice.domain.Notice; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Entity +@Getter +@NoArgsConstructor +@Where(clause = "deleted = false") +@SQLDelete(sql = "UPDATE manager SET deleted = true Where id = ?") +public class Manager extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @OneToMany(mappedBy = "writer") + private List notices = new ArrayList<>(); + + private String name; + + private String email; + + private String department; +} diff --git a/src/main/java/com/server/hispath/notice/domain/Notice.java b/src/main/java/com/server/hispath/notice/domain/Notice.java new file mode 100644 index 0000000..5f502c8 --- /dev/null +++ b/src/main/java/com/server/hispath/notice/domain/Notice.java @@ -0,0 +1,34 @@ +package com.server.hispath.notice.domain; + +import javax.persistence.*; + +import com.server.hispath.manager.domain.Manager; +import com.server.hispath.common.BaseEntity; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Entity +@Getter +@NoArgsConstructor +@Where(clause = "deleted = false") +@SQLDelete(sql = "UPDATE notice SET deleted = true Where id = ?") +public class Notice extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + private Manager writer; + + private String title; + + private String content; + + private int viewCnt; + + private boolean importance; + +} diff --git a/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java b/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java new file mode 100644 index 0000000..73d4786 --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java @@ -0,0 +1,24 @@ +package com.server.hispath.scholarship.domain; + +import javax.persistence.*; + +import com.server.hispath.common.BaseEntity; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Entity +@Getter +@NoArgsConstructor +@Where(clause = "deleted = false") +@SQLDelete(sql = "UPDATE scholarShip SET deleted = true Where id = ?") +public class Scholarship extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + //ToDO : 나중 구현 예정 +} diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java new file mode 100644 index 0000000..c40ba18 --- /dev/null +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -0,0 +1,54 @@ +package com.server.hispath.student.domain; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import com.server.hispath.common.BaseEntity; +import com.server.hispath.major.domain.Major; +import com.server.hispath.student.domain.participate.Participant; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Entity +@Getter +@NoArgsConstructor +@Where(clause = "deleted = false") +@SQLDelete(sql = "UPDATE student SET deleted = true Where id = ?") +public class Student extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + private String studentNum; + + private String phone; + + private String email; + + @ManyToOne(fetch = FetchType.LAZY) + private Major major1; + + @ManyToOne(fetch = FetchType.LAZY) + private Major major2; + + private Long loginCnt; + + private String profile; + + private String blog; + + private String githubId; + + private LocalDateTime lastLoginDate; + + @OneToMany(mappedBy = "student") + private List participants = new ArrayList<>(); +} diff --git a/src/main/java/com/server/hispath/student/domain/participate/Participant.java b/src/main/java/com/server/hispath/student/domain/participate/Participant.java new file mode 100644 index 0000000..9bcbfec --- /dev/null +++ b/src/main/java/com/server/hispath/student/domain/participate/Participant.java @@ -0,0 +1,30 @@ +package com.server.hispath.student.domain.participate; + +import javax.persistence.*; + +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.common.BaseEntity; +import com.server.hispath.student.domain.Student; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Entity +@Getter +@NoArgsConstructor +@Where(clause = "deleted = false") +@SQLDelete(sql = "UPDATE participate SET deleted = true Where id = ?") +public class Participant extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + private Student student; + + @ManyToOne(fetch = FetchType.LAZY) + private Activity activity; +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - From f01f28fc890570011722cb76e083ba98f50fd33e Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 20 Sep 2022 18:33:43 +0900 Subject: [PATCH 003/148] =?UTF-8?q?feat[#1]=20:=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EA=B8=B0=EB=B3=B8=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Service, Controller 들 틀 구현 --- .../activity/application/ActivityService.java | 15 +++++++++++++++ .../domain/repository/ActivityRepository.java | 8 ++++++++ .../activity/presentation/ActivityController.java | 13 +++++++++++++ .../category/application/CategoryService.java | 15 +++++++++++++++ .../domain/repository/CategoryRepository.java | 8 ++++++++ .../category/presentation/CategoryController.java | 14 ++++++++++++++ .../hispath/major/application/MajorService.java | 15 +++++++++++++++ .../major/domain/repository/MajorRepository.java | 8 ++++++++ .../major/presentation/MajorController.java | 10 ++++++++++ .../manager/application/ManagerService.java | 15 +++++++++++++++ .../domain/repository/ManagerRepository.java | 8 ++++++++ .../manager/presentation/ManagerController.java | 14 ++++++++++++++ .../hispath/notice/application/NoticeService.java | 15 +++++++++++++++ .../domain/repository/NoticeRepository.java | 8 ++++++++ .../notice/presentation/NoticeController.java | 14 ++++++++++++++ .../student/application/StudentService.java | 15 +++++++++++++++ .../domain/repository/StudentRepository.java | 8 ++++++++ .../student/presentation/StudentController.java | 14 ++++++++++++++ 18 files changed, 217 insertions(+) create mode 100644 src/main/java/com/server/hispath/activity/application/ActivityService.java create mode 100644 src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/ActivityController.java create mode 100644 src/main/java/com/server/hispath/category/application/CategoryService.java create mode 100644 src/main/java/com/server/hispath/category/domain/repository/CategoryRepository.java create mode 100644 src/main/java/com/server/hispath/category/presentation/CategoryController.java create mode 100644 src/main/java/com/server/hispath/major/application/MajorService.java create mode 100644 src/main/java/com/server/hispath/major/domain/repository/MajorRepository.java create mode 100644 src/main/java/com/server/hispath/manager/application/ManagerService.java create mode 100644 src/main/java/com/server/hispath/manager/domain/repository/ManagerRepository.java create mode 100644 src/main/java/com/server/hispath/manager/presentation/ManagerController.java create mode 100644 src/main/java/com/server/hispath/notice/application/NoticeService.java create mode 100644 src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java create mode 100644 src/main/java/com/server/hispath/notice/presentation/NoticeController.java create mode 100644 src/main/java/com/server/hispath/student/application/StudentService.java create mode 100644 src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java create mode 100644 src/main/java/com/server/hispath/student/presentation/StudentController.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java new file mode 100644 index 0000000..e1fa9db --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -0,0 +1,15 @@ +package com.server.hispath.activity.application; + +import com.server.hispath.activity.domain.repository.ActivityRepository; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class ActivityService { + + private final ActivityRepository activityRepository; + +} diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java new file mode 100644 index 0000000..cf2eb91 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -0,0 +1,8 @@ +package com.server.hispath.activity.domain.repository; + +import com.server.hispath.activity.domain.Activity; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ActivityRepository extends JpaRepository { +} diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java new file mode 100644 index 0000000..93d5630 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -0,0 +1,13 @@ +package com.server.hispath.activity.presentation; + +import com.server.hispath.activity.application.ActivityService; + +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class ActivityController { + private final ActivityService activityService; +} diff --git a/src/main/java/com/server/hispath/category/application/CategoryService.java b/src/main/java/com/server/hispath/category/application/CategoryService.java new file mode 100644 index 0000000..55c0bb1 --- /dev/null +++ b/src/main/java/com/server/hispath/category/application/CategoryService.java @@ -0,0 +1,15 @@ +package com.server.hispath.category.application; + +import com.server.hispath.category.domain.repository.CategoryRepository; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class CategoryService { + + private final CategoryRepository categoryRepository; + +} diff --git a/src/main/java/com/server/hispath/category/domain/repository/CategoryRepository.java b/src/main/java/com/server/hispath/category/domain/repository/CategoryRepository.java new file mode 100644 index 0000000..deffb0a --- /dev/null +++ b/src/main/java/com/server/hispath/category/domain/repository/CategoryRepository.java @@ -0,0 +1,8 @@ +package com.server.hispath.category.domain.repository; + +import com.server.hispath.category.domain.Category; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CategoryRepository extends JpaRepository { +} diff --git a/src/main/java/com/server/hispath/category/presentation/CategoryController.java b/src/main/java/com/server/hispath/category/presentation/CategoryController.java new file mode 100644 index 0000000..155c23b --- /dev/null +++ b/src/main/java/com/server/hispath/category/presentation/CategoryController.java @@ -0,0 +1,14 @@ +package com.server.hispath.category.presentation; + +import com.server.hispath.category.application.CategoryService; + +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class CategoryController { + + private final CategoryService categoryService; +} diff --git a/src/main/java/com/server/hispath/major/application/MajorService.java b/src/main/java/com/server/hispath/major/application/MajorService.java new file mode 100644 index 0000000..d22fe4e --- /dev/null +++ b/src/main/java/com/server/hispath/major/application/MajorService.java @@ -0,0 +1,15 @@ +package com.server.hispath.major.application; + +import com.server.hispath.major.domain.repository.MajorRepository; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class MajorService { + + private final MajorRepository majorRepository; + +} diff --git a/src/main/java/com/server/hispath/major/domain/repository/MajorRepository.java b/src/main/java/com/server/hispath/major/domain/repository/MajorRepository.java new file mode 100644 index 0000000..ed31101 --- /dev/null +++ b/src/main/java/com/server/hispath/major/domain/repository/MajorRepository.java @@ -0,0 +1,8 @@ +package com.server.hispath.major.domain.repository; + +import com.server.hispath.major.domain.Major; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MajorRepository extends JpaRepository { +} diff --git a/src/main/java/com/server/hispath/major/presentation/MajorController.java b/src/main/java/com/server/hispath/major/presentation/MajorController.java index 83a83db..0a8d5ca 100644 --- a/src/main/java/com/server/hispath/major/presentation/MajorController.java +++ b/src/main/java/com/server/hispath/major/presentation/MajorController.java @@ -1,4 +1,14 @@ package com.server.hispath.major.presentation; +import com.server.hispath.major.application.MajorService; + +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor public class MajorController { + + private final MajorService majorService; } diff --git a/src/main/java/com/server/hispath/manager/application/ManagerService.java b/src/main/java/com/server/hispath/manager/application/ManagerService.java new file mode 100644 index 0000000..21f8313 --- /dev/null +++ b/src/main/java/com/server/hispath/manager/application/ManagerService.java @@ -0,0 +1,15 @@ +package com.server.hispath.manager.application; + +import com.server.hispath.manager.domain.repository.ManagerRepository; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class ManagerService { + + private final ManagerRepository managerRepository; + +} diff --git a/src/main/java/com/server/hispath/manager/domain/repository/ManagerRepository.java b/src/main/java/com/server/hispath/manager/domain/repository/ManagerRepository.java new file mode 100644 index 0000000..d4abd84 --- /dev/null +++ b/src/main/java/com/server/hispath/manager/domain/repository/ManagerRepository.java @@ -0,0 +1,8 @@ +package com.server.hispath.manager.domain.repository; + +import com.server.hispath.manager.domain.Manager; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ManagerRepository extends JpaRepository { +} diff --git a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java new file mode 100644 index 0000000..06af748 --- /dev/null +++ b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java @@ -0,0 +1,14 @@ +package com.server.hispath.manager.presentation; + +import com.server.hispath.manager.application.ManagerService; + +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class ManagerController { + + private final ManagerService managerService; +} diff --git a/src/main/java/com/server/hispath/notice/application/NoticeService.java b/src/main/java/com/server/hispath/notice/application/NoticeService.java new file mode 100644 index 0000000..cf5a47d --- /dev/null +++ b/src/main/java/com/server/hispath/notice/application/NoticeService.java @@ -0,0 +1,15 @@ +package com.server.hispath.notice.application; + +import com.server.hispath.notice.domain.repository.NoticeRepository; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class NoticeService { + + private final NoticeRepository noticeRepository; + +} diff --git a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java new file mode 100644 index 0000000..6ea7914 --- /dev/null +++ b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java @@ -0,0 +1,8 @@ +package com.server.hispath.notice.domain.repository; + +import com.server.hispath.notice.domain.Notice; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface NoticeRepository extends JpaRepository { +} diff --git a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java new file mode 100644 index 0000000..7e855dc --- /dev/null +++ b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java @@ -0,0 +1,14 @@ +package com.server.hispath.notice.presentation; + +import com.server.hispath.notice.application.NoticeService; + +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class NoticeController { + + private final NoticeService noticeService; +} diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java new file mode 100644 index 0000000..42bde8f --- /dev/null +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -0,0 +1,15 @@ +package com.server.hispath.student.application; + +import com.server.hispath.student.domain.repository.StudentRepository; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class StudentService { + + private final StudentRepository studentRepository; + +} diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java new file mode 100644 index 0000000..f5b72a4 --- /dev/null +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java @@ -0,0 +1,8 @@ +package com.server.hispath.student.domain.repository; + +import com.server.hispath.student.domain.Student; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface StudentRepository extends JpaRepository { +} diff --git a/src/main/java/com/server/hispath/student/presentation/StudentController.java b/src/main/java/com/server/hispath/student/presentation/StudentController.java new file mode 100644 index 0000000..d4d30ff --- /dev/null +++ b/src/main/java/com/server/hispath/student/presentation/StudentController.java @@ -0,0 +1,14 @@ +package com.server.hispath.student.presentation; + +import com.server.hispath.student.application.StudentService; + +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class StudentController { + + private final StudentService studentService; +} From 2eeff38e043e05fffea5c1d04ee0d31cb5fdf0ca Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 20 Sep 2022 20:23:29 +0900 Subject: [PATCH 004/148] =?UTF-8?q?feat[#1]=20:=20Swagger=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Swagger 3.0의 경우 스프링 2.6이상의 버전을 지원하지 않으므로, 스프링의 버전을 2.5로 낮추어 Swagger를 적용하였다. --- build.gradle | 6 ++-- .../server/hispath/config/SwaggerConfig.java | 33 +++++++++++++++++++ .../java/com/server/hispath/docs/ApiDoc.java | 13 ++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/server/hispath/config/SwaggerConfig.java create mode 100644 src/main/java/com/server/hispath/docs/ApiDoc.java diff --git a/build.gradle b/build.gradle index 94dbea8..36d54cd 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '2.7.3' - id 'io.spring.dependency-management' version '1.0.13.RELEASE' + id 'org.springframework.boot' version '2.5.3' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } @@ -21,6 +21,8 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'io.springfox:springfox-boot-starter:3.0.0' + implementation 'ca.pjer:logback-awslogs-appender:1.6.0' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' runtimeOnly 'mysql:mysql-connector-java' diff --git a/src/main/java/com/server/hispath/config/SwaggerConfig.java b/src/main/java/com/server/hispath/config/SwaggerConfig.java new file mode 100644 index 0000000..a34c3ae --- /dev/null +++ b/src/main/java/com/server/hispath/config/SwaggerConfig.java @@ -0,0 +1,33 @@ +package com.server.hispath.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +@Configuration +public class SwaggerConfig { + @Bean + public Docket api() { + return new Docket(DocumentationType.OAS_30) + .useDefaultResponseMessages(false) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.ant("/api/**")) + .build() + .apiInfo(apiInfo()); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("HisPath Swagger") + .description("HisPath") + .version("1.0") + .build(); + } +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java new file mode 100644 index 0000000..0e1188e --- /dev/null +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -0,0 +1,13 @@ +package com.server.hispath.docs; + +public class ApiDoc { + + + /* Student 관련 API 명세 */ + + + /* Activity 관련 API 명세 */ + + /* Category 관련 API 명세 */ + +} \ No newline at end of file From c27c69e11cc6d2c36c71df3f95816f64b2f8d9f5 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 20 Sep 2022 20:38:59 +0900 Subject: [PATCH 005/148] =?UTF-8?q?feat[#1]=20:=20custom=20Exception=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/exception/ExceptionResponse.java | 12 ++++++++++++ .../exception/GlobalExceptionHandler.java | 15 +++++++++++++++ .../hispath/exception/HisPathException.java | 16 ++++++++++++++++ .../exception/activity/ActivityException.java | 11 +++++++++++ .../activity/ActivityNotFoundException.java | 9 +++++++++ .../exception/category/CategoryException.java | 11 +++++++++++ .../category/CategoryNotFoundException.java | 9 +++++++++ .../hispath/exception/major/MajorException.java | 11 +++++++++++ .../exception/major/MajorNotFoundException.java | 9 +++++++++ .../exception/manager/ManagerException.java | 11 +++++++++++ .../manager/ManagerNotFoundException.java | 9 +++++++++ .../exception/notice/NoticeException.java | 11 +++++++++++ .../notice/NoticeNotFoundException.java | 9 +++++++++ .../exception/student/StudentException.java | 11 +++++++++++ .../student/StudentNotFoundException.java | 9 +++++++++ 15 files changed, 163 insertions(+) create mode 100644 src/main/java/com/server/hispath/exception/ExceptionResponse.java create mode 100644 src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/server/hispath/exception/HisPathException.java create mode 100644 src/main/java/com/server/hispath/exception/activity/ActivityException.java create mode 100644 src/main/java/com/server/hispath/exception/activity/ActivityNotFoundException.java create mode 100644 src/main/java/com/server/hispath/exception/category/CategoryException.java create mode 100644 src/main/java/com/server/hispath/exception/category/CategoryNotFoundException.java create mode 100644 src/main/java/com/server/hispath/exception/major/MajorException.java create mode 100644 src/main/java/com/server/hispath/exception/major/MajorNotFoundException.java create mode 100644 src/main/java/com/server/hispath/exception/manager/ManagerException.java create mode 100644 src/main/java/com/server/hispath/exception/manager/ManagerNotFoundException.java create mode 100644 src/main/java/com/server/hispath/exception/notice/NoticeException.java create mode 100644 src/main/java/com/server/hispath/exception/notice/NoticeNotFoundException.java create mode 100644 src/main/java/com/server/hispath/exception/student/StudentException.java create mode 100644 src/main/java/com/server/hispath/exception/student/StudentNotFoundException.java diff --git a/src/main/java/com/server/hispath/exception/ExceptionResponse.java b/src/main/java/com/server/hispath/exception/ExceptionResponse.java new file mode 100644 index 0000000..63709f8 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/ExceptionResponse.java @@ -0,0 +1,12 @@ +package com.server.hispath.exception; + +import lombok.Getter; + +@Getter +public class ExceptionResponse { + private final String message; + + public ExceptionResponse(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java b/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..d2d92ed --- /dev/null +++ b/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java @@ -0,0 +1,15 @@ +package com.server.hispath.exception; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(HisPathException.class) + public ResponseEntity hisPathException(HisPathException e) { + return ResponseEntity.status(e.getHttpStatus()) + .body(new ExceptionResponse(e.getMessage())); + } +} diff --git a/src/main/java/com/server/hispath/exception/HisPathException.java b/src/main/java/com/server/hispath/exception/HisPathException.java new file mode 100644 index 0000000..d6d9b39 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/HisPathException.java @@ -0,0 +1,16 @@ +package com.server.hispath.exception; + +import org.springframework.http.HttpStatus; + +public class HisPathException extends RuntimeException{ + private final HttpStatus httpStatus; + + public HisPathException(String message, HttpStatus httpStatus){ + super(message); + this.httpStatus = httpStatus; + } + + public HttpStatus getHttpStatus() { + return httpStatus; + } +} diff --git a/src/main/java/com/server/hispath/exception/activity/ActivityException.java b/src/main/java/com/server/hispath/exception/activity/ActivityException.java new file mode 100644 index 0000000..e5e13be --- /dev/null +++ b/src/main/java/com/server/hispath/exception/activity/ActivityException.java @@ -0,0 +1,11 @@ +package com.server.hispath.exception.activity; + +import com.server.hispath.exception.HisPathException; + +import org.springframework.http.HttpStatus; + +public class ActivityException extends HisPathException { + protected ActivityException(String message, HttpStatus httpStatus) { + super(message, httpStatus); + } +} diff --git a/src/main/java/com/server/hispath/exception/activity/ActivityNotFoundException.java b/src/main/java/com/server/hispath/exception/activity/ActivityNotFoundException.java new file mode 100644 index 0000000..0ca6077 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/activity/ActivityNotFoundException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.activity; + +import org.springframework.http.HttpStatus; + +public class ActivityNotFoundException extends ActivityException { + public ActivityNotFoundException() { + super("존재하지 않는 활동입니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/exception/category/CategoryException.java b/src/main/java/com/server/hispath/exception/category/CategoryException.java new file mode 100644 index 0000000..be6e934 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/category/CategoryException.java @@ -0,0 +1,11 @@ +package com.server.hispath.exception.category; + +import com.server.hispath.exception.HisPathException; + +import org.springframework.http.HttpStatus; + +public class CategoryException extends HisPathException { + protected CategoryException(String message, HttpStatus httpStatus) { + super(message, httpStatus); + } +} diff --git a/src/main/java/com/server/hispath/exception/category/CategoryNotFoundException.java b/src/main/java/com/server/hispath/exception/category/CategoryNotFoundException.java new file mode 100644 index 0000000..9512ca1 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/category/CategoryNotFoundException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.category; + +import org.springframework.http.HttpStatus; + +public class CategoryNotFoundException extends CategoryException { + public CategoryNotFoundException() { + super("존재하지 않는 카테고리입니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/exception/major/MajorException.java b/src/main/java/com/server/hispath/exception/major/MajorException.java new file mode 100644 index 0000000..30eaee0 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/major/MajorException.java @@ -0,0 +1,11 @@ +package com.server.hispath.exception.major; + +import com.server.hispath.exception.HisPathException; + +import org.springframework.http.HttpStatus; + +public class MajorException extends HisPathException { + protected MajorException(String message, HttpStatus httpStatus) { + super(message, httpStatus); + } +} diff --git a/src/main/java/com/server/hispath/exception/major/MajorNotFoundException.java b/src/main/java/com/server/hispath/exception/major/MajorNotFoundException.java new file mode 100644 index 0000000..ea6b9fd --- /dev/null +++ b/src/main/java/com/server/hispath/exception/major/MajorNotFoundException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.major; + +import org.springframework.http.HttpStatus; + +public class MajorNotFoundException extends MajorException { + public MajorNotFoundException() { + super("존재하지 않는 전공입니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/exception/manager/ManagerException.java b/src/main/java/com/server/hispath/exception/manager/ManagerException.java new file mode 100644 index 0000000..e994378 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/manager/ManagerException.java @@ -0,0 +1,11 @@ +package com.server.hispath.exception.manager; + +import com.server.hispath.exception.HisPathException; + +import org.springframework.http.HttpStatus; + +public class ManagerException extends HisPathException { + protected ManagerException(String message, HttpStatus httpStatus) { + super(message, httpStatus); + } +} diff --git a/src/main/java/com/server/hispath/exception/manager/ManagerNotFoundException.java b/src/main/java/com/server/hispath/exception/manager/ManagerNotFoundException.java new file mode 100644 index 0000000..20d1ec2 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/manager/ManagerNotFoundException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.manager; + +import org.springframework.http.HttpStatus; + +public class ManagerNotFoundException extends ManagerException { + public ManagerNotFoundException() { + super("존재하지 않는 관리자입니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/exception/notice/NoticeException.java b/src/main/java/com/server/hispath/exception/notice/NoticeException.java new file mode 100644 index 0000000..f12dad1 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/notice/NoticeException.java @@ -0,0 +1,11 @@ +package com.server.hispath.exception.notice; + +import com.server.hispath.exception.HisPathException; + +import org.springframework.http.HttpStatus; + +public class NoticeException extends HisPathException { + protected NoticeException(String message, HttpStatus httpStatus) { + super(message, httpStatus); + } +} diff --git a/src/main/java/com/server/hispath/exception/notice/NoticeNotFoundException.java b/src/main/java/com/server/hispath/exception/notice/NoticeNotFoundException.java new file mode 100644 index 0000000..7c8b991 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/notice/NoticeNotFoundException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.notice; + +import org.springframework.http.HttpStatus; + +public class NoticeNotFoundException extends NoticeException { + public NoticeNotFoundException() { + super("존재하지 않는 공지입니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/exception/student/StudentException.java b/src/main/java/com/server/hispath/exception/student/StudentException.java new file mode 100644 index 0000000..1e96c76 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/student/StudentException.java @@ -0,0 +1,11 @@ +package com.server.hispath.exception.student; + +import com.server.hispath.exception.HisPathException; + +import org.springframework.http.HttpStatus; + +public class StudentException extends HisPathException { + protected StudentException(String message, HttpStatus httpStatus) { + super(message, httpStatus); + } +} diff --git a/src/main/java/com/server/hispath/exception/student/StudentNotFoundException.java b/src/main/java/com/server/hispath/exception/student/StudentNotFoundException.java new file mode 100644 index 0000000..f2de707 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/student/StudentNotFoundException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.student; + +import org.springframework.http.HttpStatus; + +public class StudentNotFoundException extends StudentException{ + public StudentNotFoundException() { + super("존재하지 않는 학생입니다.", HttpStatus.BAD_REQUEST); + } +} From 6b59bc36fbda9b35192e90a1a760d2490d8f0cde Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 20 Sep 2022 22:09:42 +0900 Subject: [PATCH 006/148] =?UTF-8?q?feat[#2]=20:=20Category=20Create=20API?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/application/CategoryService.java | 8 ++++++++ .../application/dto/CategoryContentDto.java | 20 +++++++++++++++++++ .../domain/ActivityType.java | 2 +- .../hispath/category/domain/Category.java | 15 ++++++++++++-- .../presentation/CategoryController.java | 13 ++++++++++++ .../request/CategoryCreateRequest.java | 13 ++++++++++++ 6 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/server/hispath/category/application/dto/CategoryContentDto.java rename src/main/java/com/server/hispath/{activity => category}/domain/ActivityType.java (57%) create mode 100644 src/main/java/com/server/hispath/category/presentation/request/CategoryCreateRequest.java diff --git a/src/main/java/com/server/hispath/category/application/CategoryService.java b/src/main/java/com/server/hispath/category/application/CategoryService.java index 55c0bb1..79f36eb 100644 --- a/src/main/java/com/server/hispath/category/application/CategoryService.java +++ b/src/main/java/com/server/hispath/category/application/CategoryService.java @@ -1,8 +1,11 @@ package com.server.hispath.category.application; +import com.server.hispath.category.application.dto.CategoryContentDto; +import com.server.hispath.category.domain.Category; import com.server.hispath.category.domain.repository.CategoryRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; @@ -12,4 +15,9 @@ public class CategoryService { private final CategoryRepository categoryRepository; + @Transactional + public Long create(CategoryContentDto dto){ + Category savedCategory = categoryRepository.save(Category.from(dto)); + return savedCategory.getId(); + } } diff --git a/src/main/java/com/server/hispath/category/application/dto/CategoryContentDto.java b/src/main/java/com/server/hispath/category/application/dto/CategoryContentDto.java new file mode 100644 index 0000000..daa6337 --- /dev/null +++ b/src/main/java/com/server/hispath/category/application/dto/CategoryContentDto.java @@ -0,0 +1,20 @@ +package com.server.hispath.category.application.dto; + +import com.server.hispath.category.domain.ActivityType; +import com.server.hispath.category.presentation.request.CategoryCreateRequest; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class CategoryContentDto { + private ActivityType type; + private String name; + + public static CategoryContentDto of(CategoryCreateRequest request) { + return new CategoryContentDto(ActivityType.valueOf(request.getType()), request.getName()); + } +} diff --git a/src/main/java/com/server/hispath/activity/domain/ActivityType.java b/src/main/java/com/server/hispath/category/domain/ActivityType.java similarity index 57% rename from src/main/java/com/server/hispath/activity/domain/ActivityType.java rename to src/main/java/com/server/hispath/category/domain/ActivityType.java index 1861c09..78d1e50 100644 --- a/src/main/java/com/server/hispath/activity/domain/ActivityType.java +++ b/src/main/java/com/server/hispath/category/domain/ActivityType.java @@ -1,4 +1,4 @@ -package com.server.hispath.activity.domain; +package com.server.hispath.category.domain; public enum ActivityType { MILEAGE_ACTIVITY, PROJECT diff --git a/src/main/java/com/server/hispath/category/domain/Category.java b/src/main/java/com/server/hispath/category/domain/Category.java index 15e0130..d0c1db0 100644 --- a/src/main/java/com/server/hispath/category/domain/Category.java +++ b/src/main/java/com/server/hispath/category/domain/Category.java @@ -5,9 +5,11 @@ import javax.persistence.*; import com.server.hispath.activity.domain.Activity; -import com.server.hispath.activity.domain.ActivityType; +import com.server.hispath.category.application.dto.CategoryContentDto; import com.server.hispath.common.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; @@ -15,8 +17,10 @@ @Entity @Getter -@NoArgsConstructor @Where(clause = "deleted = false") +@Builder +@NoArgsConstructor +@AllArgsConstructor @SQLDelete(sql = "UPDATE category SET deleted = true Where id = ?") public class Category extends BaseEntity { @@ -31,4 +35,11 @@ public class Category extends BaseEntity { @Enumerated(EnumType.STRING) private ActivityType type; + + public static Category from(CategoryContentDto dto) { + return Category.builder() + .type(dto.getType()) + .name(dto.getName()) + .build(); + } } diff --git a/src/main/java/com/server/hispath/category/presentation/CategoryController.java b/src/main/java/com/server/hispath/category/presentation/CategoryController.java index 155c23b..b7e5f13 100644 --- a/src/main/java/com/server/hispath/category/presentation/CategoryController.java +++ b/src/main/java/com/server/hispath/category/presentation/CategoryController.java @@ -1,14 +1,27 @@ package com.server.hispath.category.presentation; import com.server.hispath.category.application.CategoryService; +import com.server.hispath.category.application.dto.CategoryContentDto; +import com.server.hispath.category.presentation.request.CategoryCreateRequest; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor +@RequestMapping("/api") public class CategoryController { private final CategoryService categoryService; + + @PostMapping("/category") + public ResponseEntity create(@RequestBody CategoryCreateRequest request){ + Long savedId = categoryService.create(CategoryContentDto.of(request)); + return ResponseEntity.ok(savedId); + } } diff --git a/src/main/java/com/server/hispath/category/presentation/request/CategoryCreateRequest.java b/src/main/java/com/server/hispath/category/presentation/request/CategoryCreateRequest.java new file mode 100644 index 0000000..d48732a --- /dev/null +++ b/src/main/java/com/server/hispath/category/presentation/request/CategoryCreateRequest.java @@ -0,0 +1,13 @@ +package com.server.hispath.category.presentation.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class CategoryCreateRequest { + private String type; + private String name; +} From e731095ec821f5a5274269ff0483870afd9e2f34 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 20 Sep 2022 22:19:22 +0900 Subject: [PATCH 007/148] =?UTF-8?q?feat[#2]=20:=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20=EB=8B=A8=EC=9D=BC=EC=A1=B0=ED=9A=8C=20API?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/application/CategoryService.java | 10 ++++++++- .../application/dto/CategoryContentDto.java | 9 ++++---- .../application/dto/CategoryCreateDto.java | 20 ++++++++++++++++++ .../hispath/category/domain/Category.java | 4 ++-- .../presentation/CategoryController.java | 20 +++++++++++------- .../response/CategoryResponse.java | 21 +++++++++++++++++++ 6 files changed, 69 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/server/hispath/category/application/dto/CategoryCreateDto.java create mode 100644 src/main/java/com/server/hispath/category/presentation/response/CategoryResponse.java diff --git a/src/main/java/com/server/hispath/category/application/CategoryService.java b/src/main/java/com/server/hispath/category/application/CategoryService.java index 79f36eb..18b7438 100644 --- a/src/main/java/com/server/hispath/category/application/CategoryService.java +++ b/src/main/java/com/server/hispath/category/application/CategoryService.java @@ -1,8 +1,10 @@ package com.server.hispath.category.application; import com.server.hispath.category.application.dto.CategoryContentDto; +import com.server.hispath.category.application.dto.CategoryCreateDto; import com.server.hispath.category.domain.Category; import com.server.hispath.category.domain.repository.CategoryRepository; +import com.server.hispath.exception.category.CategoryNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,8 +18,14 @@ public class CategoryService { private final CategoryRepository categoryRepository; @Transactional - public Long create(CategoryContentDto dto){ + public Long create(CategoryCreateDto dto){ Category savedCategory = categoryRepository.save(Category.from(dto)); return savedCategory.getId(); } + + @Transactional(readOnly = true) + public CategoryContentDto findById(Long id){ + Category category = categoryRepository.findById(id).orElseThrow(CategoryNotFoundException::new); + return CategoryContentDto.from(category); + } } diff --git a/src/main/java/com/server/hispath/category/application/dto/CategoryContentDto.java b/src/main/java/com/server/hispath/category/application/dto/CategoryContentDto.java index daa6337..f0e2a2a 100644 --- a/src/main/java/com/server/hispath/category/application/dto/CategoryContentDto.java +++ b/src/main/java/com/server/hispath/category/application/dto/CategoryContentDto.java @@ -1,7 +1,6 @@ package com.server.hispath.category.application.dto; -import com.server.hispath.category.domain.ActivityType; -import com.server.hispath.category.presentation.request.CategoryCreateRequest; +import com.server.hispath.category.domain.Category; import lombok.AllArgsConstructor; import lombok.Getter; @@ -11,10 +10,10 @@ @NoArgsConstructor @AllArgsConstructor public class CategoryContentDto { - private ActivityType type; + private Long id; private String name; - public static CategoryContentDto of(CategoryCreateRequest request) { - return new CategoryContentDto(ActivityType.valueOf(request.getType()), request.getName()); + public static CategoryContentDto from(Category category) { + return new CategoryContentDto(category.getId(), category.getName()); } } diff --git a/src/main/java/com/server/hispath/category/application/dto/CategoryCreateDto.java b/src/main/java/com/server/hispath/category/application/dto/CategoryCreateDto.java new file mode 100644 index 0000000..579d1dd --- /dev/null +++ b/src/main/java/com/server/hispath/category/application/dto/CategoryCreateDto.java @@ -0,0 +1,20 @@ +package com.server.hispath.category.application.dto; + +import com.server.hispath.category.domain.ActivityType; +import com.server.hispath.category.presentation.request.CategoryCreateRequest; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class CategoryCreateDto { + private ActivityType type; + private String name; + + public static CategoryCreateDto of(CategoryCreateRequest request) { + return new CategoryCreateDto(ActivityType.valueOf(request.getType()), request.getName()); + } +} diff --git a/src/main/java/com/server/hispath/category/domain/Category.java b/src/main/java/com/server/hispath/category/domain/Category.java index d0c1db0..4451e20 100644 --- a/src/main/java/com/server/hispath/category/domain/Category.java +++ b/src/main/java/com/server/hispath/category/domain/Category.java @@ -5,7 +5,7 @@ import javax.persistence.*; import com.server.hispath.activity.domain.Activity; -import com.server.hispath.category.application.dto.CategoryContentDto; +import com.server.hispath.category.application.dto.CategoryCreateDto; import com.server.hispath.common.BaseEntity; import lombok.AllArgsConstructor; @@ -36,7 +36,7 @@ public class Category extends BaseEntity { @Enumerated(EnumType.STRING) private ActivityType type; - public static Category from(CategoryContentDto dto) { + public static Category from(CategoryCreateDto dto) { return Category.builder() .type(dto.getType()) .name(dto.getName()) diff --git a/src/main/java/com/server/hispath/category/presentation/CategoryController.java b/src/main/java/com/server/hispath/category/presentation/CategoryController.java index b7e5f13..f25e85e 100644 --- a/src/main/java/com/server/hispath/category/presentation/CategoryController.java +++ b/src/main/java/com/server/hispath/category/presentation/CategoryController.java @@ -2,13 +2,12 @@ import com.server.hispath.category.application.CategoryService; import com.server.hispath.category.application.dto.CategoryContentDto; +import com.server.hispath.category.application.dto.CategoryCreateDto; import com.server.hispath.category.presentation.request.CategoryCreateRequest; +import com.server.hispath.category.presentation.response.CategoryResponse; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import lombok.RequiredArgsConstructor; @@ -16,12 +15,19 @@ @RequiredArgsConstructor @RequestMapping("/api") public class CategoryController { - + private final CategoryService categoryService; @PostMapping("/category") - public ResponseEntity create(@RequestBody CategoryCreateRequest request){ - Long savedId = categoryService.create(CategoryContentDto.of(request)); + public ResponseEntity create(@RequestBody CategoryCreateRequest request) { + Long savedId = categoryService.create(CategoryCreateDto.of(request)); return ResponseEntity.ok(savedId); } + + @GetMapping("/category/{id}") + public ResponseEntity find(@PathVariable Long id) { + CategoryContentDto dto = categoryService.findById(id); + CategoryResponse response = CategoryResponse.from(dto); + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/com/server/hispath/category/presentation/response/CategoryResponse.java b/src/main/java/com/server/hispath/category/presentation/response/CategoryResponse.java new file mode 100644 index 0000000..3ffbf4a --- /dev/null +++ b/src/main/java/com/server/hispath/category/presentation/response/CategoryResponse.java @@ -0,0 +1,21 @@ +package com.server.hispath.category.presentation.response; + +import com.server.hispath.category.application.dto.CategoryContentDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class CategoryResponse { + private Long categoryId; + private String name; + + public static CategoryResponse from(CategoryContentDto dto) { + return new CategoryResponse(dto.getId(), dto.getName()); + } +} From dc5ccf0ad69e96b7d425cec669b95d32db8fca11 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 20 Sep 2022 22:24:19 +0900 Subject: [PATCH 008/148] =?UTF-8?q?feat[#2]=20:=20category=20=EB=8B=A4?= =?UTF-8?q?=EC=A4=91=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/application/CategoryService.java | 15 +++++++++++++-- .../category/presentation/CategoryController.java | 12 ++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/server/hispath/category/application/CategoryService.java b/src/main/java/com/server/hispath/category/application/CategoryService.java index 18b7438..f475ed1 100644 --- a/src/main/java/com/server/hispath/category/application/CategoryService.java +++ b/src/main/java/com/server/hispath/category/application/CategoryService.java @@ -1,5 +1,8 @@ package com.server.hispath.category.application; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.category.application.dto.CategoryContentDto; import com.server.hispath.category.application.dto.CategoryCreateDto; import com.server.hispath.category.domain.Category; @@ -18,14 +21,22 @@ public class CategoryService { private final CategoryRepository categoryRepository; @Transactional - public Long create(CategoryCreateDto dto){ + public Long create(CategoryCreateDto dto) { Category savedCategory = categoryRepository.save(Category.from(dto)); return savedCategory.getId(); } @Transactional(readOnly = true) - public CategoryContentDto findById(Long id){ + public CategoryContentDto findById(Long id) { Category category = categoryRepository.findById(id).orElseThrow(CategoryNotFoundException::new); return CategoryContentDto.from(category); } + + @Transactional(readOnly = true) + public List findAll() { + List categories = categoryRepository.findAll(); + return categories.stream() + .map(CategoryContentDto::from) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/server/hispath/category/presentation/CategoryController.java b/src/main/java/com/server/hispath/category/presentation/CategoryController.java index f25e85e..aecd8b9 100644 --- a/src/main/java/com/server/hispath/category/presentation/CategoryController.java +++ b/src/main/java/com/server/hispath/category/presentation/CategoryController.java @@ -1,5 +1,8 @@ package com.server.hispath.category.presentation; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.category.application.CategoryService; import com.server.hispath.category.application.dto.CategoryContentDto; import com.server.hispath.category.application.dto.CategoryCreateDto; @@ -30,4 +33,13 @@ public ResponseEntity find(@PathVariable Long id) { CategoryResponse response = CategoryResponse.from(dto); return ResponseEntity.ok(response); } + + @GetMapping("/categories") + public ResponseEntity> findAll() { + List dtos = categoryService.findAll(); + List responses = dtos.stream() + .map(CategoryResponse::from) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } } From 46d885dbd1bd213936113b68e614e0df359be053 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 20 Sep 2022 22:39:41 +0900 Subject: [PATCH 009/148] =?UTF-8?q?feat[#2]=20:=20Category=20update,=20del?= =?UTF-8?q?ete=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/application/CategoryService.java | 17 ++++++++++++-- ...egoryCreateDto.java => CategoryCUDto.java} | 8 +++---- .../hispath/category/domain/Category.java | 9 ++++++-- .../presentation/CategoryController.java | 22 +++++++++++++++---- ...ateRequest.java => CategoryCURequest.java} | 2 +- 5 files changed, 45 insertions(+), 13 deletions(-) rename src/main/java/com/server/hispath/category/application/dto/{CategoryCreateDto.java => CategoryCUDto.java} (63%) rename src/main/java/com/server/hispath/category/presentation/request/{CategoryCreateRequest.java => CategoryCURequest.java} (85%) diff --git a/src/main/java/com/server/hispath/category/application/CategoryService.java b/src/main/java/com/server/hispath/category/application/CategoryService.java index f475ed1..55a3f87 100644 --- a/src/main/java/com/server/hispath/category/application/CategoryService.java +++ b/src/main/java/com/server/hispath/category/application/CategoryService.java @@ -4,7 +4,7 @@ import java.util.stream.Collectors; import com.server.hispath.category.application.dto.CategoryContentDto; -import com.server.hispath.category.application.dto.CategoryCreateDto; +import com.server.hispath.category.application.dto.CategoryCUDto; import com.server.hispath.category.domain.Category; import com.server.hispath.category.domain.repository.CategoryRepository; import com.server.hispath.exception.category.CategoryNotFoundException; @@ -21,7 +21,7 @@ public class CategoryService { private final CategoryRepository categoryRepository; @Transactional - public Long create(CategoryCreateDto dto) { + public Long create(CategoryCUDto dto) { Category savedCategory = categoryRepository.save(Category.from(dto)); return savedCategory.getId(); } @@ -39,4 +39,17 @@ public List findAll() { .map(CategoryContentDto::from) .collect(Collectors.toList()); } + + @Transactional + public CategoryContentDto update(Long id, CategoryCUDto dto){ + Category category = categoryRepository.findById(id).orElseThrow(CategoryNotFoundException::new); + category.update(dto); + return CategoryContentDto.from(category); + } + + @Transactional + public void delete(Long id){ + Category category = categoryRepository.findById(id).orElseThrow(CategoryNotFoundException::new); + category.deleteContent(); + } } diff --git a/src/main/java/com/server/hispath/category/application/dto/CategoryCreateDto.java b/src/main/java/com/server/hispath/category/application/dto/CategoryCUDto.java similarity index 63% rename from src/main/java/com/server/hispath/category/application/dto/CategoryCreateDto.java rename to src/main/java/com/server/hispath/category/application/dto/CategoryCUDto.java index 579d1dd..31c5e82 100644 --- a/src/main/java/com/server/hispath/category/application/dto/CategoryCreateDto.java +++ b/src/main/java/com/server/hispath/category/application/dto/CategoryCUDto.java @@ -1,7 +1,7 @@ package com.server.hispath.category.application.dto; import com.server.hispath.category.domain.ActivityType; -import com.server.hispath.category.presentation.request.CategoryCreateRequest; +import com.server.hispath.category.presentation.request.CategoryCURequest; import lombok.AllArgsConstructor; import lombok.Getter; @@ -10,11 +10,11 @@ @Getter @NoArgsConstructor @AllArgsConstructor -public class CategoryCreateDto { +public class CategoryCUDto { private ActivityType type; private String name; - public static CategoryCreateDto of(CategoryCreateRequest request) { - return new CategoryCreateDto(ActivityType.valueOf(request.getType()), request.getName()); + public static CategoryCUDto of(CategoryCURequest request) { + return new CategoryCUDto(ActivityType.valueOf(request.getType()), request.getName()); } } diff --git a/src/main/java/com/server/hispath/category/domain/Category.java b/src/main/java/com/server/hispath/category/domain/Category.java index 4451e20..8aab04f 100644 --- a/src/main/java/com/server/hispath/category/domain/Category.java +++ b/src/main/java/com/server/hispath/category/domain/Category.java @@ -5,7 +5,7 @@ import javax.persistence.*; import com.server.hispath.activity.domain.Activity; -import com.server.hispath.category.application.dto.CategoryCreateDto; +import com.server.hispath.category.application.dto.CategoryCUDto; import com.server.hispath.common.BaseEntity; import lombok.AllArgsConstructor; @@ -36,7 +36,12 @@ public class Category extends BaseEntity { @Enumerated(EnumType.STRING) private ActivityType type; - public static Category from(CategoryCreateDto dto) { + public void update(CategoryCUDto dto) { + this.type = dto.getType(); + this.name = dto.getName(); + } + + public static Category from(CategoryCUDto dto) { return Category.builder() .type(dto.getType()) .name(dto.getName()) diff --git a/src/main/java/com/server/hispath/category/presentation/CategoryController.java b/src/main/java/com/server/hispath/category/presentation/CategoryController.java index aecd8b9..934897f 100644 --- a/src/main/java/com/server/hispath/category/presentation/CategoryController.java +++ b/src/main/java/com/server/hispath/category/presentation/CategoryController.java @@ -5,8 +5,8 @@ import com.server.hispath.category.application.CategoryService; import com.server.hispath.category.application.dto.CategoryContentDto; -import com.server.hispath.category.application.dto.CategoryCreateDto; -import com.server.hispath.category.presentation.request.CategoryCreateRequest; +import com.server.hispath.category.application.dto.CategoryCUDto; +import com.server.hispath.category.presentation.request.CategoryCURequest; import com.server.hispath.category.presentation.response.CategoryResponse; import org.springframework.http.ResponseEntity; @@ -22,8 +22,8 @@ public class CategoryController { private final CategoryService categoryService; @PostMapping("/category") - public ResponseEntity create(@RequestBody CategoryCreateRequest request) { - Long savedId = categoryService.create(CategoryCreateDto.of(request)); + public ResponseEntity create(@RequestBody CategoryCURequest request) { + Long savedId = categoryService.create(CategoryCUDto.of(request)); return ResponseEntity.ok(savedId); } @@ -42,4 +42,18 @@ public ResponseEntity> findAll() { .collect(Collectors.toList()); return ResponseEntity.ok(responses); } + + @PatchMapping("/category/{id}") + public ResponseEntity update(@PathVariable Long id, @RequestBody CategoryCURequest request) { + CategoryContentDto dto = categoryService.update(id, CategoryCUDto.of(request)); + CategoryResponse response = CategoryResponse.from(dto); + + return ResponseEntity.ok(response); + } + + @DeleteMapping("/category/{id}") + public ResponseEntity delete(@PathVariable Long id) { + categoryService.delete(id); + return ResponseEntity.ok(id); + } } diff --git a/src/main/java/com/server/hispath/category/presentation/request/CategoryCreateRequest.java b/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java similarity index 85% rename from src/main/java/com/server/hispath/category/presentation/request/CategoryCreateRequest.java rename to src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java index d48732a..000540b 100644 --- a/src/main/java/com/server/hispath/category/presentation/request/CategoryCreateRequest.java +++ b/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java @@ -7,7 +7,7 @@ @Getter @Setter @NoArgsConstructor -public class CategoryCreateRequest { +public class CategoryCURequest { private String type; private String name; } From 584c7db164b46da56d02c06f6a88c978d0852aa0 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 20 Sep 2022 22:51:49 +0900 Subject: [PATCH 010/148] =?UTF-8?q?fix[#2]=20:=20API=20=EC=9D=BC=EB=B6=80?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - @SQLDELETE에 옵션을 주었기에, 그냥 delete를 사용해도 된다. --- src/main/java/com/server/hispath/HispathApplication.java | 2 ++ .../server/hispath/category/application/CategoryService.java | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/server/hispath/HispathApplication.java b/src/main/java/com/server/hispath/HispathApplication.java index e2d77f7..13c7ac8 100644 --- a/src/main/java/com/server/hispath/HispathApplication.java +++ b/src/main/java/com/server/hispath/HispathApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication +@EnableJpaAuditing public class HispathApplication { public static void main(String[] args) { diff --git a/src/main/java/com/server/hispath/category/application/CategoryService.java b/src/main/java/com/server/hispath/category/application/CategoryService.java index 55a3f87..89c3bf3 100644 --- a/src/main/java/com/server/hispath/category/application/CategoryService.java +++ b/src/main/java/com/server/hispath/category/application/CategoryService.java @@ -49,7 +49,6 @@ public CategoryContentDto update(Long id, CategoryCUDto dto){ @Transactional public void delete(Long id){ - Category category = categoryRepository.findById(id).orElseThrow(CategoryNotFoundException::new); - category.deleteContent(); + categoryRepository.deleteById(id); } } From fe0088ec14568b43ff0fd69ec83764a1c32b65d2 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 20 Sep 2022 23:00:38 +0900 Subject: [PATCH 011/148] =?UTF-8?q?docs[#2]=20:=20Category=20API=20Swagger?= =?UTF-8?q?=20=EB=AA=85=EC=84=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/presentation/CategoryController.java | 12 +++++++++++- src/main/java/com/server/hispath/docs/ApiDoc.java | 6 +++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/server/hispath/category/presentation/CategoryController.java b/src/main/java/com/server/hispath/category/presentation/CategoryController.java index 934897f..8dd3ed0 100644 --- a/src/main/java/com/server/hispath/category/presentation/CategoryController.java +++ b/src/main/java/com/server/hispath/category/presentation/CategoryController.java @@ -4,14 +4,17 @@ import java.util.stream.Collectors; import com.server.hispath.category.application.CategoryService; -import com.server.hispath.category.application.dto.CategoryContentDto; import com.server.hispath.category.application.dto.CategoryCUDto; +import com.server.hispath.category.application.dto.CategoryContentDto; import com.server.hispath.category.presentation.request.CategoryCURequest; import com.server.hispath.category.presentation.response.CategoryResponse; +import com.server.hispath.docs.ApiDoc; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.ApiOperation; + import lombok.RequiredArgsConstructor; @RestController @@ -21,13 +24,17 @@ public class CategoryController { private final CategoryService categoryService; + @PostMapping("/category") + @ApiOperation(value = ApiDoc.CATEGORY_CREATE) public ResponseEntity create(@RequestBody CategoryCURequest request) { Long savedId = categoryService.create(CategoryCUDto.of(request)); return ResponseEntity.ok(savedId); } + @GetMapping("/category/{id}") + @ApiOperation(value = ApiDoc.CATEGORY_READ) public ResponseEntity find(@PathVariable Long id) { CategoryContentDto dto = categoryService.findById(id); CategoryResponse response = CategoryResponse.from(dto); @@ -35,6 +42,7 @@ public ResponseEntity find(@PathVariable Long id) { } @GetMapping("/categories") + @ApiOperation(value = ApiDoc.CATEGORY_READ_ALL) public ResponseEntity> findAll() { List dtos = categoryService.findAll(); List responses = dtos.stream() @@ -44,6 +52,7 @@ public ResponseEntity> findAll() { } @PatchMapping("/category/{id}") + @ApiOperation(value = ApiDoc.CATEGORY_UPDATE) public ResponseEntity update(@PathVariable Long id, @RequestBody CategoryCURequest request) { CategoryContentDto dto = categoryService.update(id, CategoryCUDto.of(request)); CategoryResponse response = CategoryResponse.from(dto); @@ -52,6 +61,7 @@ public ResponseEntity update(@PathVariable Long id, @RequestBo } @DeleteMapping("/category/{id}") + @ApiOperation(value = ApiDoc.CATEGORY_DELETE) public ResponseEntity delete(@PathVariable Long id) { categoryService.delete(id); return ResponseEntity.ok(id); diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 0e1188e..93f24a4 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -9,5 +9,9 @@ public class ApiDoc { /* Activity 관련 API 명세 */ /* Category 관련 API 명세 */ - + public static final String CATEGORY_READ = "단일 카테고리 조회"; + public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; + public static final String CATEGORY_CREATE = "카테고리 생성"; + public static final String CATEGORY_UPDATE = "카테고리 수정"; + public static final String CATEGORY_DELETE = "카테고리 삭제"; } \ No newline at end of file From ca97fa84fd0ac691405bb06ada69bff59ef872ab Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 21 Sep 2022 10:50:47 +0900 Subject: [PATCH 012/148] =?UTF-8?q?feat[#2]=20:=20Activity=20Create=20API?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/ActivityService.java | 12 ++++++++++ .../application/dto/ActivityContentDto.java | 24 +++++++++++++++++++ .../hispath/activity/domain/Activity.java | 17 ++++++++++++- .../presentation/ActivityController.java | 17 +++++++++++++ .../request/ActivityCURequest.java | 16 +++++++++++++ .../java/com/server/hispath/docs/ApiDoc.java | 1 + 6 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index e1fa9db..b69f487 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -1,6 +1,11 @@ package com.server.hispath.activity.application; +import com.server.hispath.activity.application.dto.ActivityContentDto; +import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; +import com.server.hispath.category.domain.Category; +import com.server.hispath.category.domain.repository.CategoryRepository; +import com.server.hispath.exception.category.CategoryNotFoundException; import org.springframework.stereotype.Service; @@ -11,5 +16,12 @@ public class ActivityService { private final ActivityRepository activityRepository; + private final CategoryRepository categoryRepository; + public Long create(Long categoryId, ActivityContentDto dto) { + Category category = categoryRepository.findById(categoryId).orElseThrow(CategoryNotFoundException::new); + Activity activity = Activity.from(category, dto); + Activity savedActivity = activityRepository.save(activity); + return savedActivity.getId(); + } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java new file mode 100644 index 0000000..b5a8c3e --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java @@ -0,0 +1,24 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.activity.presentation.request.ActivityCURequest; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ActivityContentDto { + + private String semester; + private boolean personal; + private int requestStatus; + private String data; + + public static ActivityContentDto from(ActivityCURequest request){ + return new ActivityContentDto(request.getSemester(), request.isPersonal(), request.getRequestStatus(), request.getData()); + } +} diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 4ee2322..0d75939 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -4,10 +4,13 @@ import java.util.List; import javax.persistence.*; +import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.category.domain.Category; import com.server.hispath.common.BaseEntity; import com.server.hispath.student.domain.participate.Participant; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; @@ -15,7 +18,9 @@ @Entity @Getter +@Builder @NoArgsConstructor +@AllArgsConstructor @Where(clause = "deleted = false") @SQLDelete(sql = "UPDATE activity SET deleted = true Where id = ?") public class Activity extends BaseEntity { @@ -33,8 +38,18 @@ public class Activity extends BaseEntity { private int requestStatus; - private String date; + private String data; @OneToMany(mappedBy = "activity") private List participants = new ArrayList<>(); + + public static Activity from(Category category, ActivityContentDto dto) { + return Activity.builder() + .category(category) + .semester(dto.getSemester()) + .personel(dto.isPersonal()) + .requestStatus(dto.getRequestStatus()) + .data(dto.getData()) + .build(); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index 93d5630..2b0cd4c 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -1,13 +1,30 @@ package com.server.hispath.activity.presentation; import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.application.dto.ActivityContentDto; +import com.server.hispath.activity.presentation.request.ActivityCURequest; +import com.server.hispath.docs.ApiDoc; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import io.swagger.annotations.ApiOperation; + import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor +@RequestMapping("/api") public class ActivityController { private final ActivityService activityService; + + @PostMapping("/activity") + @ApiOperation(value = ApiDoc.ACTIVITY_CREATE) + public ResponseEntity create(@RequestBody ActivityCURequest request) { + Long id = activityService.create(request.getCategoryId(), ActivityContentDto.from(request)); + return ResponseEntity.ok(id); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java new file mode 100644 index 0000000..9e61e43 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java @@ -0,0 +1,16 @@ +package com.server.hispath.activity.presentation.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class ActivityCURequest { + private Long categoryId; + private String semester; + private boolean personal; + private int requestStatus; + private String data; +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 93f24a4..c4473f3 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -7,6 +7,7 @@ public class ApiDoc { /* Activity 관련 API 명세 */ + public static final String ACTIVITY_CREATE = "단일 활동 생성"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; From a1d7946579c2e4b40eaa44ff7a8f3dceeb1fcef5 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 21 Sep 2022 14:25:51 +0900 Subject: [PATCH 013/148] =?UTF-8?q?feat[#2]=20:=20Activity=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/ActivityService.java | 22 +++++++++++++ .../activity/application/dto/ActivityDto.java | 24 ++++++++++++++ .../hispath/activity/domain/Activity.java | 7 +++-- .../presentation/ActivityController.java | 31 ++++++++++++++++--- .../response/ActivityResponse.java | 25 +++++++++++++++ .../category/application/dto/CategoryDto.java | 21 +++++++++++++ .../java/com/server/hispath/docs/ApiDoc.java | 2 ++ 7 files changed, 126 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java create mode 100644 src/main/java/com/server/hispath/category/application/dto/CategoryDto.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index b69f487..1a6be1b 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -1,12 +1,18 @@ package com.server.hispath.activity.application; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.activity.application.dto.ActivityContentDto; +import com.server.hispath.activity.application.dto.ActivityDto; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.category.domain.Category; import com.server.hispath.category.domain.repository.CategoryRepository; +import com.server.hispath.exception.activity.ActivityNotFoundException; import com.server.hispath.exception.category.CategoryNotFoundException; +import org.springframework.data.crossstore.ChangeSetPersister; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; @@ -24,4 +30,20 @@ public Long create(Long categoryId, ActivityContentDto dto) { Activity savedActivity = activityRepository.save(activity); return savedActivity.getId(); } + + public ActivityDto find(Long id) { + Activity activity = this.findById(id); + return ActivityDto.from(activity); + } + + private Activity findById(Long id) { + return activityRepository.findById(id).orElseThrow(ActivityNotFoundException::new); + } + + public List findAll() { + List activities = activityRepository.findAll(); + return activities.stream() + .map(ActivityDto::from) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java new file mode 100644 index 0000000..74f6df7 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java @@ -0,0 +1,24 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.category.application.dto.CategoryDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ActivityDto { + private Long id; + private CategoryDto categoryDto; + private String semester; + private boolean personal; + private String data; + + public static ActivityDto from(Activity activity) { + return new ActivityDto(activity.getId(), CategoryDto.from(activity.getCategory()), + activity.getSemester(), activity.isPersonal(), activity.getData()); + } +} diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 0d75939..41f04e5 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -8,6 +8,7 @@ import com.server.hispath.category.domain.Category; import com.server.hispath.common.BaseEntity; import com.server.hispath.student.domain.participate.Participant; +import com.sun.istack.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; @@ -32,12 +33,14 @@ public class Activity extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) private Category category; + @NotNull private String semester; - private boolean personel; + private boolean personal; private int requestStatus; + @NotNull private String data; @OneToMany(mappedBy = "activity") @@ -47,7 +50,7 @@ public static Activity from(Category category, ActivityContentDto dto) { return Activity.builder() .category(category) .semester(dto.getSemester()) - .personel(dto.isPersonal()) + .personal(dto.isPersonal()) .requestStatus(dto.getRequestStatus()) .data(dto.getData()) .build(); diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index 2b0cd4c..ded4374 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -1,15 +1,17 @@ package com.server.hispath.activity.presentation; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.dto.ActivityContentDto; +import com.server.hispath.activity.application.dto.ActivityDto; import com.server.hispath.activity.presentation.request.ActivityCURequest; +import com.server.hispath.activity.presentation.response.ActivityResponse; import com.server.hispath.docs.ApiDoc; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import io.swagger.annotations.ApiOperation; @@ -27,4 +29,25 @@ public ResponseEntity create(@RequestBody ActivityCURequest request) { Long id = activityService.create(request.getCategoryId(), ActivityContentDto.from(request)); return ResponseEntity.ok(id); } + + @GetMapping("/activity/{id}") + @ApiOperation(value = ApiDoc.ACTIVITY_READ) + public ResponseEntity find(@PathVariable Long id) { + + ActivityResponse response = ActivityResponse.from(activityService.find(id)); + return ResponseEntity.ok(response); + + } + + @GetMapping("/activities") + @ApiOperation(value = ApiDoc.ACTIVITY_READ_ALL) + public ResponseEntity> findAll() { + + List responses = activityService.findAll() + .stream() + .map(ActivityResponse::from) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java new file mode 100644 index 0000000..07985bf --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java @@ -0,0 +1,25 @@ +package com.server.hispath.activity.presentation.response; + +import com.server.hispath.activity.application.dto.ActivityDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ActivityResponse { + private Long id; + private Long categoryId; + private String categoryName; + private String semester; + private boolean personal; + private String data; + + public static ActivityResponse from(ActivityDto dto) { + return new ActivityResponse(dto.getId(), dto.getCategoryDto().getId(), dto.getCategoryDto().getName(), + dto.getSemester(), dto.isPersonal(), dto.getData()); + } +} diff --git a/src/main/java/com/server/hispath/category/application/dto/CategoryDto.java b/src/main/java/com/server/hispath/category/application/dto/CategoryDto.java new file mode 100644 index 0000000..2f96fa6 --- /dev/null +++ b/src/main/java/com/server/hispath/category/application/dto/CategoryDto.java @@ -0,0 +1,21 @@ +package com.server.hispath.category.application.dto; + +import com.server.hispath.category.domain.ActivityType; +import com.server.hispath.category.domain.Category; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class CategoryDto { + private Long id; + private String type; + private String name; + + public static CategoryDto from(Category category) { + return new CategoryDto(category.getId(), category.getType().name(), category.getName()); + } +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index c4473f3..6a81c7c 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -8,6 +8,8 @@ public class ApiDoc { /* Activity 관련 API 명세 */ public static final String ACTIVITY_CREATE = "단일 활동 생성"; + public static final String ACTIVITY_READ = "단일 활동 조회"; + public static final String ACTIVITY_READ_ALL = "모든 활동 조회"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; From e973d86b978b5ec04803e1f7559826967c1bdd4c Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 21 Sep 2022 14:38:30 +0900 Subject: [PATCH 014/148] =?UTF-8?q?feat[#2]=20:=20Activity=20update=20API?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/ActivityService.java | 30 +++++++++++++------ .../hispath/activity/domain/Activity.java | 8 +++++ .../presentation/ActivityController.java | 9 ++++++ .../category/application/CategoryService.java | 8 +++-- .../presentation/CategoryController.java | 2 +- .../java/com/server/hispath/docs/ApiDoc.java | 2 ++ 6 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index 1a6be1b..b5bcf97 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -7,13 +7,12 @@ import com.server.hispath.activity.application.dto.ActivityDto; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; +import com.server.hispath.category.application.CategoryService; import com.server.hispath.category.domain.Category; -import com.server.hispath.category.domain.repository.CategoryRepository; import com.server.hispath.exception.activity.ActivityNotFoundException; -import com.server.hispath.exception.category.CategoryNotFoundException; -import org.springframework.data.crossstore.ChangeSetPersister; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; @@ -22,28 +21,41 @@ public class ActivityService { private final ActivityRepository activityRepository; - private final CategoryRepository categoryRepository; + private final CategoryService categoryService; + @Transactional public Long create(Long categoryId, ActivityContentDto dto) { - Category category = categoryRepository.findById(categoryId).orElseThrow(CategoryNotFoundException::new); + Category category = categoryService.findById(categoryId); Activity activity = Activity.from(category, dto); Activity savedActivity = activityRepository.save(activity); return savedActivity.getId(); } - + @Transactional(readOnly = true) public ActivityDto find(Long id) { Activity activity = this.findById(id); return ActivityDto.from(activity); } - private Activity findById(Long id) { - return activityRepository.findById(id).orElseThrow(ActivityNotFoundException::new); - } + + @Transactional(readOnly = true) public List findAll() { List activities = activityRepository.findAll(); return activities.stream() .map(ActivityDto::from) .collect(Collectors.toList()); } + + @Transactional + public ActivityDto update(Long id, Long categoryId, ActivityContentDto dto){ + Activity activity = this.findById(id); + Category category = categoryService.findById(categoryId); + activity.update(category, dto); + + return ActivityDto.from(activity); + } + + private Activity findById(Long id) { + return activityRepository.findById(id).orElseThrow(ActivityNotFoundException::new); + } } diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 41f04e5..b21b85d 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -55,4 +55,12 @@ public static Activity from(Category category, ActivityContentDto dto) { .data(dto.getData()) .build(); } + + public void update(Category category, ActivityContentDto dto){ + this.category = category; + this.semester = dto.getSemester(); + this.personal = dto.isPersonal(); + this.requestStatus = dto.getRequestStatus(); + this.data = dto.getData(); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index ded4374..ac42747 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -50,4 +50,13 @@ public ResponseEntity> findAll() { return ResponseEntity.ok(responses); } + + @PatchMapping("/activity/{id}") + @ApiOperation(value = ApiDoc.ACTIVITY_UPDATE) + public ResponseEntity update(@PathVariable Long id, @RequestBody ActivityCURequest request) { + ActivityDto dto = activityService.update(id, request.getCategoryId(), ActivityContentDto.from(request)); + ActivityResponse response = ActivityResponse.from(dto); + + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/com/server/hispath/category/application/CategoryService.java b/src/main/java/com/server/hispath/category/application/CategoryService.java index 89c3bf3..0b52862 100644 --- a/src/main/java/com/server/hispath/category/application/CategoryService.java +++ b/src/main/java/com/server/hispath/category/application/CategoryService.java @@ -27,8 +27,8 @@ public Long create(CategoryCUDto dto) { } @Transactional(readOnly = true) - public CategoryContentDto findById(Long id) { - Category category = categoryRepository.findById(id).orElseThrow(CategoryNotFoundException::new); + public CategoryContentDto find(Long id) { + Category category = this.findById(id); return CategoryContentDto.from(category); } @@ -51,4 +51,8 @@ public CategoryContentDto update(Long id, CategoryCUDto dto){ public void delete(Long id){ categoryRepository.deleteById(id); } + + public Category findById(Long id){ + return categoryRepository.findById(id).orElseThrow(CategoryNotFoundException::new); + } } diff --git a/src/main/java/com/server/hispath/category/presentation/CategoryController.java b/src/main/java/com/server/hispath/category/presentation/CategoryController.java index 8dd3ed0..fe812e8 100644 --- a/src/main/java/com/server/hispath/category/presentation/CategoryController.java +++ b/src/main/java/com/server/hispath/category/presentation/CategoryController.java @@ -36,7 +36,7 @@ public ResponseEntity create(@RequestBody CategoryCURequest request) { @GetMapping("/category/{id}") @ApiOperation(value = ApiDoc.CATEGORY_READ) public ResponseEntity find(@PathVariable Long id) { - CategoryContentDto dto = categoryService.findById(id); + CategoryContentDto dto = categoryService.find(id); CategoryResponse response = CategoryResponse.from(dto); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 6a81c7c..9325290 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -10,6 +10,8 @@ public class ApiDoc { public static final String ACTIVITY_CREATE = "단일 활동 생성"; public static final String ACTIVITY_READ = "단일 활동 조회"; public static final String ACTIVITY_READ_ALL = "모든 활동 조회"; + public static final String ACTIVITY_UPDATE = "활동 수정"; + public static final String ACTIVITY_DELETE = "활동 삭제"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; From 6dd6934988b230a6735e382320db79462f27a3cf Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 21 Sep 2022 14:40:39 +0900 Subject: [PATCH 015/148] =?UTF-8?q?feat[#2]=20:=20Activity=20Delete=20API?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/activity/application/ActivityService.java | 5 +++++ .../hispath/activity/presentation/ActivityController.java | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index b5bcf97..d0ebcba 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -55,6 +55,11 @@ public ActivityDto update(Long id, Long categoryId, ActivityContentDto dto){ return ActivityDto.from(activity); } + @Transactional + public void delete(Long id){ + activityRepository.deleteById(id); + } + private Activity findById(Long id) { return activityRepository.findById(id).orElseThrow(ActivityNotFoundException::new); } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index ac42747..5933219 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -59,4 +59,11 @@ public ResponseEntity update(@PathVariable Long id, @RequestBo return ResponseEntity.ok(response); } + + @DeleteMapping("/activity/{id}") + @ApiOperation(value = ApiDoc.ACTIVITY_DELETE) + public ResponseEntity delete(@PathVariable Long id) { + activityService.delete(id); + return ResponseEntity.ok(id); + } } From deda0be41ec3fb5ccd4c6a7e8827d78fcefbf476 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 27 Sep 2022 18:45:59 +0900 Subject: [PATCH 016/148] =?UTF-8?q?fix[#4]=20:=20domain=20entity=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/server/hispath/activity/domain/Activity.java | 5 ----- .../hispath/student/domain/participate/Participant.java | 2 ++ 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index b21b85d..46596a9 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -40,9 +40,6 @@ public class Activity extends BaseEntity { private int requestStatus; - @NotNull - private String data; - @OneToMany(mappedBy = "activity") private List participants = new ArrayList<>(); @@ -52,7 +49,6 @@ public static Activity from(Category category, ActivityContentDto dto) { .semester(dto.getSemester()) .personal(dto.isPersonal()) .requestStatus(dto.getRequestStatus()) - .data(dto.getData()) .build(); } @@ -61,6 +57,5 @@ public void update(Category category, ActivityContentDto dto){ this.semester = dto.getSemester(); this.personal = dto.isPersonal(); this.requestStatus = dto.getRequestStatus(); - this.data = dto.getData(); } } diff --git a/src/main/java/com/server/hispath/student/domain/participate/Participant.java b/src/main/java/com/server/hispath/student/domain/participate/Participant.java index 9bcbfec..f0b4533 100644 --- a/src/main/java/com/server/hispath/student/domain/participate/Participant.java +++ b/src/main/java/com/server/hispath/student/domain/participate/Participant.java @@ -27,4 +27,6 @@ public class Participant extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) private Activity activity; + + String data; } From eb04035bf7b6e3731d723c3cb561c7dde8a7f244 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 27 Sep 2022 18:46:17 +0900 Subject: [PATCH 017/148] =?UTF-8?q?fix[#4]=20:=20data=20=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=ED=95=98=EB=A9=B0=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=EC=97=90=20=EB=A7=8C=EB=93=A4=EC=97=88=EB=8D=98=20API=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/activity/application/dto/ActivityContentDto.java | 3 +-- .../server/hispath/activity/application/dto/ActivityDto.java | 3 +-- .../activity/presentation/request/ActivityCURequest.java | 1 - .../activity/presentation/response/ActivityResponse.java | 4 +--- 4 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java index b5a8c3e..e6432cd 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java @@ -16,9 +16,8 @@ public class ActivityContentDto { private String semester; private boolean personal; private int requestStatus; - private String data; public static ActivityContentDto from(ActivityCURequest request){ - return new ActivityContentDto(request.getSemester(), request.isPersonal(), request.getRequestStatus(), request.getData()); + return new ActivityContentDto(request.getSemester(), request.isPersonal(), request.getRequestStatus()); } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java index 74f6df7..57b7017 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java @@ -15,10 +15,9 @@ public class ActivityDto { private CategoryDto categoryDto; private String semester; private boolean personal; - private String data; public static ActivityDto from(Activity activity) { return new ActivityDto(activity.getId(), CategoryDto.from(activity.getCategory()), - activity.getSemester(), activity.isPersonal(), activity.getData()); + activity.getSemester(), activity.isPersonal()); } } diff --git a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java index 9e61e43..021d195 100644 --- a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java +++ b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java @@ -12,5 +12,4 @@ public class ActivityCURequest { private String semester; private boolean personal; private int requestStatus; - private String data; } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java index 07985bf..9ac6d16 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java @@ -5,7 +5,6 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; @Getter @NoArgsConstructor @@ -16,10 +15,9 @@ public class ActivityResponse { private String categoryName; private String semester; private boolean personal; - private String data; public static ActivityResponse from(ActivityDto dto) { return new ActivityResponse(dto.getId(), dto.getCategoryDto().getId(), dto.getCategoryDto().getName(), - dto.getSemester(), dto.isPersonal(), dto.getData()); + dto.getSemester(), dto.isPersonal()); } } From dacd7c0f0275917a9238fe8106c6e74d35d6e010 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 27 Sep 2022 19:48:17 +0900 Subject: [PATCH 018/148] =?UTF-8?q?feat[#4]=20:=20entity=EC=9D=98=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9D=84=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20API=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/ActivityContentDto.java | 11 +++++++++-- .../activity/application/dto/ActivityDto.java | 10 ++++++++-- .../hispath/activity/domain/Activity.java | 19 ++++++++++++++++++- .../request/ActivityCURequest.java | 6 ++++++ .../response/ActivityResponse.java | 8 +++++++- .../application/dto/CategoryCUDto.java | 4 +--- .../category/application/dto/CategoryDto.java | 4 +--- .../hispath/category/domain/ActivityType.java | 5 ----- .../hispath/category/domain/Category.java | 4 ---- .../request/CategoryCURequest.java | 1 - 10 files changed, 50 insertions(+), 22 deletions(-) delete mode 100644 src/main/java/com/server/hispath/category/domain/ActivityType.java diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java index e6432cd..2c3b7e7 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java @@ -1,5 +1,7 @@ package com.server.hispath.activity.application.dto; +import java.time.LocalDateTime; + import com.server.hispath.activity.presentation.request.ActivityCURequest; import lombok.AllArgsConstructor; @@ -16,8 +18,13 @@ public class ActivityContentDto { private String semester; private boolean personal; private int requestStatus; + private String name; + private int weight; + private LocalDateTime startDate; + private LocalDateTime endDate; - public static ActivityContentDto from(ActivityCURequest request){ - return new ActivityContentDto(request.getSemester(), request.isPersonal(), request.getRequestStatus()); + public static ActivityContentDto from(ActivityCURequest request) { + return new ActivityContentDto(request.getSemester(), request.isPersonal(), request.getRequestStatus(), + request.getName(), request.getWeight(), request.getStartDate(), request.getEndDate()); } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java index 57b7017..2d7c230 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java @@ -1,5 +1,7 @@ package com.server.hispath.activity.application.dto; +import java.time.LocalDateTime; + import com.server.hispath.activity.domain.Activity; import com.server.hispath.category.application.dto.CategoryDto; @@ -15,9 +17,13 @@ public class ActivityDto { private CategoryDto categoryDto; private String semester; private boolean personal; + private String name; + private int weight; + private LocalDateTime startDate; + private LocalDateTime endDate; public static ActivityDto from(Activity activity) { - return new ActivityDto(activity.getId(), CategoryDto.from(activity.getCategory()), - activity.getSemester(), activity.isPersonal()); + return new ActivityDto(activity.getId(), CategoryDto.from(activity.getCategory()), activity.getSemester(), + activity.isPersonal(), activity.getName(), activity.getWeight(), activity.getStartDate(), activity.getEndDate()); } } diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 46596a9..e5ae620 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -1,5 +1,6 @@ package com.server.hispath.activity.domain; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import javax.persistence.*; @@ -40,6 +41,14 @@ public class Activity extends BaseEntity { private int requestStatus; + private String name; + + private LocalDateTime startDate; + + private LocalDateTime endDate; + + int weight; + @OneToMany(mappedBy = "activity") private List participants = new ArrayList<>(); @@ -49,13 +58,21 @@ public static Activity from(Category category, ActivityContentDto dto) { .semester(dto.getSemester()) .personal(dto.isPersonal()) .requestStatus(dto.getRequestStatus()) + .name(dto.getName()) + .weight(dto.getWeight()) + .startDate(dto.getStartDate()) + .endDate(dto.getEndDate()) .build(); } - public void update(Category category, ActivityContentDto dto){ + public void update(Category category, ActivityContentDto dto) { this.category = category; this.semester = dto.getSemester(); this.personal = dto.isPersonal(); this.requestStatus = dto.getRequestStatus(); + this.name = dto.getName(); + this.weight = dto.getWeight(); + this.startDate = dto.getStartDate(); + this.endDate = dto.getEndDate(); } } diff --git a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java index 021d195..69969cd 100644 --- a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java +++ b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java @@ -1,5 +1,7 @@ package com.server.hispath.activity.presentation.request; +import java.time.LocalDateTime; + import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -12,4 +14,8 @@ public class ActivityCURequest { private String semester; private boolean personal; private int requestStatus; + private String name; + private int weight; + private LocalDateTime startDate; + private LocalDateTime endDate; } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java index 9ac6d16..11a838f 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java @@ -1,5 +1,7 @@ package com.server.hispath.activity.presentation.response; +import java.time.LocalDateTime; + import com.server.hispath.activity.application.dto.ActivityDto; import lombok.AllArgsConstructor; @@ -15,9 +17,13 @@ public class ActivityResponse { private String categoryName; private String semester; private boolean personal; + private String name; + private int weight; + private LocalDateTime startDate; + private LocalDateTime endDate; public static ActivityResponse from(ActivityDto dto) { return new ActivityResponse(dto.getId(), dto.getCategoryDto().getId(), dto.getCategoryDto().getName(), - dto.getSemester(), dto.isPersonal()); + dto.getSemester(), dto.isPersonal(), dto.getName(), dto.getWeight(), dto.getStartDate(), dto.getEndDate()); } } diff --git a/src/main/java/com/server/hispath/category/application/dto/CategoryCUDto.java b/src/main/java/com/server/hispath/category/application/dto/CategoryCUDto.java index 31c5e82..48cf416 100644 --- a/src/main/java/com/server/hispath/category/application/dto/CategoryCUDto.java +++ b/src/main/java/com/server/hispath/category/application/dto/CategoryCUDto.java @@ -1,6 +1,5 @@ package com.server.hispath.category.application.dto; -import com.server.hispath.category.domain.ActivityType; import com.server.hispath.category.presentation.request.CategoryCURequest; import lombok.AllArgsConstructor; @@ -11,10 +10,9 @@ @NoArgsConstructor @AllArgsConstructor public class CategoryCUDto { - private ActivityType type; private String name; public static CategoryCUDto of(CategoryCURequest request) { - return new CategoryCUDto(ActivityType.valueOf(request.getType()), request.getName()); + return new CategoryCUDto(request.getName()); } } diff --git a/src/main/java/com/server/hispath/category/application/dto/CategoryDto.java b/src/main/java/com/server/hispath/category/application/dto/CategoryDto.java index 2f96fa6..af853c1 100644 --- a/src/main/java/com/server/hispath/category/application/dto/CategoryDto.java +++ b/src/main/java/com/server/hispath/category/application/dto/CategoryDto.java @@ -1,6 +1,5 @@ package com.server.hispath.category.application.dto; -import com.server.hispath.category.domain.ActivityType; import com.server.hispath.category.domain.Category; import lombok.AllArgsConstructor; @@ -12,10 +11,9 @@ @AllArgsConstructor public class CategoryDto { private Long id; - private String type; private String name; public static CategoryDto from(Category category) { - return new CategoryDto(category.getId(), category.getType().name(), category.getName()); + return new CategoryDto(category.getId(), category.getName()); } } diff --git a/src/main/java/com/server/hispath/category/domain/ActivityType.java b/src/main/java/com/server/hispath/category/domain/ActivityType.java deleted file mode 100644 index 78d1e50..0000000 --- a/src/main/java/com/server/hispath/category/domain/ActivityType.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.server.hispath.category.domain; - -public enum ActivityType { - MILEAGE_ACTIVITY, PROJECT -} diff --git a/src/main/java/com/server/hispath/category/domain/Category.java b/src/main/java/com/server/hispath/category/domain/Category.java index 8aab04f..8c41863 100644 --- a/src/main/java/com/server/hispath/category/domain/Category.java +++ b/src/main/java/com/server/hispath/category/domain/Category.java @@ -33,17 +33,13 @@ public class Category extends BaseEntity { @OneToMany(mappedBy = "category") private List activities = new ArrayList<>(); - @Enumerated(EnumType.STRING) - private ActivityType type; public void update(CategoryCUDto dto) { - this.type = dto.getType(); this.name = dto.getName(); } public static Category from(CategoryCUDto dto) { return Category.builder() - .type(dto.getType()) .name(dto.getName()) .build(); } diff --git a/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java b/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java index 000540b..d791bca 100644 --- a/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java +++ b/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java @@ -8,6 +8,5 @@ @Setter @NoArgsConstructor public class CategoryCURequest { - private String type; private String name; } From 2a5039960f061baefb295945fc746266abcf1df2 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 27 Sep 2022 23:38:26 +0900 Subject: [PATCH 019/148] =?UTF-8?q?feat[#7]=20:=20=EB=A7=88=EC=9D=BC?= =?UTF-8?q?=EB=A6=AC=EC=A7=80=20=EB=8B=A8=EC=9D=BC=20=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/MActivityService.java | 27 ++++++++++++++++ .../application/dto/MActivityContentDto.java | 26 ++++++++++++++++ .../hispath/activity/domain/Activity.java | 14 +++++++++ .../presentation/MActivityController.java | 31 +++++++++++++++++++ .../request/MActivityCURequest.java | 20 ++++++++++++ .../java/com/server/hispath/docs/ApiDoc.java | 2 +- 6 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/server/hispath/activity/application/MActivityService.java create mode 100644 src/main/java/com/server/hispath/activity/application/dto/MActivityContentDto.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/MActivityController.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java new file mode 100644 index 0000000..5c31659 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -0,0 +1,27 @@ +package com.server.hispath.activity.application; + +import com.server.hispath.activity.application.dto.MActivityContentDto; +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.activity.domain.repository.ActivityRepository; +import com.server.hispath.category.application.CategoryService; +import com.server.hispath.category.domain.Category; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class MActivityService { + private final ActivityRepository activityRepository; + private final CategoryService categoryService; + + @Transactional + public Long create(Long categoryId, MActivityContentDto dto) { + Category category = categoryService.findById(categoryId); + Activity activity = Activity.from(category, dto); + Activity savedActivity = activityRepository.save(activity); + return savedActivity.getId(); + } +} diff --git a/src/main/java/com/server/hispath/activity/application/dto/MActivityContentDto.java b/src/main/java/com/server/hispath/activity/application/dto/MActivityContentDto.java new file mode 100644 index 0000000..748b3a3 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/MActivityContentDto.java @@ -0,0 +1,26 @@ +package com.server.hispath.activity.application.dto; + +import java.time.LocalDateTime; + +import com.server.hispath.activity.presentation.request.MActivityCURequest; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class MActivityContentDto { + private String semester; + private String name; + private String remark; + private int weight; + private LocalDateTime startDate; + private LocalDateTime endDate; + + public static MActivityContentDto of(MActivityCURequest request) { + return new MActivityContentDto(request.getSemester(), request.getName(), request.getRemark(), + request.getWeight(), request.getStartDate(), request.getEndDate()); + } +} diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index e5ae620..3ba0094 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -6,6 +6,7 @@ import javax.persistence.*; import com.server.hispath.activity.application.dto.ActivityContentDto; +import com.server.hispath.activity.application.dto.MActivityContentDto; import com.server.hispath.category.domain.Category; import com.server.hispath.common.BaseEntity; import com.server.hispath.student.domain.participate.Participant; @@ -65,6 +66,19 @@ public static Activity from(Category category, ActivityContentDto dto) { .build(); } + public static Activity from(Category category, MActivityContentDto dto) { + return Activity.builder() + .category(category) + .semester(dto.getSemester()) + .personal(false) + .requestStatus(1) + .name(dto.getName()) + .weight(dto.getWeight()) + .startDate(dto.getStartDate()) + .endDate(dto.getEndDate()) + .build(); + } + public void update(Category category, ActivityContentDto dto) { this.category = category; this.semester = dto.getSemester(); diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java new file mode 100644 index 0000000..99f32e1 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -0,0 +1,31 @@ +package com.server.hispath.activity.presentation; + +import com.server.hispath.activity.application.MActivityService; +import com.server.hispath.activity.application.dto.MActivityContentDto; +import com.server.hispath.activity.presentation.request.MActivityCURequest; +import com.server.hispath.docs.ApiDoc; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import io.swagger.annotations.ApiOperation; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +public class MActivityController { + + private final MActivityService mActivityService; + + @PostMapping("/mileage") + @ApiOperation(value = ApiDoc.MILEAGE_CREATE) + public ResponseEntity create(@RequestBody MActivityCURequest request) { + Long id = mActivityService.create(request.getCategoryId(), MActivityContentDto.of(request)); + return ResponseEntity.ok(id); + } +} diff --git a/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java new file mode 100644 index 0000000..4000f65 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java @@ -0,0 +1,20 @@ +package com.server.hispath.activity.presentation.request; + +import java.time.LocalDateTime; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class MActivityCURequest { + private String semester; + private Long categoryId; + private String name; + private String remark; + private int weight; + private LocalDateTime startDate; + private LocalDateTime endDate; +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 9325290..f70e6b3 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -12,7 +12,7 @@ public class ApiDoc { public static final String ACTIVITY_READ_ALL = "모든 활동 조회"; public static final String ACTIVITY_UPDATE = "활동 수정"; public static final String ACTIVITY_DELETE = "활동 삭제"; - + public static final String MILEAGE_CREATE = "단일 마일리지 활동 등록"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; From 4ff2d9a64d79d80331dedafc5e199f3ff86bb888 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 27 Sep 2022 23:39:31 +0900 Subject: [PATCH 020/148] =?UTF-8?q?feat[#7]=20:=20poi=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=EB=9F=AC=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 엑셀 파일을 다루기 위해 poi 라이브러리를 추가하였다. --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index 36d54cd..237b604 100644 --- a/build.gradle +++ b/build.gradle @@ -23,6 +23,9 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'io.springfox:springfox-boot-starter:3.0.0' implementation 'ca.pjer:logback-awslogs-appender:1.6.0' + implementation group: 'org.apache.poi', name: 'poi', version: '4.1.2' + implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '4.1.2' + implementation group: 'commons-io', name: 'commons-io', version: '2.4' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' runtimeOnly 'mysql:mysql-connector-java' From 1797b2da0d865ad5b5ad2146279a6b2799ee89f2 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 00:02:23 +0900 Subject: [PATCH 021/148] =?UTF-8?q?feat[#7]=20:=20LocalDateTime=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EA=BC=B4=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/server/hispath/activity/domain/Activity.java | 3 +++ .../activity/presentation/request/ActivityCURequest.java | 5 +++++ .../activity/presentation/request/MActivityCURequest.java | 5 +++++ src/main/java/com/server/hispath/common/BaseEntity.java | 4 ++++ 4 files changed, 17 insertions(+) diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 3ba0094..4f37ca5 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -5,6 +5,7 @@ import java.util.List; import javax.persistence.*; +import com.fasterxml.jackson.annotation.JsonFormat; import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.activity.application.dto.MActivityContentDto; import com.server.hispath.category.domain.Category; @@ -44,8 +45,10 @@ public class Activity extends BaseEntity { private String name; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime startDate; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime endDate; int weight; diff --git a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java index 69969cd..5d5a076 100644 --- a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java +++ b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java @@ -2,6 +2,8 @@ import java.time.LocalDateTime; +import com.fasterxml.jackson.annotation.JsonFormat; + import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -16,6 +18,9 @@ public class ActivityCURequest { private int requestStatus; private String name; private int weight; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime startDate; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime endDate; } diff --git a/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java index 4000f65..77bf3cf 100644 --- a/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java +++ b/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java @@ -2,6 +2,8 @@ import java.time.LocalDateTime; +import com.fasterxml.jackson.annotation.JsonFormat; + import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -15,6 +17,9 @@ public class MActivityCURequest { private String name; private String remark; private int weight; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime startDate; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime endDate; } diff --git a/src/main/java/com/server/hispath/common/BaseEntity.java b/src/main/java/com/server/hispath/common/BaseEntity.java index 9b2e33f..34b830d 100644 --- a/src/main/java/com/server/hispath/common/BaseEntity.java +++ b/src/main/java/com/server/hispath/common/BaseEntity.java @@ -5,6 +5,8 @@ import javax.persistence.EntityListeners; import javax.persistence.MappedSuperclass; +import com.fasterxml.jackson.annotation.JsonFormat; + import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -18,9 +20,11 @@ @EntityListeners(AuditingEntityListener.class) public abstract class BaseEntity { + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") @CreatedDate private LocalDateTime createdAt; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") @LastModifiedDate private LocalDateTime updatedAt; From 9e6fa93baaa6344579129978c88aec3b9148e0c6 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 00:03:20 +0900 Subject: [PATCH 022/148] =?UTF-8?q?feat[#7]=20:=20LocalDatetime=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=EA=BC=B4=20=EB=B3=80=EA=B2=BD=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/presentation/response/ActivityResponse.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java index 11a838f..deeb792 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java @@ -2,6 +2,7 @@ import java.time.LocalDateTime; +import com.fasterxml.jackson.annotation.JsonFormat; import com.server.hispath.activity.application.dto.ActivityDto; import lombok.AllArgsConstructor; @@ -19,7 +20,9 @@ public class ActivityResponse { private boolean personal; private String name; private int weight; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime startDate; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") private LocalDateTime endDate; public static ActivityResponse from(ActivityDto dto) { From 76f79483ff302b11fbbf7824d16ddfb2de7a2d0d Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 00:12:26 +0900 Subject: [PATCH 023/148] =?UTF-8?q?feat[#7]=20:=20LocalDateTime=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20yymmdd=20hh:mm=20=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/server/hispath/activity/domain/Activity.java | 4 ++-- .../activity/presentation/request/ActivityCURequest.java | 4 ++-- .../activity/presentation/response/ActivityResponse.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 4f37ca5..449c89f 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -45,10 +45,10 @@ public class Activity extends BaseEntity { private String name; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") private LocalDateTime startDate; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") private LocalDateTime endDate; int weight; diff --git a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java index 5d5a076..9ef0477 100644 --- a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java +++ b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java @@ -19,8 +19,8 @@ public class ActivityCURequest { private String name; private int weight; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") private LocalDateTime startDate; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") private LocalDateTime endDate; } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java index deeb792..ef5283d 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java @@ -20,9 +20,9 @@ public class ActivityResponse { private boolean personal; private String name; private int weight; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") private LocalDateTime startDate; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") private LocalDateTime endDate; public static ActivityResponse from(ActivityDto dto) { From 7dd5155875793ed33057f8edd00138bda11a81b9 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 00:13:00 +0900 Subject: [PATCH 024/148] =?UTF-8?q?fix[#7]=20:=20=EB=8B=A8=EC=9D=BC=20?= =?UTF-8?q?=ED=99=9C=EB=8F=99=20=EB=93=B1=EB=A1=9D=20dto=EC=97=90=20catego?= =?UTF-8?q?ryId=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/activity/application/MActivityService.java | 4 ++-- .../activity/application/dto/MActivityContentDto.java | 5 +++-- .../hispath/activity/presentation/MActivityController.java | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index 5c31659..8c1c842 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -18,8 +18,8 @@ public class MActivityService { private final CategoryService categoryService; @Transactional - public Long create(Long categoryId, MActivityContentDto dto) { - Category category = categoryService.findById(categoryId); + public Long create(MActivityContentDto dto) { + Category category = categoryService.findById(dto.getCategoryId()); Activity activity = Activity.from(category, dto); Activity savedActivity = activityRepository.save(activity); return savedActivity.getId(); diff --git a/src/main/java/com/server/hispath/activity/application/dto/MActivityContentDto.java b/src/main/java/com/server/hispath/activity/application/dto/MActivityContentDto.java index 748b3a3..f842e47 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/MActivityContentDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/MActivityContentDto.java @@ -12,6 +12,7 @@ @NoArgsConstructor @AllArgsConstructor public class MActivityContentDto { + private Long categoryId; private String semester; private String name; private String remark; @@ -20,7 +21,7 @@ public class MActivityContentDto { private LocalDateTime endDate; public static MActivityContentDto of(MActivityCURequest request) { - return new MActivityContentDto(request.getSemester(), request.getName(), request.getRemark(), - request.getWeight(), request.getStartDate(), request.getEndDate()); + return new MActivityContentDto(request.getCategoryId(), request.getSemester(), request.getName(), + request.getRemark(), request.getWeight(), request.getStartDate(), request.getEndDate()); } } diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 99f32e1..27ab4cf 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -25,7 +25,7 @@ public class MActivityController { @PostMapping("/mileage") @ApiOperation(value = ApiDoc.MILEAGE_CREATE) public ResponseEntity create(@RequestBody MActivityCURequest request) { - Long id = mActivityService.create(request.getCategoryId(), MActivityContentDto.of(request)); + Long id = mActivityService.create(MActivityContentDto.of(request)); return ResponseEntity.ok(id); } } From 605ac8e888d7c3ec79503b89a34ed02889ef8eb2 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 00:54:10 +0900 Subject: [PATCH 025/148] =?UTF-8?q?feat[#7]=20:=20=EB=A7=88=EC=9D=BC?= =?UTF-8?q?=EB=A6=AC=EC=A7=80=20=EC=97=91=EC=85=80=20=EB=8B=A4=EC=A4=91?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/MActivityService.java | 13 ++++ .../presentation/MActivityController.java | 12 ++++ .../java/com/server/hispath/docs/ApiDoc.java | 1 + .../exception/common/CommonException.java | 11 +++ .../common/ExcelDataFormatException.java | 9 +++ .../common/ExcelFormatException.java | 9 +++ .../common/NotExcelExtensionException.java | 9 +++ .../com/server/hispath/util/ExcelManager.java | 67 +++++++++++++++++++ 8 files changed, 131 insertions(+) create mode 100644 src/main/java/com/server/hispath/exception/common/CommonException.java create mode 100644 src/main/java/com/server/hispath/exception/common/ExcelDataFormatException.java create mode 100644 src/main/java/com/server/hispath/exception/common/ExcelFormatException.java create mode 100644 src/main/java/com/server/hispath/exception/common/NotExcelExtensionException.java create mode 100644 src/main/java/com/server/hispath/util/ExcelManager.java diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index 8c1c842..916bc94 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -1,5 +1,8 @@ package com.server.hispath.activity.application; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.activity.application.dto.MActivityContentDto; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; @@ -24,4 +27,14 @@ public Long create(MActivityContentDto dto) { Activity savedActivity = activityRepository.save(activity); return savedActivity.getId(); } + + @Transactional + public void createAll(List dtos) { + List activities = dtos.stream() + .map(dto -> { + Category category = categoryService.findById(dto.getCategoryId()); + return Activity.from(category, dto); + }).collect(Collectors.toList()); + activityRepository.saveAll(activities); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 27ab4cf..4f27e82 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -1,15 +1,20 @@ package com.server.hispath.activity.presentation; +import java.util.List; + import com.server.hispath.activity.application.MActivityService; import com.server.hispath.activity.application.dto.MActivityContentDto; import com.server.hispath.activity.presentation.request.MActivityCURequest; import com.server.hispath.docs.ApiDoc; +import com.server.hispath.util.ExcelManager; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; import io.swagger.annotations.ApiOperation; @@ -28,4 +33,11 @@ public ResponseEntity create(@RequestBody MActivityCURequest request) { Long id = mActivityService.create(MActivityContentDto.of(request)); return ResponseEntity.ok(id); } + + @PostMapping("/mileages") + @ApiOperation(value = ApiDoc.MILEAGES_CREATE) + public ResponseEntity createMActivites(MultipartFile file) throws Exception { + mActivityService.createAll(ExcelManager.getMActivities(ExcelManager.extract(file))); + return ResponseEntity.ok(null); + } } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index f70e6b3..4ca7854 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -13,6 +13,7 @@ public class ApiDoc { public static final String ACTIVITY_UPDATE = "활동 수정"; public static final String ACTIVITY_DELETE = "활동 삭제"; public static final String MILEAGE_CREATE = "단일 마일리지 활동 등록"; + public static final String MILEAGES_CREATE = "단일 마일리지 다중 등록"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; diff --git a/src/main/java/com/server/hispath/exception/common/CommonException.java b/src/main/java/com/server/hispath/exception/common/CommonException.java new file mode 100644 index 0000000..b295bb3 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/common/CommonException.java @@ -0,0 +1,11 @@ +package com.server.hispath.exception.common; + +import com.server.hispath.exception.HisPathException; + +import org.springframework.http.HttpStatus; + +public class CommonException extends HisPathException { + public CommonException(String message, HttpStatus httpStatus) { + super(message, httpStatus); + } +} diff --git a/src/main/java/com/server/hispath/exception/common/ExcelDataFormatException.java b/src/main/java/com/server/hispath/exception/common/ExcelDataFormatException.java new file mode 100644 index 0000000..730d0bd --- /dev/null +++ b/src/main/java/com/server/hispath/exception/common/ExcelDataFormatException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.common; + +import org.springframework.http.HttpStatus; + +public class ExcelDataFormatException extends CommonException{ + public ExcelDataFormatException(String data) { + super("등록하려는 데이터의 양식에 문제가 있습니다.\n 문제되는 데이터 : " + data, HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/exception/common/ExcelFormatException.java b/src/main/java/com/server/hispath/exception/common/ExcelFormatException.java new file mode 100644 index 0000000..02cd485 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/common/ExcelFormatException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.common; + +import org.springframework.http.HttpStatus; + +public class ExcelFormatException extends CommonException{ + public ExcelFormatException(String msg) { + super("등록하려는 데이터의 양식에 문제가 있습니다. : " + msg, HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/exception/common/NotExcelExtensionException.java b/src/main/java/com/server/hispath/exception/common/NotExcelExtensionException.java new file mode 100644 index 0000000..4366c32 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/common/NotExcelExtensionException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.common; + +import org.springframework.http.HttpStatus; + +public class NotExcelExtensionException extends CommonException{ + public NotExcelExtensionException() { + super("Excel양식의 파일이 아닙니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/util/ExcelManager.java b/src/main/java/com/server/hispath/util/ExcelManager.java new file mode 100644 index 0000000..670e167 --- /dev/null +++ b/src/main/java/com/server/hispath/util/ExcelManager.java @@ -0,0 +1,67 @@ +package com.server.hispath.util; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +import com.server.hispath.activity.application.dto.MActivityContentDto; +import com.server.hispath.exception.common.ExcelDataFormatException; +import com.server.hispath.exception.common.ExcelFormatException; +import com.server.hispath.exception.common.NotExcelExtensionException; + +import org.springframework.web.multipart.MultipartFile; + +import org.apache.commons.io.FilenameUtils; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +public class ExcelManager { + + public static Sheet extract(MultipartFile file) throws Exception { + Workbook workbook = null; + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (extension.equals("xlsx")) { + workbook = new XSSFWorkbook(file.getInputStream()); + } else if (extension.equals("xls")) { + workbook = new HSSFWorkbook(file.getInputStream()); + } else { + throw new NotExcelExtensionException(); + } + + return workbook.cloneSheet(0); + } + + public void validate(String semester) { + String pattern = "[0-9]{4}-[0-9]"; + if (!Pattern.matches(pattern, semester)) + throw new ExcelDataFormatException(semester); + } + + public static List getMActivities(Sheet worksheet) { + List mActivityContentDtos = new ArrayList<>(); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + for (int i = 1; i < worksheet.getPhysicalNumberOfRows(); i++) { + try { + Row row = worksheet.getRow(i); + Long categoryId = Long.parseLong(row.getCell(0).toString().split("\\.")[0].toString()); + String activityName = row.getCell(1).toString(); + String remark = row.getCell(2).toString(); + + LocalDateTime startDate = LocalDateTime.parse(row.getCell(3).toString(), dateTimeFormatter); + LocalDateTime endDate = LocalDateTime.parse(row.getCell(4).toString(), dateTimeFormatter); + int weight = Integer.parseInt(row.getCell(5).toString()); + String semester = row.getCell(6).toString(); + mActivityContentDtos.add(new MActivityContentDto(categoryId, semester, activityName, remark, weight, startDate, endDate)); + } catch (Exception e) { + throw new ExcelFormatException(e.getMessage()); + } + + } + return mActivityContentDtos; + } +} From 449c3e7f9a730ea834d3727c19ed9e65b616c00e Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 01:06:16 +0900 Subject: [PATCH 026/148] =?UTF-8?q?feat[#7]=20:=20=EB=A7=88=EC=9D=BC?= =?UTF-8?q?=EB=A6=AC=EC=A7=80=20=ED=99=9C=EB=8F=99=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/MActivityService.java | 10 ++++++++++ .../hispath/activity/domain/Activity.java | 9 +++++++++ .../presentation/MActivityController.java | 18 ++++++++++++++---- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index 916bc94..f301e78 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -3,11 +3,13 @@ import java.util.List; import java.util.stream.Collectors; +import com.server.hispath.activity.application.dto.ActivityDto; import com.server.hispath.activity.application.dto.MActivityContentDto; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.category.application.CategoryService; import com.server.hispath.category.domain.Category; +import com.server.hispath.exception.activity.ActivityNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,4 +39,12 @@ public void createAll(List dtos) { }).collect(Collectors.toList()); activityRepository.saveAll(activities); } + + @Transactional + public ActivityDto update(Long id, MActivityContentDto dto){ + Activity activity = activityRepository.findById(id).orElseThrow(ActivityNotFoundException::new); + Category category = categoryService.findById(dto.getCategoryId()); + activity.update(category, dto); + return ActivityDto.from(activity); + } } diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 449c89f..8347421 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -92,4 +92,13 @@ public void update(Category category, ActivityContentDto dto) { this.startDate = dto.getStartDate(); this.endDate = dto.getEndDate(); } + + public void update(Category category, MActivityContentDto dto) { + this.category = category; + this.semester = dto.getSemester(); + this.name = dto.getName(); + this.weight = dto.getWeight(); + this.startDate = dto.getStartDate(); + this.endDate = dto.getEndDate(); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 4f27e82..63ffe16 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -3,17 +3,18 @@ import java.util.List; import com.server.hispath.activity.application.MActivityService; +import com.server.hispath.activity.application.dto.ActivityContentDto; +import com.server.hispath.activity.application.dto.ActivityDto; import com.server.hispath.activity.application.dto.MActivityContentDto; +import com.server.hispath.activity.presentation.request.ActivityCURequest; import com.server.hispath.activity.presentation.request.MActivityCURequest; +import com.server.hispath.activity.presentation.response.ActivityResponse; import com.server.hispath.docs.ApiDoc; import com.server.hispath.util.ExcelManager; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import io.swagger.annotations.ApiOperation; @@ -40,4 +41,13 @@ public ResponseEntity createMActivites(MultipartFile file) throws Exceptio mActivityService.createAll(ExcelManager.getMActivities(ExcelManager.extract(file))); return ResponseEntity.ok(null); } + + @PatchMapping("/mileage/{id}") + @ApiOperation(value = ApiDoc.ACTIVITY_UPDATE) + public ResponseEntity update(@PathVariable Long id, @RequestBody MActivityCURequest request) { + ActivityDto dto = mActivityService.update(id, MActivityContentDto.of(request)); + ActivityResponse response = ActivityResponse.from(dto); + + return ResponseEntity.ok(response); + } } From a8cf1087915e43da5d725c47fe0efcea32d9da6e Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 01:08:33 +0900 Subject: [PATCH 027/148] =?UTF-8?q?feat[#7]=20:=20mileage=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/presentation/MActivityController.java | 11 ++++++++++- src/main/java/com/server/hispath/docs/ApiDoc.java | 2 ++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 63ffe16..3ed70cb 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -2,6 +2,7 @@ import java.util.List; +import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.MActivityService; import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.activity.application.dto.ActivityDto; @@ -27,6 +28,7 @@ public class MActivityController { private final MActivityService mActivityService; + private final ActivityService activityService; @PostMapping("/mileage") @ApiOperation(value = ApiDoc.MILEAGE_CREATE) @@ -43,11 +45,18 @@ public ResponseEntity createMActivites(MultipartFile file) throws Exceptio } @PatchMapping("/mileage/{id}") - @ApiOperation(value = ApiDoc.ACTIVITY_UPDATE) + @ApiOperation(value = ApiDoc.MILEAGE_UPDATE) public ResponseEntity update(@PathVariable Long id, @RequestBody MActivityCURequest request) { ActivityDto dto = mActivityService.update(id, MActivityContentDto.of(request)); ActivityResponse response = ActivityResponse.from(dto); return ResponseEntity.ok(response); } + + @DeleteMapping("/mileage/{id}") + @ApiOperation(value = ApiDoc.MILEAGE_DELETE) + public ResponseEntity delete(@PathVariable Long id) { + activityService.delete(id); + return ResponseEntity.ok(id); + } } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 4ca7854..785183d 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -14,6 +14,8 @@ public class ApiDoc { public static final String ACTIVITY_DELETE = "활동 삭제"; public static final String MILEAGE_CREATE = "단일 마일리지 활동 등록"; public static final String MILEAGES_CREATE = "단일 마일리지 다중 등록"; + public static final String MILEAGE_UPDATE = "마일리지 활동 수정"; + public static final String MILEAGE_DELETE = "마일리지 활동 삭제"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; From 9f352685d41f4533e6ff111b911d6662d3533067 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 01:17:15 +0900 Subject: [PATCH 028/148] =?UTF-8?q?feat[#7]=20:=20=EB=A7=88=EC=9D=BC?= =?UTF-8?q?=EB=A6=AC=EC=A7=80=20=ED=99=9C=EB=8F=99=20=ED=95=99=EA=B8=B0?= =?UTF-8?q?=EB=B3=84=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/MActivityService.java | 10 +++++++++- .../domain/repository/ActivityRepository.java | 3 +++ .../activity/presentation/MActivityController.java | 11 +++++++++++ src/main/java/com/server/hispath/docs/ApiDoc.java | 1 + 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index f301e78..0770647 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -41,10 +41,18 @@ public void createAll(List dtos) { } @Transactional - public ActivityDto update(Long id, MActivityContentDto dto){ + public ActivityDto update(Long id, MActivityContentDto dto) { Activity activity = activityRepository.findById(id).orElseThrow(ActivityNotFoundException::new); Category category = categoryService.findById(dto.getCategoryId()); activity.update(category, dto); return ActivityDto.from(activity); } + + @Transactional(readOnly = true) + public List findAllBySemester(String semester) { + List activities = activityRepository.findAllBySemester(semester); + return activities.stream() + .map(ActivityDto::from) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java index cf2eb91..0646d6f 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -1,8 +1,11 @@ package com.server.hispath.activity.domain.repository; +import java.util.List; + import com.server.hispath.activity.domain.Activity; import org.springframework.data.jpa.repository.JpaRepository; public interface ActivityRepository extends JpaRepository { + List findAllBySemester(String semester); } diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 3ed70cb..54ffd42 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -1,6 +1,7 @@ package com.server.hispath.activity.presentation; import java.util.List; +import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.MActivityService; @@ -59,4 +60,14 @@ public ResponseEntity delete(@PathVariable Long id) { activityService.delete(id); return ResponseEntity.ok(id); } + + @GetMapping("/mileage/semester") + @ApiOperation(value = ApiDoc.MILEAGE_READ_SEMESTER) + public ResponseEntity> findAllBySemester(@RequestParam String semester) { + List activityDtos = mActivityService.findAllBySemester(semester); + List responses = activityDtos.stream() + .map(ActivityResponse::from) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 785183d..a70d061 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -16,6 +16,7 @@ public class ApiDoc { public static final String MILEAGES_CREATE = "단일 마일리지 다중 등록"; public static final String MILEAGE_UPDATE = "마일리지 활동 수정"; public static final String MILEAGE_DELETE = "마일리지 활동 삭제"; + public static final String MILEAGE_READ_SEMESTER = "마일리지 학기별 조회"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; From 2193f283202954156d5b3babb4259e563df24b05 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 14:42:59 +0900 Subject: [PATCH 029/148] =?UTF-8?q?feat[#7]=20:=20=EB=A7=88=EC=9D=BC?= =?UTF-8?q?=EB=A6=AC=EC=A7=80=20=EC=B0=B8=EA=B0=80=20=ED=99=9C=EB=8F=99=20?= =?UTF-8?q?=ED=95=99=EC=83=9D=20=EB=93=B1=EB=A1=9D=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20test=20ref=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/MActivityController.java | 4 +-- .../server/hispath/common/TestController.java | 33 +++++++++++++++++++ .../hispath/student/domain/Student.java | 4 +++ 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/server/hispath/common/TestController.java diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 54ffd42..0ad3df0 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -5,16 +5,13 @@ import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.MActivityService; -import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.activity.application.dto.ActivityDto; import com.server.hispath.activity.application.dto.MActivityContentDto; -import com.server.hispath.activity.presentation.request.ActivityCURequest; import com.server.hispath.activity.presentation.request.MActivityCURequest; import com.server.hispath.activity.presentation.response.ActivityResponse; import com.server.hispath.docs.ApiDoc; import com.server.hispath.util.ExcelManager; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -70,4 +67,5 @@ public ResponseEntity> findAllBySemester(@RequestParam St .collect(Collectors.toList()); return ResponseEntity.ok(responses); } + } diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java new file mode 100644 index 0000000..bf1ba38 --- /dev/null +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -0,0 +1,33 @@ +package com.server.hispath.common; + +import com.server.hispath.student.domain.Student; +import com.server.hispath.student.domain.repository.StudentRepository; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@ +@RequestMapping("/test") +public class TestController { + private final StudentRepository studentRepository; + + @GetMapping("/register/ref") + public ResponseEntity testRegisterRefStudent() { + for (int i = 0; i < 20; i++) { + String studentNum = Integer.toString(i); + String name = "학생" + i; + Student student = Student.builder() + .studentNum(studentNum) + .name(name) + .build(); + studentRepository.save(student); + } + return ResponseEntity.ok(null); + } +} diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index c40ba18..75fbb89 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -9,6 +9,8 @@ import com.server.hispath.major.domain.Major; import com.server.hispath.student.domain.participate.Participant; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; @@ -19,6 +21,8 @@ @NoArgsConstructor @Where(clause = "deleted = false") @SQLDelete(sql = "UPDATE student SET deleted = true Where id = ?") +@AllArgsConstructor +@Builder public class Student extends BaseEntity { @Id From e2299738c379dc7429f542acccbf90ee52e4b690 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 16:27:20 +0900 Subject: [PATCH 030/148] =?UTF-8?q?feat[#7]=20:=20=EB=A7=88=EC=9D=BC?= =?UTF-8?q?=EB=A6=AC=EC=A7=80=20=ED=99=9C=EB=8F=99=20=EC=B0=B8=EA=B0=80=20?= =?UTF-8?q?=ED=95=99=EC=83=9D=20=EB=93=B1=EB=A1=9D=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/ActivityService.java | 2 +- .../application/MActivityService.java | 6 ++++ .../hispath/activity/domain/Activity.java | 10 ++++++- .../presentation/MActivityController.java | 12 ++++++++ .../server/hispath/common/TestController.java | 28 ++++++++++++++++++- .../java/com/server/hispath/docs/ApiDoc.java | 1 + .../student/StudentDataNotMatchException.java | 9 ++++++ .../hispath/manager/domain/Manager.java | 2 +- .../student/application/StudentService.java | 26 ++++++++++++++++- .../application/dto/StudentRefDto.java | 16 +++++++++++ .../hispath/student/domain/Student.java | 12 +++++++- .../domain/participate/Participant.java | 7 ++++- .../domain/repository/StudentRepository.java | 4 +++ .../com/server/hispath/util/ExcelManager.java | 18 ++++++++++++ 14 files changed, 146 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/server/hispath/exception/student/StudentDataNotMatchException.java create mode 100644 src/main/java/com/server/hispath/student/application/dto/StudentRefDto.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index d0ebcba..d98e84f 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -60,7 +60,7 @@ public void delete(Long id){ activityRepository.deleteById(id); } - private Activity findById(Long id) { + public Activity findById(Long id) { return activityRepository.findById(id).orElseThrow(ActivityNotFoundException::new); } } diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index 0770647..12674a0 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -9,6 +9,7 @@ import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.category.application.CategoryService; import com.server.hispath.category.domain.Category; +import com.server.hispath.common.BaseEntity; import com.server.hispath.exception.activity.ActivityNotFoundException; import org.springframework.stereotype.Service; @@ -55,4 +56,9 @@ public List findAllBySemester(String semester) { .map(ActivityDto::from) .collect(Collectors.toList()); } + + @Transactional + public void deleteAllParticipant(Activity activity){ + activity.getParticipants().forEach(BaseEntity::deleteContent); + } } diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 8347421..98462cb 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -10,6 +10,7 @@ import com.server.hispath.activity.application.dto.MActivityContentDto; import com.server.hispath.category.domain.Category; import com.server.hispath.common.BaseEntity; +import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.participate.Participant; import com.sun.istack.NotNull; @@ -53,7 +54,7 @@ public class Activity extends BaseEntity { int weight; - @OneToMany(mappedBy = "activity") + @OneToMany(mappedBy = "activity", cascade = CascadeType.PERSIST, orphanRemoval = true) private List participants = new ArrayList<>(); public static Activity from(Category category, ActivityContentDto dto) { @@ -101,4 +102,11 @@ public void update(Category category, MActivityContentDto dto) { this.startDate = dto.getStartDate(); this.endDate = dto.getEndDate(); } + + public void addParticipant(Student student){ + Participant participant = new Participant(student, this); + + this.participants.add(participant); + student.addParticipant(participant); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 0ad3df0..977a146 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -10,6 +10,7 @@ import com.server.hispath.activity.presentation.request.MActivityCURequest; import com.server.hispath.activity.presentation.response.ActivityResponse; import com.server.hispath.docs.ApiDoc; +import com.server.hispath.student.application.StudentService; import com.server.hispath.util.ExcelManager; import org.springframework.http.ResponseEntity; @@ -27,6 +28,7 @@ public class MActivityController { private final MActivityService mActivityService; private final ActivityService activityService; + private final StudentService studentService; @PostMapping("/mileage") @ApiOperation(value = ApiDoc.MILEAGE_CREATE) @@ -68,4 +70,14 @@ public ResponseEntity> findAllBySemester(@RequestParam St return ResponseEntity.ok(responses); } + @PostMapping("/mileage/students") + @ApiOperation(value = ApiDoc.MILEAGE_REGISTER_STUDENTS) + public ResponseEntity registerStudents(@RequestPart(value = "file", required = false) MultipartFile file, + @RequestPart(value = "activityId") Long activityId) throws Exception { + + studentService.registerParticipants(activityId, ExcelManager.getStudentDatas(ExcelManager.extract(file))); + + return ResponseEntity.ok(null); + } + } diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index bf1ba38..b0bd747 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -1,5 +1,12 @@ package com.server.hispath.common; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.application.dto.ActivityContentDto; +import com.server.hispath.category.domain.Category; +import com.server.hispath.category.domain.repository.CategoryRepository; import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; @@ -12,10 +19,12 @@ @RestController @RequiredArgsConstructor -@ @RequestMapping("/test") public class TestController { + private final StudentRepository studentRepository; + private final CategoryRepository categoryRepository; + private final ActivityService activityService; @GetMapping("/register/ref") public ResponseEntity testRegisterRefStudent() { @@ -30,4 +39,21 @@ public ResponseEntity testRegisterRefStudent() { } return ResponseEntity.ok(null); } + + @GetMapping("/init") + public ResponseEntity testInit() { + categoryRepository.save(Category.builder() + .name("특강") + .build()); + categoryRepository.save(Category.builder() + .name("산학") + .build()); + categoryRepository.save(Category.builder() + .name("대회") + .build()); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); +// activityService.create(1L, new ActivityContentDto("2022-2", false, 1, +// "테스트특강", 3, + return ResponseEntity.ok(null); + } } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index a70d061..0b6dde2 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -17,6 +17,7 @@ public class ApiDoc { public static final String MILEAGE_UPDATE = "마일리지 활동 수정"; public static final String MILEAGE_DELETE = "마일리지 활동 삭제"; public static final String MILEAGE_READ_SEMESTER = "마일리지 학기별 조회"; + public static final String MILEAGE_REGISTER_STUDENTS = "마일리지 활동 참가 학생 엑셀 등록"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; diff --git a/src/main/java/com/server/hispath/exception/student/StudentDataNotMatchException.java b/src/main/java/com/server/hispath/exception/student/StudentDataNotMatchException.java new file mode 100644 index 0000000..879cd2c --- /dev/null +++ b/src/main/java/com/server/hispath/exception/student/StudentDataNotMatchException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.student; + +import org.springframework.http.HttpStatus; + +public class StudentDataNotMatchException extends StudentException { + public StudentDataNotMatchException(String studentNum, String name) { + super("정보가 일치하지 않습니다.\n 학번 : " + studentNum + "\n 이름 : " + name, HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/manager/domain/Manager.java b/src/main/java/com/server/hispath/manager/domain/Manager.java index 41a597c..723a41c 100644 --- a/src/main/java/com/server/hispath/manager/domain/Manager.java +++ b/src/main/java/com/server/hispath/manager/domain/Manager.java @@ -23,7 +23,7 @@ public class Manager extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @OneToMany(mappedBy = "writer") + @OneToMany(mappedBy = "writer", cascade = CascadeType.PERSIST, orphanRemoval = true) private List notices = new ArrayList<>(); private String name; diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java index 42bde8f..a63a3a4 100644 --- a/src/main/java/com/server/hispath/student/application/StudentService.java +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -1,8 +1,18 @@ package com.server.hispath.student.application; +import java.util.List; + +import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.application.MActivityService; +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.exception.student.StudentDataNotMatchException; +import com.server.hispath.exception.student.StudentNotFoundException; +import com.server.hispath.student.application.dto.StudentRefDto; +import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; @@ -11,5 +21,19 @@ public class StudentService { private final StudentRepository studentRepository; - + private final ActivityService activityService; + private final MActivityService mActivityService; + @Transactional + public void registerParticipants(Long activityId, List studentRefDtos) { + Activity activity = activityService.findById(activityId); + mActivityService.deleteAllParticipant(activity); + studentRefDtos.forEach(dto -> { + Student student = studentRepository.findByStudentNum(dto.getStudentNum()) + .orElseThrow(StudentNotFoundException::new); + if (!student.isNameMatch(dto.getName())) { + throw new StudentDataNotMatchException(dto.getStudentNum(), dto.getName()); + } + activity.addParticipant(student); + }); + } } diff --git a/src/main/java/com/server/hispath/student/application/dto/StudentRefDto.java b/src/main/java/com/server/hispath/student/application/dto/StudentRefDto.java new file mode 100644 index 0000000..6489314 --- /dev/null +++ b/src/main/java/com/server/hispath/student/application/dto/StudentRefDto.java @@ -0,0 +1,16 @@ +package com.server.hispath.student.application.dto; + + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class StudentRefDto { + private String studentNum; + private String name; + + +} diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index 75fbb89..80f01b7 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -3,8 +3,10 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import javax.persistence.*; +import com.server.hispath.activity.domain.Activity; import com.server.hispath.common.BaseEntity; import com.server.hispath.major.domain.Major; import com.server.hispath.student.domain.participate.Participant; @@ -53,6 +55,14 @@ public class Student extends BaseEntity { private LocalDateTime lastLoginDate; - @OneToMany(mappedBy = "student") + @OneToMany(mappedBy = "student", cascade = CascadeType.PERSIST, orphanRemoval = true) private List participants = new ArrayList<>(); + + public boolean isNameMatch(String name) { + return Objects.equals(this.name, name); + } + + public void addParticipant(Participant participant) { + this.participants.add(participant); + } } diff --git a/src/main/java/com/server/hispath/student/domain/participate/Participant.java b/src/main/java/com/server/hispath/student/domain/participate/Participant.java index f0b4533..532a9a7 100644 --- a/src/main/java/com/server/hispath/student/domain/participate/Participant.java +++ b/src/main/java/com/server/hispath/student/domain/participate/Participant.java @@ -15,7 +15,7 @@ @Getter @NoArgsConstructor @Where(clause = "deleted = false") -@SQLDelete(sql = "UPDATE participate SET deleted = true Where id = ?") +@SQLDelete(sql = "UPDATE participant SET deleted = true Where id = ?") public class Participant extends BaseEntity { @Id @@ -29,4 +29,9 @@ public class Participant extends BaseEntity { private Activity activity; String data; + + public Participant(Student student, Activity activity) { + this.student = student; + this.activity = activity; + } } diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java index f5b72a4..b1f5441 100644 --- a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java @@ -1,8 +1,12 @@ package com.server.hispath.student.domain.repository; +import java.util.Optional; + import com.server.hispath.student.domain.Student; import org.springframework.data.jpa.repository.JpaRepository; public interface StudentRepository extends JpaRepository { + + Optional findByStudentNum(String studentNum); } diff --git a/src/main/java/com/server/hispath/util/ExcelManager.java b/src/main/java/com/server/hispath/util/ExcelManager.java index 670e167..072aaec 100644 --- a/src/main/java/com/server/hispath/util/ExcelManager.java +++ b/src/main/java/com/server/hispath/util/ExcelManager.java @@ -10,6 +10,7 @@ import com.server.hispath.exception.common.ExcelDataFormatException; import com.server.hispath.exception.common.ExcelFormatException; import com.server.hispath.exception.common.NotExcelExtensionException; +import com.server.hispath.student.application.dto.StudentRefDto; import org.springframework.web.multipart.MultipartFile; @@ -64,4 +65,21 @@ public static List getMActivities(Sheet worksheet) { } return mActivityContentDtos; } + + public static List getStudentDatas(Sheet worksheet) { + List studentRefDtos = new ArrayList<>(); + + for (int i = 1; i < worksheet.getPhysicalNumberOfRows(); i++) { + try { + Row row = worksheet.getRow(i); + String studentNum = row.getCell(0).toString(); + String studentName = row.getCell(1).toString(); + + studentRefDtos.add(new StudentRefDto(studentNum, studentName)); + } catch (Exception e) { + throw new ExcelFormatException(e.getMessage()); + } + } + return studentRefDtos; + } } From 317b6b18389a5464a2e5113dc07f57349c96d283 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 16:40:10 +0900 Subject: [PATCH 031/148] =?UTF-8?q?feat[#7]=20:=20=EB=A7=88=EC=9D=BC?= =?UTF-8?q?=EB=A6=AC=EC=A7=80=20=ED=99=9C=EB=8F=99=20=EC=B0=B8=EA=B0=80=20?= =?UTF-8?q?=ED=95=99=EC=83=9D=20=EC=82=AD=EC=A0=9C=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/MActivityService.java | 22 +++++++++++++++++-- .../presentation/MActivityController.java | 7 ++++++ .../request/MParticipantRequest.java | 13 +++++++++++ .../java/com/server/hispath/docs/ApiDoc.java | 1 + .../ParticipantNotFoundException.java | 9 ++++++++ 5 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/server/hispath/activity/presentation/request/MParticipantRequest.java create mode 100644 src/main/java/com/server/hispath/exception/activity/ParticipantNotFoundException.java diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index 12674a0..0862726 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -1,6 +1,7 @@ package com.server.hispath.activity.application; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import com.server.hispath.activity.application.dto.ActivityDto; @@ -11,6 +12,10 @@ import com.server.hispath.category.domain.Category; import com.server.hispath.common.BaseEntity; import com.server.hispath.exception.activity.ActivityNotFoundException; +import com.server.hispath.exception.activity.ParticipantNotFoundException; +import com.server.hispath.exception.student.StudentNotFoundException; +import com.server.hispath.student.domain.Student; +import com.server.hispath.student.domain.repository.StudentRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,6 +27,8 @@ public class MActivityService { private final ActivityRepository activityRepository; private final CategoryService categoryService; + private final ActivityService activityService; + private final StudentRepository studentRepository; @Transactional public Long create(MActivityContentDto dto) { @@ -43,7 +50,7 @@ public void createAll(List dtos) { @Transactional public ActivityDto update(Long id, MActivityContentDto dto) { - Activity activity = activityRepository.findById(id).orElseThrow(ActivityNotFoundException::new); + Activity activity = activityService.findById(id); Category category = categoryService.findById(dto.getCategoryId()); activity.update(category, dto); return ActivityDto.from(activity); @@ -58,7 +65,18 @@ public List findAllBySemester(String semester) { } @Transactional - public void deleteAllParticipant(Activity activity){ + public void deleteAllParticipant(Activity activity) { activity.getParticipants().forEach(BaseEntity::deleteContent); } + + @Transactional + public void deleteParticipantById(Long activityId, Long studentId) { + Activity activity = activityService.findById(activityId); + Student student = studentRepository.findById(studentId).orElseThrow(StudentNotFoundException::new); + activity.getParticipants() + .stream() + .filter(participant -> Objects.equals(participant.getStudent(), student)) + .findFirst().orElseThrow(ParticipantNotFoundException::new) + .deleteContent(); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 977a146..4d53a23 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -8,6 +8,7 @@ import com.server.hispath.activity.application.dto.ActivityDto; import com.server.hispath.activity.application.dto.MActivityContentDto; import com.server.hispath.activity.presentation.request.MActivityCURequest; +import com.server.hispath.activity.presentation.request.MParticipantRequest; import com.server.hispath.activity.presentation.response.ActivityResponse; import com.server.hispath.docs.ApiDoc; import com.server.hispath.student.application.StudentService; @@ -80,4 +81,10 @@ public ResponseEntity registerStudents(@RequestPart(value = "file", requir return ResponseEntity.ok(null); } + @DeleteMapping("/mileage/student") + @ApiOperation(value = ApiDoc.ACTIVITY_STUDENT_DELETE) + public ResponseEntity deleteParticipant(@RequestBody MParticipantRequest request) { + mActivityService.deleteParticipantById(request.getActivityId(), request.getStudentId()); + return ResponseEntity.ok(null); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/request/MParticipantRequest.java b/src/main/java/com/server/hispath/activity/presentation/request/MParticipantRequest.java new file mode 100644 index 0000000..1c0e0f9 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/request/MParticipantRequest.java @@ -0,0 +1,13 @@ +package com.server.hispath.activity.presentation.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class MParticipantRequest { + private Long activityId; + private Long studentId; +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 0b6dde2..0755d95 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -18,6 +18,7 @@ public class ApiDoc { public static final String MILEAGE_DELETE = "마일리지 활동 삭제"; public static final String MILEAGE_READ_SEMESTER = "마일리지 학기별 조회"; public static final String MILEAGE_REGISTER_STUDENTS = "마일리지 활동 참가 학생 엑셀 등록"; + public static final String ACTIVITY_STUDENT_DELETE = "마일리지 활동 학생 참가 정보 삭제"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; diff --git a/src/main/java/com/server/hispath/exception/activity/ParticipantNotFoundException.java b/src/main/java/com/server/hispath/exception/activity/ParticipantNotFoundException.java new file mode 100644 index 0000000..e18dc92 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/activity/ParticipantNotFoundException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.activity; + +import org.springframework.http.HttpStatus; + +public class ParticipantNotFoundException extends ActivityException { + public ParticipantNotFoundException() { + super("존재하지 않는 참여자 정보입니다.", HttpStatus.BAD_REQUEST); + } +} From 3b567490a3fd27b7625e67c77f5431684bd89bd8 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 17:06:09 +0900 Subject: [PATCH 032/148] =?UTF-8?q?feat[#7]=20:=20Activity=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=A0=95=EB=B3=B4=20=EB=B0=9B=EB=8A=94=20API=20?= =?UTF-8?q?=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20=EB=A1=9C=EC=A7=95=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/MActivityService.java | 15 ++++++++ .../application/dto/MActivityDetailDto.java | 37 +++++++++++++++++++ .../hispath/activity/domain/Activity.java | 2 + .../domain/repository/ActivityRepository.java | 8 ++++ .../presentation/MActivityController.java | 7 ++++ .../java/com/server/hispath/docs/ApiDoc.java | 1 + .../application/dto/StudentRefDetailDto.java | 21 +++++++++++ 7 files changed, 91 insertions(+) create mode 100644 src/main/java/com/server/hispath/activity/application/dto/MActivityDetailDto.java create mode 100644 src/main/java/com/server/hispath/student/application/dto/StudentRefDetailDto.java diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index 0862726..b385634 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -6,6 +6,7 @@ import com.server.hispath.activity.application.dto.ActivityDto; import com.server.hispath.activity.application.dto.MActivityContentDto; +import com.server.hispath.activity.application.dto.MActivityDetailDto; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.category.application.CategoryService; @@ -14,6 +15,7 @@ import com.server.hispath.exception.activity.ActivityNotFoundException; import com.server.hispath.exception.activity.ParticipantNotFoundException; import com.server.hispath.exception.student.StudentNotFoundException; +import com.server.hispath.student.application.dto.StudentRefDetailDto; import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; @@ -79,4 +81,17 @@ public void deleteParticipantById(Long activityId, Long studentId) { .findFirst().orElseThrow(ParticipantNotFoundException::new) .deleteContent(); } + + @Transactional + public MActivityDetailDto findDetailActivityInfo(Long activityId){ + Activity activity = activityRepository.findActivityWithStudents(activityId) + .orElseThrow(ActivityNotFoundException::new); + List students = activity.getParticipants() + .stream() + .map(participant -> { + return StudentRefDetailDto.of(participant.getStudent()); + }) + .collect(Collectors.toList()); + return MActivityDetailDto.from(activity, students); + } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/MActivityDetailDto.java b/src/main/java/com/server/hispath/activity/application/dto/MActivityDetailDto.java new file mode 100644 index 0000000..d57682c --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/MActivityDetailDto.java @@ -0,0 +1,37 @@ +package com.server.hispath.activity.application.dto; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.category.application.dto.CategoryDto; +import com.server.hispath.category.domain.Category; +import com.server.hispath.student.application.dto.StudentRefDetailDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class MActivityDetailDto { + private Long id; + private String name; + private CategoryDto category; + private String semester; + private String remark; + private LocalDateTime startDate; + private LocalDateTime endDate; + private int weight; + private List students = new ArrayList<>(); + + + public static MActivityDetailDto from(Activity activity, List students) { + return new MActivityDetailDto(activity.getId(), activity.getName(), CategoryDto.from(activity.getCategory()), + activity.getSemester(), activity.getRemark(), activity.getStartDate(), activity.getEndDate(), activity.getWeight(), students); + + } +} diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 98462cb..560a8cd 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -42,6 +42,8 @@ public class Activity extends BaseEntity { private boolean personal; + private String remark; + private int requestStatus; private String name; diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java index 0646d6f..0a601ad 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -1,11 +1,19 @@ package com.server.hispath.activity.domain.repository; import java.util.List; +import java.util.Optional; import com.server.hispath.activity.domain.Activity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; public interface ActivityRepository extends JpaRepository { List findAllBySemester(String semester); + + @Query("select a from Activity a " + + "left join fetch a.participants as p " + + "left join fetch p.student " + + "where a.id = :id" ) + Optional findActivityWithStudents(Long id); } diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 4d53a23..d2c77b8 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -87,4 +87,11 @@ public ResponseEntity deleteParticipant(@RequestBody MParticipantRequest r mActivityService.deleteParticipantById(request.getActivityId(), request.getStudentId()); return ResponseEntity.ok(null); } + + @GetMapping("/mileage/{id}") + @ApiOperation(value = ApiDoc.MILEAGE_READ) + public ResponseEntity findMileageActivityById(@PathVariable Long id) { + + return ResponseEntity.ok(null); + } } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 0755d95..3a16c7b 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -19,6 +19,7 @@ public class ApiDoc { public static final String MILEAGE_READ_SEMESTER = "마일리지 학기별 조회"; public static final String MILEAGE_REGISTER_STUDENTS = "마일리지 활동 참가 학생 엑셀 등록"; public static final String ACTIVITY_STUDENT_DELETE = "마일리지 활동 학생 참가 정보 삭제"; + public static final String MILEAGE_READ = "단일 마일리지 활동 조회"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; diff --git a/src/main/java/com/server/hispath/student/application/dto/StudentRefDetailDto.java b/src/main/java/com/server/hispath/student/application/dto/StudentRefDetailDto.java new file mode 100644 index 0000000..8b58793 --- /dev/null +++ b/src/main/java/com/server/hispath/student/application/dto/StudentRefDetailDto.java @@ -0,0 +1,21 @@ +package com.server.hispath.student.application.dto; + + +import com.server.hispath.student.domain.Student; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class StudentRefDetailDto { + private Long id; + private String name; + private String studentNum; + + public static StudentRefDetailDto of(Student student){ + return new StudentRefDetailDto(student.getId(), student.getName(), student.getStudentNum()); + } +} From be2885f77aa57d2e23852808333c949c9bd3ede5 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 17:11:20 +0900 Subject: [PATCH 033/148] =?UTF-8?q?feat[#7]=20:=20activity=EC=97=90=20rema?= =?UTF-8?q?rk=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/MActivityService.java | 12 ++++++------ .../activity/application/dto/ActivityContentDto.java | 3 ++- .../activity/application/dto/ActivityDto.java | 3 ++- .../com/server/hispath/activity/domain/Activity.java | 5 ++++- .../presentation/request/ActivityCURequest.java | 1 + .../presentation/response/ActivityResponse.java | 3 ++- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index b385634..6d950cc 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -83,15 +83,15 @@ public void deleteParticipantById(Long activityId, Long studentId) { } @Transactional - public MActivityDetailDto findDetailActivityInfo(Long activityId){ + public MActivityDetailDto findDetailActivityInfo(Long activityId) { Activity activity = activityRepository.findActivityWithStudents(activityId) .orElseThrow(ActivityNotFoundException::new); List students = activity.getParticipants() - .stream() - .map(participant -> { - return StudentRefDetailDto.of(participant.getStudent()); - }) - .collect(Collectors.toList()); + .stream() + .map(participant -> { + return StudentRefDetailDto.of(participant.getStudent()); + }) + .collect(Collectors.toList()); return MActivityDetailDto.from(activity, students); } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java index 2c3b7e7..269555f 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java @@ -19,12 +19,13 @@ public class ActivityContentDto { private boolean personal; private int requestStatus; private String name; + private String remark; private int weight; private LocalDateTime startDate; private LocalDateTime endDate; public static ActivityContentDto from(ActivityCURequest request) { return new ActivityContentDto(request.getSemester(), request.isPersonal(), request.getRequestStatus(), - request.getName(), request.getWeight(), request.getStartDate(), request.getEndDate()); + request.getName(), request.getRemark(), request.getWeight(), request.getStartDate(), request.getEndDate()); } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java index 2d7c230..3056356 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java @@ -18,12 +18,13 @@ public class ActivityDto { private String semester; private boolean personal; private String name; + private String remark; private int weight; private LocalDateTime startDate; private LocalDateTime endDate; public static ActivityDto from(Activity activity) { return new ActivityDto(activity.getId(), CategoryDto.from(activity.getCategory()), activity.getSemester(), - activity.isPersonal(), activity.getName(), activity.getWeight(), activity.getStartDate(), activity.getEndDate()); + activity.isPersonal(), activity.getName(), activity.getRemark(), activity.getWeight(), activity.getStartDate(), activity.getEndDate()); } } diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 560a8cd..60e3be6 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -66,6 +66,7 @@ public static Activity from(Category category, ActivityContentDto dto) { .personal(dto.isPersonal()) .requestStatus(dto.getRequestStatus()) .name(dto.getName()) + .remark(dto.getRemark()) .weight(dto.getWeight()) .startDate(dto.getStartDate()) .endDate(dto.getEndDate()) @@ -91,6 +92,7 @@ public void update(Category category, ActivityContentDto dto) { this.personal = dto.isPersonal(); this.requestStatus = dto.getRequestStatus(); this.name = dto.getName(); + this.remark = dto.getRemark(); this.weight = dto.getWeight(); this.startDate = dto.getStartDate(); this.endDate = dto.getEndDate(); @@ -100,12 +102,13 @@ public void update(Category category, MActivityContentDto dto) { this.category = category; this.semester = dto.getSemester(); this.name = dto.getName(); + this.remark = dto.getRemark(); this.weight = dto.getWeight(); this.startDate = dto.getStartDate(); this.endDate = dto.getEndDate(); } - public void addParticipant(Student student){ + public void addParticipant(Student student) { Participant participant = new Participant(student, this); this.participants.add(participant); diff --git a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java index 9ef0477..291d696 100644 --- a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java +++ b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java @@ -17,6 +17,7 @@ public class ActivityCURequest { private boolean personal; private int requestStatus; private String name; + private String remark; private int weight; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java index ef5283d..8f14a12 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java @@ -19,6 +19,7 @@ public class ActivityResponse { private String semester; private boolean personal; private String name; + private String remark; private int weight; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") private LocalDateTime startDate; @@ -27,6 +28,6 @@ public class ActivityResponse { public static ActivityResponse from(ActivityDto dto) { return new ActivityResponse(dto.getId(), dto.getCategoryDto().getId(), dto.getCategoryDto().getName(), - dto.getSemester(), dto.isPersonal(), dto.getName(), dto.getWeight(), dto.getStartDate(), dto.getEndDate()); + dto.getSemester(), dto.isPersonal(), dto.getName(), dto.getRemark(), dto.getWeight(), dto.getStartDate(), dto.getEndDate()); } } From aa6b8ab2b883261295f9791310af6b5179c40018 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 17:13:52 +0900 Subject: [PATCH 034/148] =?UTF-8?q?feat[#7]=20:=20mActivity=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=B0=98=ED=99=98=20?= =?UTF-8?q?API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/activity/presentation/MActivityController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index d2c77b8..83049a9 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -7,6 +7,7 @@ import com.server.hispath.activity.application.MActivityService; import com.server.hispath.activity.application.dto.ActivityDto; import com.server.hispath.activity.application.dto.MActivityContentDto; +import com.server.hispath.activity.application.dto.MActivityDetailDto; import com.server.hispath.activity.presentation.request.MActivityCURequest; import com.server.hispath.activity.presentation.request.MParticipantRequest; import com.server.hispath.activity.presentation.response.ActivityResponse; @@ -90,8 +91,7 @@ public ResponseEntity deleteParticipant(@RequestBody MParticipantRequest r @GetMapping("/mileage/{id}") @ApiOperation(value = ApiDoc.MILEAGE_READ) - public ResponseEntity findMileageActivityById(@PathVariable Long id) { - - return ResponseEntity.ok(null); + public ResponseEntity findMileageActivityById(@PathVariable Long id) { + return ResponseEntity.ok(mActivityService.findDetailActivityInfo(id)); } } From 775dbe44e13c580dca8e1cc016e1aa8e273a1930 Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 28 Sep 2022 17:20:48 +0900 Subject: [PATCH 035/148] =?UTF-8?q?fix[#7]=20:=20remark=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EA=B2=83=20=EC=B6=94=EA=B0=80,=20date=20pattern=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/server/hispath/activity/domain/Activity.java | 1 + .../activity/presentation/request/MActivityCURequest.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 60e3be6..78c3c92 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -80,6 +80,7 @@ public static Activity from(Category category, MActivityContentDto dto) { .personal(false) .requestStatus(1) .name(dto.getName()) + .remark(dto.getRemark()) .weight(dto.getWeight()) .startDate(dto.getStartDate()) .endDate(dto.getEndDate()) diff --git a/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java index 77bf3cf..a7e72ad 100644 --- a/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java +++ b/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java @@ -18,8 +18,8 @@ public class MActivityCURequest { private String remark; private int weight; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") private LocalDateTime startDate; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") private LocalDateTime endDate; } From deeec49857554dd37231e4785496077019e7aed8 Mon Sep 17 00:00:00 2001 From: gomster Date: Thu, 29 Sep 2022 09:35:50 +0900 Subject: [PATCH 036/148] hotfix : add validate --- src/main/java/com/server/hispath/util/ExcelManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/util/ExcelManager.java b/src/main/java/com/server/hispath/util/ExcelManager.java index 072aaec..5747c31 100644 --- a/src/main/java/com/server/hispath/util/ExcelManager.java +++ b/src/main/java/com/server/hispath/util/ExcelManager.java @@ -37,7 +37,7 @@ public static Sheet extract(MultipartFile file) throws Exception { return workbook.cloneSheet(0); } - public void validate(String semester) { + public static void validate(String semester) { String pattern = "[0-9]{4}-[0-9]"; if (!Pattern.matches(pattern, semester)) throw new ExcelDataFormatException(semester); @@ -57,6 +57,7 @@ public static List getMActivities(Sheet worksheet) { LocalDateTime endDate = LocalDateTime.parse(row.getCell(4).toString(), dateTimeFormatter); int weight = Integer.parseInt(row.getCell(5).toString()); String semester = row.getCell(6).toString(); + validate(semester); mActivityContentDtos.add(new MActivityContentDto(categoryId, semester, activityName, remark, weight, startDate, endDate)); } catch (Exception e) { throw new ExcelFormatException(e.getMessage()); From 8ab20c858744d241a9fa9cce8c358a8450ff90b5 Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Mon, 3 Oct 2022 15:55:16 +0900 Subject: [PATCH 037/148] =?UTF-8?q?feat[#8]:=ED=95=99=EC=83=9D=20CRUD=20(#?= =?UTF-8?q?12)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/CategoryCURequest.java | 1 + .../java/com/server/hispath/docs/ApiDoc.java | 7 +++ .../student/application/StudentService.java | 45 +++++++++++++++- .../student/application/dto/StudentDto.java | 23 ++++++++ .../hispath/student/domain/Student.java | 12 +++++ .../presentation/StudentController.java | 53 ++++++++++++++++++- .../request/StudentCURequest.java | 14 +++++ .../response/StudentResponse.java | 18 +++++++ 8 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/server/hispath/student/application/dto/StudentDto.java create mode 100644 src/main/java/com/server/hispath/student/presentation/request/StudentCURequest.java create mode 100644 src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java diff --git a/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java b/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java index d791bca..3e47898 100644 --- a/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java +++ b/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java @@ -8,5 +8,6 @@ @Setter @NoArgsConstructor public class CategoryCURequest { + private Long studentId; private String name; } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 3a16c7b..0ec4848 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -26,4 +26,11 @@ public class ApiDoc { public static final String CATEGORY_CREATE = "카테고리 생성"; public static final String CATEGORY_UPDATE = "카테고리 수정"; public static final String CATEGORY_DELETE = "카테고리 삭제"; + + /* Student 관련 API 명세 */ + public static final String STUDENT_READ = "단일 학생 조회"; + public static final String STUDENT_READ_ALL = "모든 학생 조회"; + public static final String STUDENT_CREATE = "학생 추가"; + public static final String STUDENT_UPDATE = "학생 수정"; + public static final String STUDENT_DELETE = "학생 삭제"; } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java index a63a3a4..bbb47a3 100644 --- a/src/main/java/com/server/hispath/student/application/StudentService.java +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -1,7 +1,9 @@ package com.server.hispath.student.application; +import com.server.hispath.exception.category.CategoryNotFoundException; +import com.server.hispath.exception.student.StudentNotFoundException; +import com.server.hispath.student.application.dto.StudentDto; import java.util.List; - import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.MActivityService; import com.server.hispath.activity.domain.Activity; @@ -15,6 +17,10 @@ import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -23,6 +29,43 @@ public class StudentService { private final StudentRepository studentRepository; private final ActivityService activityService; private final MActivityService mActivityService; + + @Transactional + public Long create(StudentDto dto){ + Student savedStudent = studentRepository.save(Student.from(dto)); + return savedStudent.getId(); + } + + @Transactional + public StudentDto find(Long id) { + Student student = this.findById(id); + return StudentDto.from(student); + } + + @Transactional + public List findAll() { + List students = studentRepository.findAll(); + return students.stream() + .map(StudentDto::from) + .collect(Collectors.toList()); + } + + @Transactional + public StudentDto update(Long id, StudentDto dto) { + Student student = studentRepository.findById(id).orElseThrow(StudentNotFoundException::new);; + student.update(dto); + return StudentDto.from(student); + } + + @Transactional + public void delete(Long id) { + studentRepository.deleteById(id); + } + + public Student findById(Long id){ + return studentRepository.findById(id).orElseThrow(StudentNotFoundException::new); + + @Transactional public void registerParticipants(Long activityId, List studentRefDtos) { Activity activity = activityService.findById(activityId); diff --git a/src/main/java/com/server/hispath/student/application/dto/StudentDto.java b/src/main/java/com/server/hispath/student/application/dto/StudentDto.java new file mode 100644 index 0000000..3f676f0 --- /dev/null +++ b/src/main/java/com/server/hispath/student/application/dto/StudentDto.java @@ -0,0 +1,23 @@ +package com.server.hispath.student.application.dto; + +import com.server.hispath.student.domain.Student; +import com.server.hispath.student.presentation.request.StudentCURequest; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class StudentDto { + private Long id; + private String name; + + public static StudentDto from (Student student) { + return new StudentDto(student.getId(), student.getName()); + } + + public static StudentDto of(StudentCURequest request) { + return new StudentDto(request.getStudentId(), request.getName()); + } +} diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index 80f01b7..8aab366 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -6,9 +6,11 @@ import java.util.Objects; import javax.persistence.*; +import com.server.hispath.category.domain.Category; import com.server.hispath.activity.domain.Activity; import com.server.hispath.common.BaseEntity; import com.server.hispath.major.domain.Major; +import com.server.hispath.student.application.dto.StudentDto; import com.server.hispath.student.domain.participate.Participant; import lombok.AllArgsConstructor; @@ -20,7 +22,9 @@ @Entity @Getter +@Builder @NoArgsConstructor +@AllArgsConstructor @Where(clause = "deleted = false") @SQLDelete(sql = "UPDATE student SET deleted = true Where id = ?") @AllArgsConstructor @@ -58,6 +62,14 @@ public class Student extends BaseEntity { @OneToMany(mappedBy = "student", cascade = CascadeType.PERSIST, orphanRemoval = true) private List participants = new ArrayList<>(); + + public void update(StudentDto dto) { + this.name = dto.getName(); + } + public static Student from(StudentDto dto) { + return Student.builder() + .name(dto.getName()) + .build(); public boolean isNameMatch(String name) { return Objects.equals(this.name, name); } diff --git a/src/main/java/com/server/hispath/student/presentation/StudentController.java b/src/main/java/com/server/hispath/student/presentation/StudentController.java index d4d30ff..6c8c26a 100644 --- a/src/main/java/com/server/hispath/student/presentation/StudentController.java +++ b/src/main/java/com/server/hispath/student/presentation/StudentController.java @@ -1,14 +1,65 @@ package com.server.hispath.student.presentation; +import com.server.hispath.docs.ApiDoc; import com.server.hispath.student.application.StudentService; -import org.springframework.web.bind.annotation.RestController; +import com.server.hispath.student.application.dto.StudentDto; +import com.server.hispath.student.presentation.request.StudentCURequest; +import com.server.hispath.student.presentation.response.StudentResponse; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; import lombok.RequiredArgsConstructor; +import java.util.List; +import java.util.stream.Collectors; + @RestController @RequiredArgsConstructor +@RequestMapping("/api") public class StudentController { private final StudentService studentService; + + @PostMapping("/student") + @ApiOperation(value = ApiDoc.STUDENT_CREATE) + public ResponseEntity create(@RequestBody StudentCURequest request) { + Long savedId = studentService.create(StudentDto.of(request)); + return ResponseEntity.ok(savedId); + } + + @GetMapping("/student/{id}") + @ApiOperation(value = ApiDoc.STUDENT_READ) + public ResponseEntity find(@PathVariable Long id) { + StudentDto dto = studentService.find(id); + StudentResponse response = StudentResponse.from(dto); + return ResponseEntity.ok(response); + } + + @GetMapping("/students") + @ApiOperation(value = ApiDoc.STUDENT_READ_ALL) + public ResponseEntity> findAll() { + List dtos = studentService.findAll(); + List responses = dtos.stream() + .map(StudentResponse::from) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } + + @PatchMapping("/student/{id}") + @ApiOperation(value = ApiDoc.STUDENT_UPDATE) + public ResponseEntity update(@PathVariable Long id, @RequestBody StudentCURequest request) { + StudentDto dto = studentService.update(id, StudentDto.of(request)); + StudentResponse response = StudentResponse.from(dto); + return ResponseEntity.ok(response); + } + + @DeleteMapping("/student/{id}") + @ApiOperation(value = ApiDoc.STUDENT_DELETE) + public ResponseEntity delete(@PathVariable Long id) { + studentService.delete(id); + return ResponseEntity.ok(id); + } } diff --git a/src/main/java/com/server/hispath/student/presentation/request/StudentCURequest.java b/src/main/java/com/server/hispath/student/presentation/request/StudentCURequest.java new file mode 100644 index 0000000..f2634d1 --- /dev/null +++ b/src/main/java/com/server/hispath/student/presentation/request/StudentCURequest.java @@ -0,0 +1,14 @@ +package com.server.hispath.student.presentation.request; + +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class StudentCURequest { + private Long studentId; + private String name; +} diff --git a/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java b/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java new file mode 100644 index 0000000..d110130 --- /dev/null +++ b/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java @@ -0,0 +1,18 @@ +package com.server.hispath.student.presentation.response; + +import com.server.hispath.student.application.dto.StudentDto; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class StudentResponse { + private Long id; + private String name; + + public static StudentResponse from (StudentDto dto) { + return new StudentResponse(dto.getId(), dto.getName()); + } +} From 93751b13164ce20512ad3ac6880c0a21a5ff5dcb Mon Sep 17 00:00:00 2001 From: lukehongg Date: Mon, 3 Oct 2022 22:05:04 +0900 Subject: [PATCH 038/148] =?UTF-8?q?hotfix:=20merge=20error=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/hispath/student/application/StudentService.java | 4 ++-- src/main/java/com/server/hispath/student/domain/Student.java | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java index bbb47a3..ca1685f 100644 --- a/src/main/java/com/server/hispath/student/application/StudentService.java +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -62,9 +62,9 @@ public void delete(Long id) { studentRepository.deleteById(id); } - public Student findById(Long id){ + public Student findById(Long id) { return studentRepository.findById(id).orElseThrow(StudentNotFoundException::new); - + } @Transactional public void registerParticipants(Long activityId, List studentRefDtos) { diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index 8aab366..124988e 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -22,9 +22,7 @@ @Entity @Getter -@Builder @NoArgsConstructor -@AllArgsConstructor @Where(clause = "deleted = false") @SQLDelete(sql = "UPDATE student SET deleted = true Where id = ?") @AllArgsConstructor @@ -70,6 +68,7 @@ public static Student from(StudentDto dto) { return Student.builder() .name(dto.getName()) .build(); + } public boolean isNameMatch(String name) { return Objects.equals(this.name, name); } From b4efff1fbe2d1c0fe158ad7e95503448546036e7 Mon Sep 17 00:00:00 2001 From: lukehongg <79990740+lukehongg@users.noreply.github.com> Date: Mon, 3 Oct 2022 22:11:11 +0900 Subject: [PATCH 039/148] =?UTF-8?q?feat[#13]:=EA=B3=B5=EC=A7=80CRUD=20(#15?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/hispath/HispathApplication.java | 4 ++ .../java/com/server/hispath/docs/ApiDoc.java | 9 +++ .../server/hispath/major/domain/Major.java | 3 + .../manager/application/ManagerService.java | 7 +++ .../manager/application/dto/ManagerCUDto.java | 18 ++++++ .../manager/application/dto/ManagerDto.java | 28 +++++++++ .../hispath/manager/domain/Manager.java | 8 +-- .../presentation/ManagerController.java | 20 +++++- .../request/ManagerCURequest.java | 12 ++++ .../notice/application/NoticeService.java | 59 ++++++++++++++++++ .../application/dto/NoticeContentDto.java | 32 ++++++++++ .../notice/application/dto/NoticeDto.java | 33 ++++++++++ .../server/hispath/notice/domain/Notice.java | 44 ++++++++++++- .../domain/repository/NoticeRepository.java | 12 ++++ .../notice/presentation/NoticeController.java | 61 ++++++++++++++++++- .../presentation/request/NoticeRequest.java | 26 ++++++++ .../presentation/response/NoticeResponse.java | 37 +++++++++++ 17 files changed, 405 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java create mode 100644 src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java create mode 100644 src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java create mode 100644 src/main/java/com/server/hispath/notice/application/dto/NoticeContentDto.java create mode 100644 src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java create mode 100644 src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java create mode 100644 src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java diff --git a/src/main/java/com/server/hispath/HispathApplication.java b/src/main/java/com/server/hispath/HispathApplication.java index 13c7ac8..4587d44 100644 --- a/src/main/java/com/server/hispath/HispathApplication.java +++ b/src/main/java/com/server/hispath/HispathApplication.java @@ -1,7 +1,11 @@ package com.server.hispath; +import com.server.hispath.notice.domain.Notice; +import com.server.hispath.notice.domain.repository.NoticeRepository; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 0ec4848..10db619 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -27,10 +27,19 @@ public class ApiDoc { public static final String CATEGORY_UPDATE = "카테고리 수정"; public static final String CATEGORY_DELETE = "카테고리 삭제"; + public static final String NOTICE_CREATE = "공지 생성"; + public static final String NOTICE_READ_ALL = "전체 공지 조회"; + public static final String NOTICE_READ = "단일 공지 조회"; + public static final String NOTICE_DELETE = "공지 삭제"; + public static final String NOTICE_UPDATE = "공지 수정"; + + + /* Student 관련 API 명세 */ public static final String STUDENT_READ = "단일 학생 조회"; public static final String STUDENT_READ_ALL = "모든 학생 조회"; public static final String STUDENT_CREATE = "학생 추가"; public static final String STUDENT_UPDATE = "학생 수정"; public static final String STUDENT_DELETE = "학생 삭제"; + } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/major/domain/Major.java b/src/main/java/com/server/hispath/major/domain/Major.java index d827c20..679b58b 100644 --- a/src/main/java/com/server/hispath/major/domain/Major.java +++ b/src/main/java/com/server/hispath/major/domain/Major.java @@ -7,6 +7,8 @@ import com.server.hispath.common.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; @@ -24,4 +26,5 @@ public class Major extends BaseEntity { private Long id; private String name; + } diff --git a/src/main/java/com/server/hispath/manager/application/ManagerService.java b/src/main/java/com/server/hispath/manager/application/ManagerService.java index 21f8313..fed86a9 100644 --- a/src/main/java/com/server/hispath/manager/application/ManagerService.java +++ b/src/main/java/com/server/hispath/manager/application/ManagerService.java @@ -1,5 +1,9 @@ package com.server.hispath.manager.application; +import com.server.hispath.category.domain.Category; +import com.server.hispath.exception.category.CategoryNotFoundException; +import com.server.hispath.exception.manager.ManagerNotFoundException; +import com.server.hispath.manager.domain.Manager; import com.server.hispath.manager.domain.repository.ManagerRepository; import org.springframework.stereotype.Service; @@ -12,4 +16,7 @@ public class ManagerService { private final ManagerRepository managerRepository; + public Manager findById(Long id){ + return managerRepository.findById(id).orElseThrow(ManagerNotFoundException::new); + } } diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java new file mode 100644 index 0000000..f7d0140 --- /dev/null +++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java @@ -0,0 +1,18 @@ +package com.server.hispath.manager.application.dto; + +import com.server.hispath.manager.presentation.request.ManagerCURequest; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ManagerCUDto { + private String name; + + public static ManagerCUDto of(ManagerCURequest request){ + return new ManagerCUDto(request.getName()); + } + +} \ No newline at end of file diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java new file mode 100644 index 0000000..168c054 --- /dev/null +++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java @@ -0,0 +1,28 @@ +package com.server.hispath.manager.application.dto; + +import com.server.hispath.manager.domain.Manager; +import com.server.hispath.notice.domain.Notice; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ManagerDto { + private Long id; + private List notices = new ArrayList<>(); + private String name; + private String email; + private String department; + + public static ManagerDto from (Manager manager){ + return new ManagerDto(manager.getId(), manager.getNotices(), manager.getName(), + manager.getEmail(), manager.getDepartment()); + } + + +} diff --git a/src/main/java/com/server/hispath/manager/domain/Manager.java b/src/main/java/com/server/hispath/manager/domain/Manager.java index 723a41c..a8e8388 100644 --- a/src/main/java/com/server/hispath/manager/domain/Manager.java +++ b/src/main/java/com/server/hispath/manager/domain/Manager.java @@ -23,12 +23,10 @@ public class Manager extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @OneToMany(mappedBy = "writer", cascade = CascadeType.PERSIST, orphanRemoval = true) - private List notices = new ArrayList<>(); - private String name; - private String email; - private String department; + + + } diff --git a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java index 06af748..2d57b54 100644 --- a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java +++ b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java @@ -2,13 +2,31 @@ import com.server.hispath.manager.application.ManagerService; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor +@RequestMapping("/api") public class ManagerController { private final ManagerService managerService; + +// @PostMapping("/") +// @ApiOperation(value= ApiDoc.Manager_CREATE) +// public ResponseEntity create(@RequestBody ManagerCURequest request){ +// Long savedId = managerService.create(ManagerCUDto.of(request)); +// return ResponseEntity.ok(savedId); +// } +// +// public ResponseEntity find(@PathVariable Long id){ +// ManagerContentDto dto = managerService.find(id); +// ManagerResponse response = ManagerResponse.from(dto); +// return ResponseEntity.ok(response); +// } + + + + } diff --git a/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java b/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java new file mode 100644 index 0000000..c0b1408 --- /dev/null +++ b/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java @@ -0,0 +1,12 @@ +package com.server.hispath.manager.presentation.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class ManagerCURequest { + private String name; +} diff --git a/src/main/java/com/server/hispath/notice/application/NoticeService.java b/src/main/java/com/server/hispath/notice/application/NoticeService.java index cf5a47d..725f200 100644 --- a/src/main/java/com/server/hispath/notice/application/NoticeService.java +++ b/src/main/java/com/server/hispath/notice/application/NoticeService.java @@ -1,15 +1,74 @@ package com.server.hispath.notice.application; +import com.server.hispath.exception.notice.NoticeNotFoundException; +import com.server.hispath.manager.application.ManagerService; +import com.server.hispath.manager.domain.Manager; +import com.server.hispath.notice.application.dto.NoticeContentDto; +import com.server.hispath.notice.application.dto.NoticeDto; +import com.server.hispath.notice.domain.Notice; import com.server.hispath.notice.domain.repository.NoticeRepository; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; +import javax.transaction.Transactional; +import java.util.List; +import java.util.stream.Collectors; + @Service @RequiredArgsConstructor public class NoticeService { private final NoticeRepository noticeRepository; + private final ManagerService managerService; + + private Notice findById(Long id){ + return noticeRepository.findById(id).orElseThrow(NoticeNotFoundException::new); + } + + + //C + + @Transactional + public Long create(Long managerId, NoticeContentDto dto) { + Manager manager = managerService.findById(managerId); + Notice notice = Notice.from(manager, dto); + Notice savedNotice = noticeRepository.save(notice); + return savedNotice.getId(); + } + + // R + @Transactional + public List findAll() { + List notices = noticeRepository.findAll(); + return notices.stream().map(NoticeDto::from).collect(Collectors.toList()); + } + + @Transactional + public NoticeDto find(Long id){ + Notice notice = this.findById(id); + return NoticeDto.from(notice); + } + + + + // U + + @Transactional + public NoticeDto update(Long id, Long managerId, NoticeContentDto dto){ + Notice notice = this.findById(id); + Manager manager = managerService.findById(managerId); + notice.update(manager, dto); + + return NoticeDto.from(notice); + } + + + // D + @Transactional + public void delete(Long id){ + noticeRepository.deleteById(id); + } } diff --git a/src/main/java/com/server/hispath/notice/application/dto/NoticeContentDto.java b/src/main/java/com/server/hispath/notice/application/dto/NoticeContentDto.java new file mode 100644 index 0000000..f5bc450 --- /dev/null +++ b/src/main/java/com/server/hispath/notice/application/dto/NoticeContentDto.java @@ -0,0 +1,32 @@ +package com.server.hispath.notice.application.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.server.hispath.notice.presentation.request.NoticeRequest; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.time.LocalDate; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class NoticeContentDto { + private String title; + private String content; + private int viewCnt; + private boolean importance; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDate pubDate; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDate expDate; + + public static NoticeContentDto from(NoticeRequest request){ + return new NoticeContentDto(request.getTitle(), request.getContent(), + request.getViewCnt(), request.isImportance(), request.getPubDate(), request.getExpDate()); + } +} diff --git a/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java b/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java new file mode 100644 index 0000000..9f73e84 --- /dev/null +++ b/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java @@ -0,0 +1,33 @@ +package com.server.hispath.notice.application.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.server.hispath.manager.application.dto.ManagerDto; +import com.server.hispath.notice.domain.Notice; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class NoticeDto{ + private Long id; + private ManagerDto manager; + private String title; + private String content; + private int viewCnt; + private boolean importance; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDate pubDate; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDate expDate; + + public static NoticeDto from(Notice notice) { + return new NoticeDto(notice.getId(), ManagerDto.from(notice.getManager()), notice.getTitle(), + notice.getContent(), notice.getViewCnt(), notice.isImportance(), notice.getPubDate(), notice.getExpDate()); + } +} diff --git a/src/main/java/com/server/hispath/notice/domain/Notice.java b/src/main/java/com/server/hispath/notice/domain/Notice.java index 5f502c8..35fbc40 100644 --- a/src/main/java/com/server/hispath/notice/domain/Notice.java +++ b/src/main/java/com/server/hispath/notice/domain/Notice.java @@ -2,26 +2,36 @@ import javax.persistence.*; +import com.fasterxml.jackson.annotation.JsonFormat; import com.server.hispath.manager.domain.Manager; import com.server.hispath.common.BaseEntity; +import com.server.hispath.notice.application.dto.NoticeContentDto; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; import org.hibernate.annotations.Where; +import java.time.LocalDate; + @Entity @Getter +@Builder @NoArgsConstructor +@AllArgsConstructor @Where(clause = "deleted = false") @SQLDelete(sql = "UPDATE notice SET deleted = true Where id = ?") public class Notice extends BaseEntity { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne(fetch = FetchType.LAZY) - private Manager writer; + private Manager manager; private String title; @@ -31,4 +41,36 @@ public class Notice extends BaseEntity { private boolean importance; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDate pubDate; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDate expDate; + + // repository에서 contentdto로 받아오고 manager와 같이 받아서 notice build + + public static Notice from(Manager manager, NoticeContentDto dto) { + return Notice.builder() + .manager(manager) + .title(dto.getTitle()) + .content(dto.getContent()) + .viewCnt(dto.getViewCnt()) + .importance(dto.isImportance()) + .pubDate(dto.getPubDate()) + .expDate(dto.getExpDate()) + .build(); + } + + // dto와 manager를 받아서 notice로 병합 + public void update(Manager manager, NoticeContentDto dto) { + this.manager = manager; + this.title = dto.getTitle(); + this.content = dto.getContent(); + this.viewCnt = dto.getViewCnt(); + this.importance = dto.isImportance(); + this.pubDate = dto.getPubDate(); + this.expDate = dto.getExpDate(); + } + } diff --git a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java index 6ea7914..73e0bb7 100644 --- a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java +++ b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java @@ -3,6 +3,18 @@ import com.server.hispath.notice.domain.Notice; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; +import java.util.Optional; + +@Repository public interface NoticeRepository extends JpaRepository { + + +// //SELECT * from student where title = ? +// @Query("SELECT n FROM notice n WHERE n.title=?1") +// Optional findNoticeByTitle(String search); + + } diff --git a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java index 7e855dc..b05b49b 100644 --- a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java +++ b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java @@ -1,14 +1,73 @@ package com.server.hispath.notice.presentation; +import com.server.hispath.docs.ApiDoc; +import com.server.hispath.notice.application.dto.NoticeContentDto; +import com.server.hispath.notice.application.dto.NoticeDto; import com.server.hispath.notice.application.NoticeService; -import org.springframework.web.bind.annotation.RestController; +import com.server.hispath.notice.presentation.request.NoticeRequest; +import com.server.hispath.notice.presentation.response.NoticeResponse; +import io.swagger.annotations.ApiOperation; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; import lombok.RequiredArgsConstructor; +import java.util.List; +import java.util.stream.Collectors; + @RestController @RequiredArgsConstructor +@RequestMapping("/api") public class NoticeController { private final NoticeService noticeService; + + + // C + + @PostMapping("/notice/add") + @ApiOperation(value= ApiDoc.NOTICE_CREATE) + public ResponseEntity create(@RequestBody NoticeRequest request){ + Long id = noticeService.create(request.getManagerId(), NoticeContentDto.from(request)); + return ResponseEntity.ok(id); + } + + // R + + @GetMapping("/notice") + @ApiOperation(value = ApiDoc.NOTICE_READ_ALL) + public ResponseEntity> findAll() { + List responses = noticeService.findAll().stream().map(NoticeResponse::from).collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } + + @GetMapping("/notice/{id}") + @ApiOperation(value = ApiDoc.NOTICE_READ) + public ResponseEntity find(@PathVariable Long id){ + NoticeResponse response = NoticeResponse.from(noticeService.find(id)); + return ResponseEntity.ok(response); + } + + + // U + + @PatchMapping("/notice/{id}") + @ApiOperation(value = ApiDoc.NOTICE_UPDATE) + public ResponseEntity update(@PathVariable Long id, @RequestBody NoticeRequest request){ + NoticeDto dto = noticeService.update(id, request.getManagerId(), NoticeContentDto.from(request)); + NoticeResponse response = NoticeResponse.from(dto); + return ResponseEntity.ok(response); + } + + + // D + + @DeleteMapping("/notice/{id}") + @ApiOperation(value = ApiDoc.NOTICE_DELETE) + public ResponseEntity delete(@PathVariable Long id){ + noticeService.delete(id); + return ResponseEntity.ok(id); + } + } diff --git a/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java b/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java new file mode 100644 index 0000000..f2b450c --- /dev/null +++ b/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java @@ -0,0 +1,26 @@ +package com.server.hispath.notice.presentation.request; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Setter +@Getter +@NoArgsConstructor +public class NoticeRequest{ + + private Long managerId; + private String title; + private String content; + private int viewCnt; + private boolean importance; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDate pubDate; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDate expDate; + +} diff --git a/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java b/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java new file mode 100644 index 0000000..8d2fb7f --- /dev/null +++ b/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java @@ -0,0 +1,37 @@ +package com.server.hispath.notice.presentation.response; + + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.server.hispath.notice.application.dto.NoticeDto; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class NoticeResponse { + + + private Long id; + private Long managerId; + private String managerName; + private String title; + private String content; + private int viewCnt; + private boolean importance; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDate pubDate; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDate expDate; + + public static NoticeResponse from(NoticeDto dto) { + return new NoticeResponse(dto.getId(), dto.getManager().getId(), dto.getManager().getName(), + dto.getTitle(), dto.getContent(), dto.getViewCnt(), dto.isImportance(), dto.getPubDate(), dto.getExpDate()); + } +} From 9ecacb7418a1edc98a7a24f0c75704acaf1d6787 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Mon, 3 Oct 2022 22:25:25 +0900 Subject: [PATCH 040/148] =?UTF-8?q?[#14]=20:=20Domain=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20(Manager,=20Notice,=20Department)=20(#16)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#14] : Domain 수정 * feat[#14] : category init test api 구현 --- .../server/hispath/common/TestController.java | 30 ++++++++++++++----- .../hispath/department/domain/Department.java | 29 ++++++++++++++++++ .../manager/application/dto/ManagerDto.java | 3 +- .../hispath/manager/domain/Manager.java | 1 + .../server/hispath/notice/domain/Notice.java | 2 -- .../hispath/student/domain/Student.java | 4 +++ 6 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/server/hispath/department/domain/Department.java diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index b0bd747..0bbc236 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -7,6 +7,8 @@ import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.category.domain.Category; import com.server.hispath.category.domain.repository.CategoryRepository; +import com.server.hispath.major.domain.repository.MajorRepository; +import com.server.hispath.notice.domain.repository.NoticeRepository; import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; @@ -25,6 +27,8 @@ public class TestController { private final StudentRepository studentRepository; private final CategoryRepository categoryRepository; private final ActivityService activityService; + private final NoticeRepository noticeRepository; + private final MajorRepository majorRepository; @GetMapping("/register/ref") public ResponseEntity testRegisterRefStudent() { @@ -40,20 +44,30 @@ public ResponseEntity testRegisterRefStudent() { return ResponseEntity.ok(null); } - @GetMapping("/init") - public ResponseEntity testInit() { + @GetMapping("/init/category") + public ResponseEntity testCategoryInit() { categoryRepository.save(Category.builder() - .name("특강") + .name("전공마일리지") .build()); categoryRepository.save(Category.builder() - .name("산학") + .name("산학마일리지") .build()); categoryRepository.save(Category.builder() - .name("대회") + .name("비교과-연구활동") .build()); - DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); -// activityService.create(1L, new ActivityContentDto("2022-2", false, 1, -// "테스트특강", 3, + categoryRepository.save(Category.builder() + .name("비교과-특강참여") + .build()); + categoryRepository.save(Category.builder() + .name("비교과-행사참여") + .build()); + categoryRepository.save(Category.builder() + .name("비교과-학회할동") + .build()); + categoryRepository.save(Category.builder() + .name("기타") + .build()); + return ResponseEntity.ok(null); } } diff --git a/src/main/java/com/server/hispath/department/domain/Department.java b/src/main/java/com/server/hispath/department/domain/Department.java new file mode 100644 index 0000000..f748d6a --- /dev/null +++ b/src/main/java/com/server/hispath/department/domain/Department.java @@ -0,0 +1,29 @@ +package com.server.hispath.department.domain; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +import com.server.hispath.common.BaseEntity; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Entity +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Where(clause = "deleted = false") +@SQLDelete(sql = "UPDATE department SET deleted = true Where id = ?") +public class Department extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; +} diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java index 168c054..d1e0200 100644 --- a/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java +++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java @@ -14,13 +14,12 @@ @AllArgsConstructor public class ManagerDto { private Long id; - private List notices = new ArrayList<>(); private String name; private String email; private String department; public static ManagerDto from (Manager manager){ - return new ManagerDto(manager.getId(), manager.getNotices(), manager.getName(), + return new ManagerDto(manager.getId(), manager.getName(), manager.getEmail(), manager.getDepartment()); } diff --git a/src/main/java/com/server/hispath/manager/domain/Manager.java b/src/main/java/com/server/hispath/manager/domain/Manager.java index a8e8388..1ddec0d 100644 --- a/src/main/java/com/server/hispath/manager/domain/Manager.java +++ b/src/main/java/com/server/hispath/manager/domain/Manager.java @@ -27,6 +27,7 @@ public class Manager extends BaseEntity { private String email; private String department; + private boolean approved; } diff --git a/src/main/java/com/server/hispath/notice/domain/Notice.java b/src/main/java/com/server/hispath/notice/domain/Notice.java index 35fbc40..7808eaa 100644 --- a/src/main/java/com/server/hispath/notice/domain/Notice.java +++ b/src/main/java/com/server/hispath/notice/domain/Notice.java @@ -48,8 +48,6 @@ public class Notice extends BaseEntity { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") private LocalDate expDate; - // repository에서 contentdto로 받아오고 manager와 같이 받아서 notice build - public static Notice from(Manager manager, NoticeContentDto dto) { return Notice.builder() .manager(manager) diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index 124988e..774c332 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -9,6 +9,7 @@ import com.server.hispath.category.domain.Category; import com.server.hispath.activity.domain.Activity; import com.server.hispath.common.BaseEntity; +import com.server.hispath.department.domain.Department; import com.server.hispath.major.domain.Major; import com.server.hispath.student.application.dto.StudentDto; import com.server.hispath.student.domain.participate.Participant; @@ -57,6 +58,9 @@ public class Student extends BaseEntity { private LocalDateTime lastLoginDate; + @ManyToOne(fetch = FetchType.LAZY) + private Department department; + @OneToMany(mappedBy = "student", cascade = CascadeType.PERSIST, orphanRemoval = true) private List participants = new ArrayList<>(); From 71f0cb6641de81cafae3d0028bbda8c8b7453339 Mon Sep 17 00:00:00 2001 From: lukehongg Date: Tue, 4 Oct 2022 15:06:18 +0900 Subject: [PATCH 041/148] =?UTF-8?q?=EA=B3=B5=EC=A7=80&=EB=A7=A4=EB=8B=88?= =?UTF-8?q?=EC=A0=80=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/hispath/common/TestController.java | 144 +++++++++++++++++- .../hispath/manager/domain/Manager.java | 8 + 2 files changed, 151 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 0bbc236..6e87f6e 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -1,17 +1,26 @@ package com.server.hispath.common; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.Month; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.category.domain.Category; import com.server.hispath.category.domain.repository.CategoryRepository; +import com.server.hispath.exception.manager.ManagerNotFoundException; import com.server.hispath.major.domain.repository.MajorRepository; +import com.server.hispath.manager.domain.Manager; +import com.server.hispath.manager.domain.repository.ManagerRepository; +import com.server.hispath.notice.domain.Notice; import com.server.hispath.notice.domain.repository.NoticeRepository; import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; +import lombok.Builder; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,6 +29,7 @@ import lombok.RequiredArgsConstructor; @RestController +@Builder @RequiredArgsConstructor @RequestMapping("/test") public class TestController { @@ -29,6 +39,8 @@ public class TestController { private final ActivityService activityService; private final NoticeRepository noticeRepository; private final MajorRepository majorRepository; + private final ManagerRepository managerRepository; + @GetMapping("/register/ref") public ResponseEntity testRegisterRefStudent() { @@ -70,4 +82,134 @@ public ResponseEntity testCategoryInit() { return ResponseEntity.ok(null); } -} + + @GetMapping("/init/manager") + public ResponseEntity initManager(){ + + managerRepository.save(Manager.builder() + .name("Adam") + .email("Adams@handong.ac.kr") + .department("CSEE") + .approved(true).build()); + + managerRepository.save(Manager.builder() + .name("Boyci") + .email("BCI@handong.ac.kr") + .department("GLS") + .approved(true).build()); + + managerRepository.save(Manager.builder() + .name("Charlie") + .email("Chars@handong.ac.kr") + .department("ME") + .approved(true).build()); + + managerRepository.save(Manager.builder() + .name("David") + .email("Dvd@handong.ac.kr") + .department("CSEE") + .approved(true).build()); + + managerRepository.save(Manager.builder() + .name("Ethen") + .email("Eth@handong.ac.kr") + .department("GLS") + .approved(false).build()); + + managerRepository.save(Manager.builder() + .name("Jenny") + .email("jenny@handong.ac.kr") + .department("CUD") + .approved(false).build()); + + managerRepository.save(Manager.builder() + .name("Lucy") + .email("lucc@handong.ac.kr") + .department("CSEE") + .approved(true).build()); + + return ResponseEntity.ok(null); + } + + @GetMapping("/init/notice") + public ResponseEntity initNotice(){ + List l = new ArrayList(); + for(Long i = Long.valueOf(1); i<8; i++){ + Manager temp = managerRepository.findById(i).orElseThrow(ManagerNotFoundException::new); + l.add(temp); + } + + noticeRepository.save(Notice.builder() + .manager(l.get(1)) + .title("Welcome to notice") + .content("This is the first notice") + .viewCnt(100) + .importance(true) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 5)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 12)) + .build()); + + noticeRepository.save(Notice.builder() + .manager(l.get(2)) + .title("Second notice") + .content("This is the second notice") + .viewCnt(90) + .importance(false) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 6)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 18)) + .build()); + + noticeRepository.save(Notice.builder() + .manager(l.get(3)) + .title("SW festival") + .content("This is the third notice") + .viewCnt(50) + .importance(false) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 9)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 20)) + .build()); + + noticeRepository.save(Notice.builder() + .manager(l.get(4)) + .title("Capstone festival") + .content("Capstone festival in November") + .viewCnt(80) + .importance(true) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 5)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 30)) + .build()); + + noticeRepository.save(Notice.builder() + .manager(l.get(5)) + .title("GongPgi festival") + .content("GongPgi festival in October") + .viewCnt(100) + .importance(true) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 20)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 27)) + .build()); + + noticeRepository.save(Notice.builder() + .manager(l.get(2)) + .title("CSEE lecture") + .content("At october 17 in NTH 313") + .viewCnt(56) + .importance(false) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 18)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 25)) + .build()); + + noticeRepository.save(Notice.builder() + .manager(l.get(5)) + .title("SW news for October") + .content("Is coming soon!") + .viewCnt(1004) + .importance(true) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 7)) + .expDate(LocalDate.of(2022, Month.OCTOBER, 12)) + .build()); + return ResponseEntity.ok(null); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/server/hispath/manager/domain/Manager.java b/src/main/java/com/server/hispath/manager/domain/Manager.java index 1ddec0d..ed7f555 100644 --- a/src/main/java/com/server/hispath/manager/domain/Manager.java +++ b/src/main/java/com/server/hispath/manager/domain/Manager.java @@ -4,9 +4,13 @@ import java.util.List; import javax.persistence.*; +import com.server.hispath.category.application.dto.CategoryCUDto; +import com.server.hispath.category.domain.Category; import com.server.hispath.common.BaseEntity; import com.server.hispath.notice.domain.Notice; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; @@ -14,7 +18,9 @@ @Entity @Getter +@Builder @NoArgsConstructor +@AllArgsConstructor @Where(clause = "deleted = false") @SQLDelete(sql = "UPDATE manager SET deleted = true Where id = ?") public class Manager extends BaseEntity { @@ -30,4 +36,6 @@ public class Manager extends BaseEntity { private boolean approved; + + } From 662423a336119c9b65c1037e289a72de900acc86 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Tue, 4 Oct 2022 16:19:15 +0900 Subject: [PATCH 042/148] =?UTF-8?q?[#11]=20:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=20API=20=EA=B5=AC=ED=98=84,=20JWT=20API=20=EC=9D=B8=EA=B0=80?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#11] : Oauth, WebFlux, JWT 관련 dependency 추가 * feat[#11] : JWT, Custom annotation을 통한 Authorization 기능 구현 * feat[#11] : 로그인시 로그인 횟수 update 구현 --- build.gradle | 5 + .../server/hispath/HispathApplication.java | 4 - .../hispath/auth/application/AuthService.java | 96 +++++++++++++++++++ .../auth/application/dto/LoginRequestDto.java | 19 ++++ .../application/dto/LoginResponseDto.java | 11 +++ .../hispath/auth/domain/LoginManager.java | 13 +++ .../hispath/auth/domain/LoginStudent.java | 14 +++ .../hispath/auth/domain/ManagerLogin.java | 11 +++ .../server/hispath/auth/domain/Member.java | 15 +++ .../hispath/auth/domain/OauthAttributes.java | 31 ++++++ .../hispath/auth/domain/OauthProperties.java | 39 ++++++++ .../hispath/auth/domain/OauthProvider.java | 18 ++++ .../hispath/auth/domain/OauthUserInfo.java | 10 ++ .../auth/domain/RequiredManagerLogin.java | 11 +++ .../auth/domain/RequiredStudentLogin.java | 11 +++ .../hispath/auth/domain/StudentLogin.java | 11 +++ .../auth/infrastructure/ApiRequester.java | 85 ++++++++++++++++ .../auth/infrastructure/JwtProvider.java | 81 ++++++++++++++++ .../auth/infrastructure/OauthHandler.java | 29 ++++++ .../auth/presentation/AuthController.java | 32 +++++++ .../auth/presentation/LoginInterceptor.java | 47 +++++++++ .../LoginManagerArgumentResolver.java | 37 +++++++ .../LoginStudentArgumentResolver.java | 36 +++++++ .../presentation/response/TokenResponse.java | 18 ++++ .../server/hispath/common/TestController.java | 17 +++- .../server/hispath/config/OauthConfig.java | 28 ++++++ .../com/server/hispath/config/WebConfig.java | 41 ++++++++ .../exception/MyPathLoginException.java | 16 ++++ .../authorization/AuthorizationException.java | 12 +++ .../AuthorizationHeaderException.java | 9 ++ .../authorization/InvalidTokenException.java | 9 ++ .../oauth/GetAccessTokenException.java | 10 ++ .../exception/oauth/GetUserInfoException.java | 9 ++ .../oauth/InvalidTokenException.java | 9 ++ .../oauth/NoSuchOAuthMemberException.java | 16 ++++ .../oauth/NotHandongEmailException.java | 9 ++ .../oauth/OAuthLoginFailErrorResponse.java | 19 ++++ .../exception/oauth/OauthException.java | 12 +++ .../UnableToGetOauthResponseException.java | 9 ++ .../UnsupportedOauthProviderException.java | 10 ++ .../domain/repository/ManagerRepository.java | 4 + .../hispath/student/domain/Student.java | 11 ++- .../domain/repository/StudentRepository.java | 2 + .../hispath/util/AuthorizationExtractor.java | 26 +++++ 44 files changed, 955 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/server/hispath/auth/application/AuthService.java create mode 100644 src/main/java/com/server/hispath/auth/application/dto/LoginRequestDto.java create mode 100644 src/main/java/com/server/hispath/auth/application/dto/LoginResponseDto.java create mode 100644 src/main/java/com/server/hispath/auth/domain/LoginManager.java create mode 100644 src/main/java/com/server/hispath/auth/domain/LoginStudent.java create mode 100644 src/main/java/com/server/hispath/auth/domain/ManagerLogin.java create mode 100644 src/main/java/com/server/hispath/auth/domain/Member.java create mode 100644 src/main/java/com/server/hispath/auth/domain/OauthAttributes.java create mode 100644 src/main/java/com/server/hispath/auth/domain/OauthProperties.java create mode 100644 src/main/java/com/server/hispath/auth/domain/OauthProvider.java create mode 100644 src/main/java/com/server/hispath/auth/domain/OauthUserInfo.java create mode 100644 src/main/java/com/server/hispath/auth/domain/RequiredManagerLogin.java create mode 100644 src/main/java/com/server/hispath/auth/domain/RequiredStudentLogin.java create mode 100644 src/main/java/com/server/hispath/auth/domain/StudentLogin.java create mode 100644 src/main/java/com/server/hispath/auth/infrastructure/ApiRequester.java create mode 100644 src/main/java/com/server/hispath/auth/infrastructure/JwtProvider.java create mode 100644 src/main/java/com/server/hispath/auth/infrastructure/OauthHandler.java create mode 100644 src/main/java/com/server/hispath/auth/presentation/AuthController.java create mode 100644 src/main/java/com/server/hispath/auth/presentation/LoginInterceptor.java create mode 100644 src/main/java/com/server/hispath/auth/presentation/LoginManagerArgumentResolver.java create mode 100644 src/main/java/com/server/hispath/auth/presentation/LoginStudentArgumentResolver.java create mode 100644 src/main/java/com/server/hispath/auth/presentation/response/TokenResponse.java create mode 100644 src/main/java/com/server/hispath/config/OauthConfig.java create mode 100644 src/main/java/com/server/hispath/config/WebConfig.java create mode 100644 src/main/java/com/server/hispath/exception/MyPathLoginException.java create mode 100644 src/main/java/com/server/hispath/exception/authorization/AuthorizationException.java create mode 100644 src/main/java/com/server/hispath/exception/authorization/AuthorizationHeaderException.java create mode 100644 src/main/java/com/server/hispath/exception/authorization/InvalidTokenException.java create mode 100644 src/main/java/com/server/hispath/exception/oauth/GetAccessTokenException.java create mode 100644 src/main/java/com/server/hispath/exception/oauth/GetUserInfoException.java create mode 100644 src/main/java/com/server/hispath/exception/oauth/InvalidTokenException.java create mode 100644 src/main/java/com/server/hispath/exception/oauth/NoSuchOAuthMemberException.java create mode 100644 src/main/java/com/server/hispath/exception/oauth/NotHandongEmailException.java create mode 100644 src/main/java/com/server/hispath/exception/oauth/OAuthLoginFailErrorResponse.java create mode 100644 src/main/java/com/server/hispath/exception/oauth/OauthException.java create mode 100644 src/main/java/com/server/hispath/exception/oauth/UnableToGetOauthResponseException.java create mode 100644 src/main/java/com/server/hispath/exception/oauth/UnsupportedOauthProviderException.java create mode 100644 src/main/java/com/server/hispath/util/AuthorizationExtractor.java diff --git a/build.gradle b/build.gradle index 237b604..d4e21ec 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,11 @@ dependencies { implementation group: 'org.apache.poi', name: 'poi', version: '4.1.2' implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '4.1.2' implementation group: 'commons-io', name: 'commons-io', version: '2.4' + implementation 'org.springframework.boot:spring-boot-configuration-processor' + annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" + implementation 'org.springframework.boot:spring-boot-starter-webflux' + implementation 'io.jsonwebtoken:jjwt:0.9.1' + implementation("io.netty:netty-resolver-dns-native-macos:4.1.75.Final:osx-aarch_64") compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' runtimeOnly 'mysql:mysql-connector-java' diff --git a/src/main/java/com/server/hispath/HispathApplication.java b/src/main/java/com/server/hispath/HispathApplication.java index 4587d44..13c7ac8 100644 --- a/src/main/java/com/server/hispath/HispathApplication.java +++ b/src/main/java/com/server/hispath/HispathApplication.java @@ -1,11 +1,7 @@ package com.server.hispath; -import com.server.hispath.notice.domain.Notice; -import com.server.hispath.notice.domain.repository.NoticeRepository; -import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication diff --git a/src/main/java/com/server/hispath/auth/application/AuthService.java b/src/main/java/com/server/hispath/auth/application/AuthService.java new file mode 100644 index 0000000..1c36848 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/application/AuthService.java @@ -0,0 +1,96 @@ +package com.server.hispath.auth.application; + +import java.util.Objects; +import java.util.Optional; + +import com.server.hispath.auth.application.dto.LoginRequestDto; +import com.server.hispath.auth.application.dto.LoginResponseDto; +import com.server.hispath.auth.domain.LoginManager; +import com.server.hispath.auth.domain.LoginStudent; +import com.server.hispath.auth.domain.Member; +import com.server.hispath.auth.domain.OauthUserInfo; +import com.server.hispath.auth.infrastructure.JwtProvider; +import com.server.hispath.auth.infrastructure.OauthHandler; +import com.server.hispath.exception.oauth.InvalidTokenException; +import com.server.hispath.exception.oauth.NotHandongEmailException; +import com.server.hispath.manager.application.ManagerService; +import com.server.hispath.manager.domain.Manager; +import com.server.hispath.manager.domain.repository.ManagerRepository; +import com.server.hispath.student.application.StudentService; +import com.server.hispath.student.domain.Student; +import com.server.hispath.student.domain.repository.StudentRepository; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Service +public class AuthService { + + private final OauthHandler oauthHandler; + private final JwtProvider jwtProvider; + private final StudentRepository studentRepository; + private final StudentService studentService; + private final ManagerRepository managerRepository; + private final ManagerService managerService; + + public void validateEamil(String email) { + String domain = email.split("@")[1]; + if(!Objects.equals(domain, "handong.ac.kr")){ + throw new NotHandongEmailException(); + }; + } + + public OauthUserInfo getUserInfo(LoginRequestDto loginRequestDto) { + String oauthProvider = loginRequestDto.getOauthProvider(); + return oauthHandler.getUserInfoFromCode(oauthProvider, loginRequestDto.getCode()); + } + + @Transactional(readOnly = true) + public LoginResponseDto studentLogin(LoginRequestDto loginRequestDto) { + OauthUserInfo userInfo = getUserInfo(loginRequestDto); + String email = userInfo.getEmail(); + validateEamil(email); + Optional student = studentRepository.findByEmail(email); + return student.map(value -> new LoginResponseDto(false, + jwtProvider.createToken(String.valueOf(value.getId()), Member.STUDENT))) + .orElseGet(() -> new LoginResponseDto(true, null)); + } + + @Transactional(readOnly = true) + public LoginResponseDto managerLogin(LoginRequestDto loginRequestDto) { + OauthUserInfo userInfo = getUserInfo(loginRequestDto); + String email = userInfo.getEmail(); + Optional manager = managerRepository.findByEmail(email); + return manager.map(value -> new LoginResponseDto(value.isApproved(), + jwtProvider.createToken(String.valueOf(value.getId()), Member.MANAGER))) + .orElseGet(() -> new LoginResponseDto(true, null)); + + } + + @Transactional(readOnly = true) + public LoginStudent findStudentByToken(String token) { + if (!jwtProvider.isValidToken(token, Member.STUDENT)) { + throw new InvalidTokenException(); + } + + String payLoad = jwtProvider.getPayLoad(token, Member.STUDENT); + Long id = Long.parseLong(payLoad); + Student student = studentService.findById(id); + student.updateLogin(); + return new LoginStudent(student.getId(), student.getStudentNum()); + } + + @Transactional(readOnly = true) + public LoginManager findManagerByToken(String token) { + if (!jwtProvider.isValidToken(token, Member.MANAGER)) { + throw new InvalidTokenException(); + } + String payLoad = jwtProvider.getPayLoad(token, Member.MANAGER); + Long id = Long.parseLong(payLoad); + Manager manager = managerService.findById(id); + return new LoginManager(manager.getId()); + } +} diff --git a/src/main/java/com/server/hispath/auth/application/dto/LoginRequestDto.java b/src/main/java/com/server/hispath/auth/application/dto/LoginRequestDto.java new file mode 100644 index 0000000..0c7911d --- /dev/null +++ b/src/main/java/com/server/hispath/auth/application/dto/LoginRequestDto.java @@ -0,0 +1,19 @@ +package com.server.hispath.auth.application.dto; + +import java.util.Locale; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class LoginRequestDto { + private String oauthProvider; + private String code; + + public String getOauthProvider() { + return oauthProvider.toLowerCase(Locale.ROOT); + } + + public String getCode() { + return code; + } +} diff --git a/src/main/java/com/server/hispath/auth/application/dto/LoginResponseDto.java b/src/main/java/com/server/hispath/auth/application/dto/LoginResponseDto.java new file mode 100644 index 0000000..a934359 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/application/dto/LoginResponseDto.java @@ -0,0 +1,11 @@ +package com.server.hispath.auth.application.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class LoginResponseDto { + private boolean needRegister; + private String token; +} diff --git a/src/main/java/com/server/hispath/auth/domain/LoginManager.java b/src/main/java/com/server/hispath/auth/domain/LoginManager.java new file mode 100644 index 0000000..5990931 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/LoginManager.java @@ -0,0 +1,13 @@ +package com.server.hispath.auth.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +public class LoginManager { + + private Long id; +} diff --git a/src/main/java/com/server/hispath/auth/domain/LoginStudent.java b/src/main/java/com/server/hispath/auth/domain/LoginStudent.java new file mode 100644 index 0000000..1863fbc --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/LoginStudent.java @@ -0,0 +1,14 @@ +package com.server.hispath.auth.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +public class LoginStudent { + + private Long id; + private String studentNum; +} diff --git a/src/main/java/com/server/hispath/auth/domain/ManagerLogin.java b/src/main/java/com/server/hispath/auth/domain/ManagerLogin.java new file mode 100644 index 0000000..3a3ab3c --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/ManagerLogin.java @@ -0,0 +1,11 @@ +package com.server.hispath.auth.domain; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface ManagerLogin { +} diff --git a/src/main/java/com/server/hispath/auth/domain/Member.java b/src/main/java/com/server/hispath/auth/domain/Member.java new file mode 100644 index 0000000..766ed60 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/Member.java @@ -0,0 +1,15 @@ +package com.server.hispath.auth.domain; + +import java.util.Objects; + +public enum Member { + STUDENT, MANAGER; + + public static boolean isStudent(Member member){ + return member.equals(STUDENT); + } + + public static boolean isManager(Member member){ + return member.equals(MANAGER); + } +} diff --git a/src/main/java/com/server/hispath/auth/domain/OauthAttributes.java b/src/main/java/com/server/hispath/auth/domain/OauthAttributes.java new file mode 100644 index 0000000..1ba46fa --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/OauthAttributes.java @@ -0,0 +1,31 @@ +package com.server.hispath.auth.domain; + +import java.util.Arrays; +import java.util.Map; + +public enum OauthAttributes { + GOOGLE("google") { + @Override + public OauthUserInfo of(Map attributes) { + return OauthUserInfo.builder() + .email((String) attributes.get("email")) + .build(); + } + }; + + private final String providerName; + + OauthAttributes(String name) { + this.providerName = name; + } + + public static OauthUserInfo extract(String providerName, Map attributes) { + return Arrays.stream(values()) + .filter(provider -> providerName.equals(provider.providerName)) + .findFirst() + .orElseThrow(IllegalArgumentException::new) + .of(attributes); + } + + public abstract OauthUserInfo of(Map attributes); +} diff --git a/src/main/java/com/server/hispath/auth/domain/OauthProperties.java b/src/main/java/com/server/hispath/auth/domain/OauthProperties.java new file mode 100644 index 0000000..b92c663 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/OauthProperties.java @@ -0,0 +1,39 @@ +package com.server.hispath.auth.domain; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@ConfigurationProperties(prefix = "oauth2") +public class OauthProperties { + + private final Map user = new HashMap<>(); + private final Map provider = new HashMap<>(); + + @Getter + @Setter + public static class User { + private String clientId; + private String clientSecret; + private String redirectUri; + } + + @Getter + @Setter + public static class Provider { + private String tokenUri; + private String userInfoUri; + } + + public Map getOauthProviders() { + Map oauthProviders = new HashMap<>(); + user.forEach((key, value) -> oauthProviders.put(key, new OauthProvider(value, provider.get(key)))); + + return oauthProviders; + } +} diff --git a/src/main/java/com/server/hispath/auth/domain/OauthProvider.java b/src/main/java/com/server/hispath/auth/domain/OauthProvider.java new file mode 100644 index 0000000..eacee41 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/OauthProvider.java @@ -0,0 +1,18 @@ +package com.server.hispath.auth.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class OauthProvider { + private final String clientId; + private final String clientSecret; + private final String redirectUrl; + private final String tokenUrl; + private final String userInfoUrl; + + public OauthProvider(OauthProperties.User user, OauthProperties.Provider provider) { + this(user.getClientId(), user.getClientSecret(), user.getRedirectUri(), provider.getTokenUri(), provider.getUserInfoUri()); + } +} diff --git a/src/main/java/com/server/hispath/auth/domain/OauthUserInfo.java b/src/main/java/com/server/hispath/auth/domain/OauthUserInfo.java new file mode 100644 index 0000000..89a4e54 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/OauthUserInfo.java @@ -0,0 +1,10 @@ +package com.server.hispath.auth.domain; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class OauthUserInfo { + private String email; +} diff --git a/src/main/java/com/server/hispath/auth/domain/RequiredManagerLogin.java b/src/main/java/com/server/hispath/auth/domain/RequiredManagerLogin.java new file mode 100644 index 0000000..3476326 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/RequiredManagerLogin.java @@ -0,0 +1,11 @@ +package com.server.hispath.auth.domain; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface RequiredManagerLogin { +} diff --git a/src/main/java/com/server/hispath/auth/domain/RequiredStudentLogin.java b/src/main/java/com/server/hispath/auth/domain/RequiredStudentLogin.java new file mode 100644 index 0000000..ec65040 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/RequiredStudentLogin.java @@ -0,0 +1,11 @@ +package com.server.hispath.auth.domain; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface RequiredStudentLogin { +} diff --git a/src/main/java/com/server/hispath/auth/domain/StudentLogin.java b/src/main/java/com/server/hispath/auth/domain/StudentLogin.java new file mode 100644 index 0000000..d830732 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/StudentLogin.java @@ -0,0 +1,11 @@ +package com.server.hispath.auth.domain; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface StudentLogin { +} diff --git a/src/main/java/com/server/hispath/auth/infrastructure/ApiRequester.java b/src/main/java/com/server/hispath/auth/infrastructure/ApiRequester.java new file mode 100644 index 0000000..c5d9873 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/infrastructure/ApiRequester.java @@ -0,0 +1,85 @@ +package com.server.hispath.auth.infrastructure; + +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.Map; + +import com.server.hispath.auth.domain.OauthProvider; +import com.server.hispath.exception.oauth.GetAccessTokenException; +import com.server.hispath.exception.oauth.GetUserInfoException; +import com.server.hispath.exception.oauth.UnableToGetOauthResponseException; + +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.reactive.function.client.WebClient; + +import reactor.core.publisher.Mono; + +public class ApiRequester { + + public Map getUserInfo(String code, OauthProvider oauthProvider) { + String token = getToken(code, oauthProvider); + return getUserInfoByToken(token, oauthProvider.getUserInfoUrl()); + } + + private String getToken(String code, OauthProvider oauthProvider) { + Map responseBody = WebClient.create() + .post() + .uri(oauthProvider.getTokenUrl()) + .headers(header -> { + header.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + header.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + header.setAcceptCharset(Collections.singletonList(StandardCharsets.UTF_8)); + }) + .bodyValue(tokenRequest(code, oauthProvider)) + .retrieve() + .onStatus(HttpStatus::isError, response -> + response.bodyToMono(String.class) + .flatMap(error -> Mono.error(new UnableToGetOauthResponseException(error)))) + .bodyToMono(new ParameterizedTypeReference>() { + }) + .flux() + .toStream() + .findFirst() + .orElseThrow(GetAccessTokenException::new); + validateResponseBody(responseBody); + return responseBody.get("access_token").toString(); + } + + private MultiValueMap tokenRequest(String code, OauthProvider oauthProvider) { + MultiValueMap formData = new LinkedMultiValueMap<>(); + formData.add("code", code); + formData.add("grant_type", "authorization_code"); + formData.add("redirect_uri", oauthProvider.getRedirectUrl()); + formData.add("client_id", oauthProvider.getClientId()); + formData.add("client_secret", oauthProvider.getClientSecret()); + return formData; + } + + private void validateResponseBody(Map responseBody) { + if (!responseBody.containsKey("access_token")) { + throw new GetAccessTokenException(); + } + } + + private static Map getUserInfoByToken(String token, String userInfoUri) { + + return WebClient.create() + .get() + .uri(userInfoUri) + .headers(httpHeaders -> httpHeaders.setBearerAuth(token)) + .retrieve() + .onStatus(HttpStatus::isError, response -> + response.bodyToMono(String.class) + .flatMap(error -> Mono.error(new UnableToGetOauthResponseException(error)))) + .bodyToMono(new ParameterizedTypeReference>() { + }) + .flux() + .toStream() + .findFirst() + .orElseThrow(GetUserInfoException::new); + } +} diff --git a/src/main/java/com/server/hispath/auth/infrastructure/JwtProvider.java b/src/main/java/com/server/hispath/auth/infrastructure/JwtProvider.java new file mode 100644 index 0000000..e027066 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/infrastructure/JwtProvider.java @@ -0,0 +1,81 @@ +package com.server.hispath.auth.infrastructure; + +import java.util.Date; + +import com.server.hispath.auth.domain.Member; +import com.server.hispath.exception.authorization.InvalidTokenException; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import io.jsonwebtoken.*; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Component +public class JwtProvider { + + @Value("${jwt.student-secret-key}") + private String studentSecretKey; + + @Value("${jwt.manager-secret-key}") + private String managerSecretKey; + + @Value("${jwt.expired-time}") + private Long expiredTime; + + public String createToken(String payload, Member member) { + Date now = new Date(); + Date expiredDay = new Date(now.getTime() + expiredTime); + Claims claims = Jwts.claims().setSubject(payload); + + return Jwts.builder() + .setIssuedAt(now) + .setIssuer("MyPath") + .setExpiration(expiredDay) + .setClaims(claims) + .signWith(SignatureAlgorithm.HS256, getSecretKey(member)) + .compact(); + + } + + public String getSecretKey(Member member){ + if(Member.isStudent(member)) return studentSecretKey; + return managerSecretKey; + } + + public void validateToken(String token, Member member) { + try { + JwtParser jwtParser = getJwtParser(member); + jwtParser.parseClaimsJws(token); + } catch (JwtException | IllegalArgumentException e) { + throw new InvalidTokenException(); + } + } + + public String getPayLoad(String token, Member member) { + JwtParser jwtParser = getJwtParser(member); + return jwtParser.parseClaimsJws(token) + .getBody() + .getSubject(); + } + + private JwtParser getJwtParser(Member member) { + return Jwts.parser() + .setSigningKey(getSecretKey(member)); + } + + public boolean isValidToken(String token, Member member) { + try { + validateToken(token, member); + return true; + } catch (InvalidTokenException e) { + return false; + } + } +} diff --git a/src/main/java/com/server/hispath/auth/infrastructure/OauthHandler.java b/src/main/java/com/server/hispath/auth/infrastructure/OauthHandler.java new file mode 100644 index 0000000..1a50217 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/infrastructure/OauthHandler.java @@ -0,0 +1,29 @@ +package com.server.hispath.auth.infrastructure; + +import java.util.Map; + +import com.server.hispath.auth.domain.OauthAttributes; +import com.server.hispath.auth.domain.OauthProvider; +import com.server.hispath.auth.domain.OauthUserInfo; +import com.server.hispath.exception.oauth.UnsupportedOauthProviderException; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class OauthHandler { + private final Map oauthProviders; + private final ApiRequester apiRequester; + + public OauthUserInfo getUserInfoFromCode(String oauthProvider, String code) { + OauthProvider oauth = getOauthProvider(oauthProvider); + Map attributes = apiRequester.getUserInfo(code, oauth); + return OauthAttributes.extract(oauthProvider, attributes); + } + + private OauthProvider getOauthProvider(String oauthProvider) { + if (!oauthProviders.containsKey(oauthProvider)) { + throw new UnsupportedOauthProviderException(); + } + return oauthProviders.get(oauthProvider); + } +} diff --git a/src/main/java/com/server/hispath/auth/presentation/AuthController.java b/src/main/java/com/server/hispath/auth/presentation/AuthController.java new file mode 100644 index 0000000..037c3ab --- /dev/null +++ b/src/main/java/com/server/hispath/auth/presentation/AuthController.java @@ -0,0 +1,32 @@ +package com.server.hispath.auth.presentation; + +import com.server.hispath.auth.application.AuthService; +import com.server.hispath.auth.application.dto.LoginRequestDto; +import com.server.hispath.auth.application.dto.LoginResponseDto; +import com.server.hispath.auth.presentation.response.TokenResponse; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +public class AuthController { + private final AuthService authService; + + @GetMapping("/auth/{oauthProvider}/login-student/token") + public ResponseEntity loginStudent(@PathVariable String oauthProvider, @RequestParam String code) { + + LoginResponseDto loginResponseDto = authService.studentLogin(new LoginRequestDto(oauthProvider, code)); + return ResponseEntity.ok(TokenResponse.from(loginResponseDto)); + } + + @GetMapping("/auth/{oauthProvider}/login-manager/token") + public ResponseEntity loginManager(@PathVariable String oauthProvider, @RequestParam String code) { + + LoginResponseDto loginResponseDto = authService.managerLogin(new LoginRequestDto(oauthProvider, code)); + return ResponseEntity.ok(TokenResponse.from(loginResponseDto)); + } +} \ No newline at end of file diff --git a/src/main/java/com/server/hispath/auth/presentation/LoginInterceptor.java b/src/main/java/com/server/hispath/auth/presentation/LoginInterceptor.java new file mode 100644 index 0000000..71fd82c --- /dev/null +++ b/src/main/java/com/server/hispath/auth/presentation/LoginInterceptor.java @@ -0,0 +1,47 @@ +package com.server.hispath.auth.presentation; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.server.hispath.auth.domain.Member; +import com.server.hispath.auth.domain.RequiredManagerLogin; +import com.server.hispath.auth.domain.RequiredStudentLogin; +import com.server.hispath.auth.infrastructure.JwtProvider; +import com.server.hispath.util.AuthorizationExtractor; + +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class LoginInterceptor implements HandlerInterceptor { + private final JwtProvider jwtProvider; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + if (isPreflight(request)) { + return true; + } + HandlerMethod handlerMethod = (HandlerMethod) handler; + if (!(handlerMethod.hasMethodAnnotation(RequiredStudentLogin.class) || handlerMethod.hasMethodAnnotation(RequiredManagerLogin.class))) { + return true; + } + String token = AuthorizationExtractor.extractAccessToken(request); + + if (handlerMethod.hasMethodAnnotation(RequiredStudentLogin.class)) { + jwtProvider.validateToken(token, Member.STUDENT); + } else if (handlerMethod.hasMethodAnnotation(RequiredManagerLogin.class)) { + jwtProvider.validateToken(token, Member.MANAGER); + } + + return true; + } + + private boolean isPreflight(HttpServletRequest request) { + return HttpMethod.OPTIONS.matches(request.getMethod()); + } +} \ No newline at end of file diff --git a/src/main/java/com/server/hispath/auth/presentation/LoginManagerArgumentResolver.java b/src/main/java/com/server/hispath/auth/presentation/LoginManagerArgumentResolver.java new file mode 100644 index 0000000..f1087f6 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/presentation/LoginManagerArgumentResolver.java @@ -0,0 +1,37 @@ +package com.server.hispath.auth.presentation; + +import java.util.Objects; +import javax.servlet.http.HttpServletRequest; + +import com.server.hispath.auth.application.AuthService; +import com.server.hispath.auth.domain.ManagerLogin; +import com.server.hispath.auth.domain.StudentLogin; +import com.server.hispath.util.AuthorizationExtractor; + +import org.springframework.core.MethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class LoginManagerArgumentResolver implements HandlerMethodArgumentResolver { + private final AuthService authService; + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.hasParameterAnnotation(ManagerLogin.class); + } + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { + String accessToken = AuthorizationExtractor + .extractAccessToken(Objects.requireNonNull(webRequest.getNativeRequest(HttpServletRequest.class))); + return authService.findManagerByToken(accessToken); + } +} diff --git a/src/main/java/com/server/hispath/auth/presentation/LoginStudentArgumentResolver.java b/src/main/java/com/server/hispath/auth/presentation/LoginStudentArgumentResolver.java new file mode 100644 index 0000000..fc25ff3 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/presentation/LoginStudentArgumentResolver.java @@ -0,0 +1,36 @@ +package com.server.hispath.auth.presentation; + +import java.util.Objects; +import javax.servlet.http.HttpServletRequest; + +import com.server.hispath.auth.application.AuthService; +import com.server.hispath.auth.domain.StudentLogin; +import com.server.hispath.util.AuthorizationExtractor; + +import org.springframework.core.MethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class LoginStudentArgumentResolver implements HandlerMethodArgumentResolver { + private final AuthService authService; + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.hasParameterAnnotation(StudentLogin.class); + } + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { + String accessToken = AuthorizationExtractor + .extractAccessToken(Objects.requireNonNull(webRequest.getNativeRequest(HttpServletRequest.class))); + return authService.findStudentByToken(accessToken); + } +} diff --git a/src/main/java/com/server/hispath/auth/presentation/response/TokenResponse.java b/src/main/java/com/server/hispath/auth/presentation/response/TokenResponse.java new file mode 100644 index 0000000..819d903 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/presentation/response/TokenResponse.java @@ -0,0 +1,18 @@ +package com.server.hispath.auth.presentation.response; + +import com.server.hispath.auth.application.dto.LoginResponseDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class TokenResponse { + private boolean needRegister; + private String token; + + public static TokenResponse from(LoginResponseDto loginResponseDto) { + return new TokenResponse(loginResponseDto.isNeedRegister(), loginResponseDto.getToken()); + } +} + diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 6e87f6e..bb1785d 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -9,6 +9,7 @@ import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.dto.ActivityContentDto; +import com.server.hispath.auth.domain.*; import com.server.hispath.category.domain.Category; import com.server.hispath.category.domain.repository.CategoryRepository; import com.server.hispath.exception.manager.ManagerNotFoundException; @@ -83,6 +84,21 @@ public ResponseEntity testCategoryInit() { return ResponseEntity.ok(null); } + @GetMapping("/student/auth") + @RequiredStudentLogin + public ResponseEntity testStudentAuth(@StudentLogin LoginStudent loginStudent){ + System.out.println(loginStudent.getId()); + System.out.println(loginStudent.getStudentNum()); + return ResponseEntity.ok(null); + } + + @GetMapping("/manager/auth") + @RequiredManagerLogin + public ResponseEntity testManagerAuth(@ManagerLogin LoginManager loginManager){ + System.out.println(loginManager.getId()); + return ResponseEntity.ok(null); + } + @GetMapping("/init/manager") public ResponseEntity initManager(){ @@ -211,5 +227,4 @@ public ResponseEntity initNotice(){ return ResponseEntity.ok(null); } - } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/config/OauthConfig.java b/src/main/java/com/server/hispath/config/OauthConfig.java new file mode 100644 index 0000000..9f2300d --- /dev/null +++ b/src/main/java/com/server/hispath/config/OauthConfig.java @@ -0,0 +1,28 @@ +package com.server.hispath.config; + +import java.util.Map; + +import com.server.hispath.auth.domain.OauthProperties; +import com.server.hispath.auth.domain.OauthProvider; +import com.server.hispath.auth.infrastructure.ApiRequester; +import com.server.hispath.auth.infrastructure.OauthHandler; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import lombok.RequiredArgsConstructor; + +@Configuration +@RequiredArgsConstructor +@EnableConfigurationProperties(OauthProperties.class) +public class OauthConfig { + + private final OauthProperties properties; + + @Bean + public OauthHandler oauthHandler() { + Map providers = properties.getOauthProviders(); + return new OauthHandler(providers, new ApiRequester()); + } +} diff --git a/src/main/java/com/server/hispath/config/WebConfig.java b/src/main/java/com/server/hispath/config/WebConfig.java new file mode 100644 index 0000000..ca7bf79 --- /dev/null +++ b/src/main/java/com/server/hispath/config/WebConfig.java @@ -0,0 +1,41 @@ +package com.server.hispath.config; + +import java.util.List; + +import com.server.hispath.auth.presentation.LoginInterceptor; +import com.server.hispath.auth.presentation.LoginManagerArgumentResolver; +import com.server.hispath.auth.presentation.LoginStudentArgumentResolver; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Configuration +public class WebConfig implements WebMvcConfigurer { + private final LoginInterceptor loginInterceptor; + private final LoginStudentArgumentResolver loginStudentArgumentResolver; + private final LoginManagerArgumentResolver loginManagerArgumentResolver; + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedMethods("*") + .allowedOrigins("http://localhost:3000", "http://localhost:8080"); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(loginInterceptor).addPathPatterns("/api/**"); + } + + @Override + public void addArgumentResolvers(List resolvers) { + resolvers.add(loginStudentArgumentResolver); + resolvers.add(loginManagerArgumentResolver); + } +} \ No newline at end of file diff --git a/src/main/java/com/server/hispath/exception/MyPathLoginException.java b/src/main/java/com/server/hispath/exception/MyPathLoginException.java new file mode 100644 index 0000000..fe3096e --- /dev/null +++ b/src/main/java/com/server/hispath/exception/MyPathLoginException.java @@ -0,0 +1,16 @@ +package com.server.hispath.exception; + +import org.springframework.http.HttpStatus; + +public class MyPathLoginException extends RuntimeException { + private final HttpStatus httpStatus; + + public MyPathLoginException(String message, HttpStatus httpStatus) { + super(message); + this.httpStatus = httpStatus; + } + + public HttpStatus getHttpStatus() { + return httpStatus; + } +} diff --git a/src/main/java/com/server/hispath/exception/authorization/AuthorizationException.java b/src/main/java/com/server/hispath/exception/authorization/AuthorizationException.java new file mode 100644 index 0000000..abf4062 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/authorization/AuthorizationException.java @@ -0,0 +1,12 @@ +package com.server.hispath.exception.authorization; + +import com.server.hispath.exception.MyPathLoginException; + +import org.springframework.http.HttpStatus; + +public abstract class AuthorizationException extends MyPathLoginException { + + protected AuthorizationException(String message, HttpStatus httpStatus) { + super(message, httpStatus); + } +} diff --git a/src/main/java/com/server/hispath/exception/authorization/AuthorizationHeaderException.java b/src/main/java/com/server/hispath/exception/authorization/AuthorizationHeaderException.java new file mode 100644 index 0000000..8bd90d4 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/authorization/AuthorizationHeaderException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.authorization; + +import org.springframework.http.HttpStatus; + +public class AuthorizationHeaderException extends AuthorizationException { + public AuthorizationHeaderException() { + super("로그인이 필요한 서비스입니다.", HttpStatus.UNAUTHORIZED); + } +} diff --git a/src/main/java/com/server/hispath/exception/authorization/InvalidTokenException.java b/src/main/java/com/server/hispath/exception/authorization/InvalidTokenException.java new file mode 100644 index 0000000..c2d5702 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/authorization/InvalidTokenException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.authorization; + +import org.springframework.http.HttpStatus; + +public class InvalidTokenException extends AuthorizationException { + public InvalidTokenException() { + super("로그인이 필요한 서비스입니다.", HttpStatus.UNAUTHORIZED); + } +} diff --git a/src/main/java/com/server/hispath/exception/oauth/GetAccessTokenException.java b/src/main/java/com/server/hispath/exception/oauth/GetAccessTokenException.java new file mode 100644 index 0000000..8d46e21 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/oauth/GetAccessTokenException.java @@ -0,0 +1,10 @@ +package com.server.hispath.exception.oauth; + +import org.springframework.http.HttpStatus; + +public class GetAccessTokenException extends OauthException { + + public GetAccessTokenException() { + super("소셜 로그인에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR); + } +} diff --git a/src/main/java/com/server/hispath/exception/oauth/GetUserInfoException.java b/src/main/java/com/server/hispath/exception/oauth/GetUserInfoException.java new file mode 100644 index 0000000..b95d708 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/oauth/GetUserInfoException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.oauth; + +import org.springframework.http.HttpStatus; + +public class GetUserInfoException extends OauthException { + public GetUserInfoException() { + super("소셜 로그인에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR); + } +} diff --git a/src/main/java/com/server/hispath/exception/oauth/InvalidTokenException.java b/src/main/java/com/server/hispath/exception/oauth/InvalidTokenException.java new file mode 100644 index 0000000..2c1093c --- /dev/null +++ b/src/main/java/com/server/hispath/exception/oauth/InvalidTokenException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.oauth; + +import org.springframework.http.HttpStatus; + +public class InvalidTokenException extends OauthException { + public InvalidTokenException() { + super("유효하지 않은 토큰입니다.", HttpStatus.UNAUTHORIZED); + } +} diff --git a/src/main/java/com/server/hispath/exception/oauth/NoSuchOAuthMemberException.java b/src/main/java/com/server/hispath/exception/oauth/NoSuchOAuthMemberException.java new file mode 100644 index 0000000..3ed0cf1 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/oauth/NoSuchOAuthMemberException.java @@ -0,0 +1,16 @@ +package com.server.hispath.exception.oauth; + +import org.springframework.http.HttpStatus; + +import lombok.Getter; + +@Getter +public class NoSuchOAuthMemberException extends OauthException { + + private final String email; + + public NoSuchOAuthMemberException(String email) { + super("소셜 로그인 회원이 아닙니다. 회원가입을 진행합니다.", HttpStatus.UNAUTHORIZED); + this.email = email; + } +} diff --git a/src/main/java/com/server/hispath/exception/oauth/NotHandongEmailException.java b/src/main/java/com/server/hispath/exception/oauth/NotHandongEmailException.java new file mode 100644 index 0000000..f893087 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/oauth/NotHandongEmailException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.oauth; + +import org.springframework.http.HttpStatus; + +public class NotHandongEmailException extends OauthException { + public NotHandongEmailException() { + super("한동대학교 메일이 아닙니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/exception/oauth/OAuthLoginFailErrorResponse.java b/src/main/java/com/server/hispath/exception/oauth/OAuthLoginFailErrorResponse.java new file mode 100644 index 0000000..106b945 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/oauth/OAuthLoginFailErrorResponse.java @@ -0,0 +1,19 @@ +package com.server.hispath.exception.oauth; + +import com.server.hispath.exception.ExceptionResponse; + +import lombok.Getter; + +@Getter +public class OAuthLoginFailErrorResponse extends ExceptionResponse { + private final String email; + + private OAuthLoginFailErrorResponse(String message, String email) { + super(message); + this.email = email; + } + + public static OAuthLoginFailErrorResponse from(NoSuchOAuthMemberException exception) { + return new OAuthLoginFailErrorResponse(exception.getMessage(), exception.getEmail()); + } +} diff --git a/src/main/java/com/server/hispath/exception/oauth/OauthException.java b/src/main/java/com/server/hispath/exception/oauth/OauthException.java new file mode 100644 index 0000000..ef3b66e --- /dev/null +++ b/src/main/java/com/server/hispath/exception/oauth/OauthException.java @@ -0,0 +1,12 @@ +package com.server.hispath.exception.oauth; + +import com.server.hispath.exception.MyPathLoginException; + +import org.springframework.http.HttpStatus; + +public abstract class OauthException extends MyPathLoginException { + + protected OauthException(String message, HttpStatus httpStatus) { + super(message, httpStatus); + } +} diff --git a/src/main/java/com/server/hispath/exception/oauth/UnableToGetOauthResponseException.java b/src/main/java/com/server/hispath/exception/oauth/UnableToGetOauthResponseException.java new file mode 100644 index 0000000..aed4135 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/oauth/UnableToGetOauthResponseException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.oauth; + +import org.springframework.http.HttpStatus; + +public class UnableToGetOauthResponseException extends OauthException { + public UnableToGetOauthResponseException(String message) { + super(message, HttpStatus.INTERNAL_SERVER_ERROR); + } +} diff --git a/src/main/java/com/server/hispath/exception/oauth/UnsupportedOauthProviderException.java b/src/main/java/com/server/hispath/exception/oauth/UnsupportedOauthProviderException.java new file mode 100644 index 0000000..3c81df2 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/oauth/UnsupportedOauthProviderException.java @@ -0,0 +1,10 @@ +package com.server.hispath.exception.oauth; + +import org.springframework.http.HttpStatus; + +public class UnsupportedOauthProviderException extends OauthException { + + public UnsupportedOauthProviderException() { + super("지원되지 않는 소셜로그인입니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/manager/domain/repository/ManagerRepository.java b/src/main/java/com/server/hispath/manager/domain/repository/ManagerRepository.java index d4abd84..734b2d4 100644 --- a/src/main/java/com/server/hispath/manager/domain/repository/ManagerRepository.java +++ b/src/main/java/com/server/hispath/manager/domain/repository/ManagerRepository.java @@ -1,8 +1,12 @@ package com.server.hispath.manager.domain.repository; +import java.util.Optional; + import com.server.hispath.manager.domain.Manager; import org.springframework.data.jpa.repository.JpaRepository; public interface ManagerRepository extends JpaRepository { + + Optional findByEmail(String email); } diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index 774c332..b0aca2d 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -68,11 +68,13 @@ public class Student extends BaseEntity { public void update(StudentDto dto) { this.name = dto.getName(); } + public static Student from(StudentDto dto) { return Student.builder() - .name(dto.getName()) - .build(); + .name(dto.getName()) + .build(); } + public boolean isNameMatch(String name) { return Objects.equals(this.name, name); } @@ -80,4 +82,9 @@ public boolean isNameMatch(String name) { public void addParticipant(Participant participant) { this.participants.add(participant); } + + public void updateLogin() { + loginCnt++; + lastLoginDate = LocalDateTime.now(); + } } diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java index b1f5441..4d22abb 100644 --- a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java @@ -9,4 +9,6 @@ public interface StudentRepository extends JpaRepository { Optional findByStudentNum(String studentNum); + + Optional findByEmail(String email); } diff --git a/src/main/java/com/server/hispath/util/AuthorizationExtractor.java b/src/main/java/com/server/hispath/util/AuthorizationExtractor.java new file mode 100644 index 0000000..d5ab61b --- /dev/null +++ b/src/main/java/com/server/hispath/util/AuthorizationExtractor.java @@ -0,0 +1,26 @@ +package com.server.hispath.util; + +import java.util.Enumeration; +import java.util.Locale; +import javax.servlet.http.HttpServletRequest; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class AuthorizationExtractor { + public static final String AUTHENTICATION_TYPE = "Bearer"; + public static final String AUTHORIZATION = "Authorization"; + + public static String extractAccessToken(HttpServletRequest request) { + Enumeration headers = request.getHeaders(AUTHORIZATION); + while (headers.hasMoreElements()) { + String value = headers.nextElement(); + if (value.toLowerCase(Locale.ROOT).startsWith(AUTHENTICATION_TYPE.toLowerCase(Locale.ROOT))) { + return value.split(" ")[1]; + } + } + return ""; + } +} + From 3727725ccf3efabd1686bf17ba9c57f7a318f74e Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Wed, 5 Oct 2022 09:24:27 +0900 Subject: [PATCH 043/148] =?UTF-8?q?[#18]=20:=20=EA=B4=80=EB=A6=AC=EC=9E=90?= =?UTF-8?q?=20=ED=99=9C=EB=8F=99=20=EC=A1=B0=ED=9A=8C=20API=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#19)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#18] : Excel 파일 넣었으면 Check 기능 추가 - Entity에 studentRegistered라는 field 추가 * feat[#18] : Dashboard중간 개발 다른 crud가 완성이 안되어 잠시 멈춘 다음에 마저 개발합니다. --- .../activity/application/dto/ActivityDto.java | 4 ++- .../hispath/activity/domain/Activity.java | 6 +++++ .../response/ActivityResponse.java | 4 ++- .../java/com/server/hispath/docs/ApiDoc.java | 1 + .../response/NoticeDashboardResponse.java | 19 ++++++++++++++ .../student/application/StudentService.java | 1 + .../student/application/dto/DashboardDto.java | 24 +++++++++++++++++ .../hispath/student/domain/Student.java | 4 +++ .../response/DashboardResponse.java | 26 +++++++++++++++++++ 9 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java create mode 100644 src/main/java/com/server/hispath/student/application/dto/DashboardDto.java create mode 100644 src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java index 3056356..227acc9 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java @@ -20,11 +20,13 @@ public class ActivityDto { private String name; private String remark; private int weight; + private boolean studentRegistered; private LocalDateTime startDate; private LocalDateTime endDate; public static ActivityDto from(Activity activity) { return new ActivityDto(activity.getId(), CategoryDto.from(activity.getCategory()), activity.getSemester(), - activity.isPersonal(), activity.getName(), activity.getRemark(), activity.getWeight(), activity.getStartDate(), activity.getEndDate()); + activity.isPersonal(), activity.getName(), activity.getRemark(), activity.getWeight(), + activity.isStudentRegistered(), activity.getStartDate(), activity.getEndDate()); } } diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 78c3c92..060ea2d 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -48,6 +48,8 @@ public class Activity extends BaseEntity { private String name; + private boolean studentRegistered = false; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") private LocalDateTime startDate; @@ -115,4 +117,8 @@ public void addParticipant(Student student) { this.participants.add(participant); student.addParticipant(participant); } + + public void updateStudentRegister() { + studentRegistered = true; + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java index 8f14a12..f95f4ad 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java @@ -21,6 +21,7 @@ public class ActivityResponse { private String name; private String remark; private int weight; + private boolean studentRegistered; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") private LocalDateTime startDate; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") @@ -28,6 +29,7 @@ public class ActivityResponse { public static ActivityResponse from(ActivityDto dto) { return new ActivityResponse(dto.getId(), dto.getCategoryDto().getId(), dto.getCategoryDto().getName(), - dto.getSemester(), dto.isPersonal(), dto.getName(), dto.getRemark(), dto.getWeight(), dto.getStartDate(), dto.getEndDate()); + dto.getSemester(), dto.isPersonal(), dto.getName(), dto.getRemark(), dto.getWeight(), + dto.isStudentRegistered(), dto.getStartDate(), dto.getEndDate()); } } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 10db619..77c4aef 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -41,5 +41,6 @@ public class ApiDoc { public static final String STUDENT_CREATE = "학생 추가"; public static final String STUDENT_UPDATE = "학생 수정"; public static final String STUDENT_DELETE = "학생 삭제"; + public static final String DASHBOARD = "메인페이지 대시보드 정보 조회"; } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java b/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java new file mode 100644 index 0000000..e4d2b74 --- /dev/null +++ b/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java @@ -0,0 +1,19 @@ +package com.server.hispath.notice.presentation.response; + +import java.time.LocalDateTime; + +import com.server.hispath.notice.application.dto.NoticeDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class NoticeDashboardResponse { + private Long noticeId; + private String title; + private LocalDateTime pubDate; + +} diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java index ca1685f..3879743 100644 --- a/src/main/java/com/server/hispath/student/application/StudentService.java +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -78,5 +78,6 @@ public void registerParticipants(Long activityId, List studentRef } activity.addParticipant(student); }); + activity.updateStudentRegister(); } } diff --git a/src/main/java/com/server/hispath/student/application/dto/DashboardDto.java b/src/main/java/com/server/hispath/student/application/dto/DashboardDto.java new file mode 100644 index 0000000..95d9990 --- /dev/null +++ b/src/main/java/com/server/hispath/student/application/dto/DashboardDto.java @@ -0,0 +1,24 @@ +package com.server.hispath.student.application.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class DashboardDto { + private Long id; + private String profile; + private String name; + private String studentNum; + private String major1; + private String major2; + private int semester; + private String email; + private String phone; + private String githubId; + private String blog; + private String readme; +} diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index b0aca2d..c775a79 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -38,6 +38,8 @@ public class Student extends BaseEntity { private String studentNum; + private int semester; + private String phone; private String email; @@ -58,6 +60,8 @@ public class Student extends BaseEntity { private LocalDateTime lastLoginDate; + private String readme; + @ManyToOne(fetch = FetchType.LAZY) private Department department; diff --git a/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java b/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java new file mode 100644 index 0000000..4972244 --- /dev/null +++ b/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java @@ -0,0 +1,26 @@ +package com.server.hispath.student.presentation.response; + +import com.server.hispath.notice.presentation.response.NoticeDashboardResponse; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class DashboardResponse { + private Long id; + private String profile; + private String name; + private String studentNum; + private String major1; + private String major2; + private int semester; + private String email; + private String phone; + private String githubId; + private String blog; + private String readme; + private NoticeDashboardResponse notice; +} From e7078b60fdfe9cfffa010115397c82733c5227d1 Mon Sep 17 00:00:00 2001 From: shinel98 <75024473+shinel98@users.noreply.github.com> Date: Wed, 5 Oct 2022 13:43:28 +0900 Subject: [PATCH 044/148] =?UTF-8?q?feat[#20]:=20major=20CRUD=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/ActivityService.java | 11 +++++ .../application/MActivityService.java | 2 + .../activity/application/dto/SemesterDto.java | 22 +++++++++ .../hispath/activity/domain/Activity.java | 2 +- .../domain/repository/ActivityRepository.java | 4 ++ .../presentation/ActivityController.java | 12 +++++ .../presentation/ActivityTestController.java | 39 ++++++++++++++++ .../response/SemesterResponse.java | 18 ++++++++ .../hispath/category/domain/Category.java | 1 - .../domain/repository/CategoryRepository.java | 2 + .../java/com/server/hispath/docs/ApiDoc.java | 8 ++++ .../major/application/MajorService.java | 35 +++++++++++++++ .../application/dto/MajorContentDto.java | 21 +++++++++ .../major/application/dto/MajorDto.java | 19 ++++++++ .../server/hispath/major/domain/Major.java | 26 +++++++++-- .../major/presentation/MajorController.java | 45 ++++++++++++++++++- .../presentation/MajorTestController.java | 39 ++++++++++++++++ .../presentation/request/MajorCURequest.java | 12 +++++ .../presentation/response/MajorResponse.java | 19 ++++++++ .../application/ScholarshipService.java | 34 ++++++++++++++ .../application/dto/ScholarshipCUDto.java | 16 +++++++ .../dto/ScholarshipContentDto.java | 21 +++++++++ .../scholarship/domain/Scholarship.java | 23 ++++++++++ .../repository/ScholarshipRepository.java | 9 ++++ .../presentation/ScholarshipController.java | 30 +++++++++++++ .../request/ScholarshipCURequest.java | 12 +++++ 26 files changed, 475 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/server/hispath/activity/application/dto/SemesterDto.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/ActivityTestController.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/SemesterResponse.java create mode 100644 src/main/java/com/server/hispath/major/application/dto/MajorContentDto.java create mode 100644 src/main/java/com/server/hispath/major/application/dto/MajorDto.java create mode 100644 src/main/java/com/server/hispath/major/presentation/MajorTestController.java create mode 100644 src/main/java/com/server/hispath/major/presentation/request/MajorCURequest.java create mode 100644 src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java create mode 100644 src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java create mode 100644 src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipCUDto.java create mode 100644 src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipContentDto.java create mode 100644 src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java create mode 100644 src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java create mode 100644 src/main/java/com/server/hispath/scholarship/presentation/request/ScholarshipCURequest.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index d98e84f..9d81aeb 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -1,10 +1,12 @@ package com.server.hispath.activity.application; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.activity.application.dto.ActivityDto; +import com.server.hispath.activity.application.dto.SemesterDto; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.category.application.CategoryService; @@ -63,4 +65,13 @@ public void delete(Long id){ public Activity findById(Long id) { return activityRepository.findById(id).orElseThrow(ActivityNotFoundException::new); } + + @Transactional(readOnly = true) + public List bringSemester() { + Optional semesters = activityRepository.bringSemester(); + return semesters.stream() + .map(SemesterDto::from) + .collect(Collectors.toList()); + + } } diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index 6d950cc..4e50c5a 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -66,6 +66,8 @@ public List findAllBySemester(String semester) { .collect(Collectors.toList()); } + + @Transactional public void deleteAllParticipant(Activity activity) { activity.getParticipants().forEach(BaseEntity::deleteContent); diff --git a/src/main/java/com/server/hispath/activity/application/dto/SemesterDto.java b/src/main/java/com/server/hispath/activity/application/dto/SemesterDto.java new file mode 100644 index 0000000..6414825 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/SemesterDto.java @@ -0,0 +1,22 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.activity.domain.Activity; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class SemesterDto { + private String semester; + + public static SemesterDto from(Activity activity) { + return new SemesterDto(activity.getSemester()); + } +} + + + diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 060ea2d..fd4e58c 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -34,7 +34,7 @@ public class Activity extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.LAZY , cascade = CascadeType.PERSIST ) private Category category; @NotNull diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java index 0a601ad..701e384 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -16,4 +16,8 @@ public interface ActivityRepository extends JpaRepository { "left join fetch p.student " + "where a.id = :id" ) Optional findActivityWithStudents(Long id); + + @Query("select distinct semester from Activity") + Optional bringSemester(); + } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index 5933219..1871f0d 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -6,8 +6,10 @@ import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.activity.application.dto.ActivityDto; +import com.server.hispath.activity.application.dto.SemesterDto; import com.server.hispath.activity.presentation.request.ActivityCURequest; import com.server.hispath.activity.presentation.response.ActivityResponse; +import com.server.hispath.activity.presentation.response.SemesterResponse; import com.server.hispath.docs.ApiDoc; import org.springframework.http.ResponseEntity; @@ -66,4 +68,14 @@ public ResponseEntity delete(@PathVariable Long id) { activityService.delete(id); return ResponseEntity.ok(id); } + + @GetMapping("/semester") + @ApiOperation(value = ApiDoc.ACTIVITY_READ_SEMESTER) + public ResponseEntity> findAllBySemester() { + List semesterDtos = activityService.bringSemester(); + List responses = semesterDtos.stream() + .map(SemesterResponse::from) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityTestController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityTestController.java new file mode 100644 index 0000000..161f0c8 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityTestController.java @@ -0,0 +1,39 @@ +package com.server.hispath.activity.presentation; + + +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.activity.domain.repository.ActivityRepository; +import com.server.hispath.category.domain.Category; +import com.server.hispath.category.domain.repository.CategoryRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/activity") +public class ActivityTestController { + + private final ActivityRepository activityRepository; + private final CategoryRepository categoryRepository; + + @GetMapping("/init") + public ResponseEntity testInit() { + activityRepository.save(Activity.builder().semester("2021-2").personal(false).remark("Spring 이용").requestStatus(200).name("(캠프)웹서비스 프로젝트(spring)_장소연").weight(3).category(categoryRepository.findByName("비교과-행사참여")).build()); + activityRepository.save(Activity.builder().semester("2022-2").personal(false).remark("우수상 수상").requestStatus(200).name("비즈플로우").weight(2).category(categoryRepository.findByName("비교과-행사참여")).build()); + activityRepository.save(Activity.builder().semester("2020-2").personal(false).remark("").requestStatus(200).name("(캠프)미리미리C 캠프_김광").weight(5).category(categoryRepository.findByName("비교과-행사참여")).build()); + activityRepository.save(Activity.builder().semester("2020-1").personal(false).remark("").requestStatus(200).name("C 프로그래밍").weight(1).category(categoryRepository.findByName("전공마일리지")).build()); + activityRepository.save(Activity.builder().semester("2021-1").personal(false).remark("").requestStatus(200).name("AI프로젝트 입문").weight(2).category(categoryRepository.findByName("전공마일리지")).build()); + activityRepository.save(Activity.builder().semester("2019-2").personal(false).remark("").requestStatus(200).name("(캠프)Advanced Flutter Camp_조성배").weight(4).category(categoryRepository.findByName("비교과-행사참여")).build()); + activityRepository.save(Activity.builder().semester("2019-1").personal(true).remark("").requestStatus(200).name("정보처리기사 자격증").weight(2).category(categoryRepository.findByName("기타")).build()); + activityRepository.save(Activity.builder().semester("2022-1").personal(false).remark("").requestStatus(200).name("공학프로젝트기획").weight(6).category(categoryRepository.findByName("전공마일리지")).build()); + activityRepository.save(Activity.builder().semester("2020-2").personal(false).remark("").requestStatus(200).name("캡스톤").weight(1).category(categoryRepository.findByName("전공마일리지")).build()); + activityRepository.save(Activity.builder().semester("2021-2").personal(false).remark("").requestStatus(200).name("프로그래밍 집중훈련 캠프_김호준").weight(7).category(categoryRepository.findByName("비교과-행사참여")).build()); + + + + return ResponseEntity.ok(null); + } +} diff --git a/src/main/java/com/server/hispath/activity/presentation/response/SemesterResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/SemesterResponse.java new file mode 100644 index 0000000..a750f22 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/SemesterResponse.java @@ -0,0 +1,18 @@ +package com.server.hispath.activity.presentation.response; + +import com.server.hispath.activity.application.dto.ActivityDto; +import com.server.hispath.activity.application.dto.SemesterDto; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class SemesterResponse { + private String semester; + + public static SemesterResponse from(SemesterDto dto) { + return new SemesterResponse(dto.getSemester()); + } +} diff --git a/src/main/java/com/server/hispath/category/domain/Category.java b/src/main/java/com/server/hispath/category/domain/Category.java index 8c41863..b372388 100644 --- a/src/main/java/com/server/hispath/category/domain/Category.java +++ b/src/main/java/com/server/hispath/category/domain/Category.java @@ -33,7 +33,6 @@ public class Category extends BaseEntity { @OneToMany(mappedBy = "category") private List activities = new ArrayList<>(); - public void update(CategoryCUDto dto) { this.name = dto.getName(); } diff --git a/src/main/java/com/server/hispath/category/domain/repository/CategoryRepository.java b/src/main/java/com/server/hispath/category/domain/repository/CategoryRepository.java index deffb0a..f24a613 100644 --- a/src/main/java/com/server/hispath/category/domain/repository/CategoryRepository.java +++ b/src/main/java/com/server/hispath/category/domain/repository/CategoryRepository.java @@ -5,4 +5,6 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface CategoryRepository extends JpaRepository { + Category findByName(String name); + } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 77c4aef..06382bb 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -27,6 +27,13 @@ public class ApiDoc { public static final String CATEGORY_UPDATE = "카테고리 수정"; public static final String CATEGORY_DELETE = "카테고리 삭제"; + public static final String SCHOLARSHIP_CREATE = "장학금 신청 등록"; + public static final String ACTIVITY_READ_SEMESTER = "활동 학기별 조회"; + public static final String MAJOR_CREATE = "전공 생성"; + public static final String MAJOR_READ = "단일 전공 조회"; + public static final String MAJOR_UPDATE = "전공 수정"; + public static final String MAJOR_DELETE = "전공 삭제"; + public static final String NOTICE_CREATE = "공지 생성"; public static final String NOTICE_READ_ALL = "전체 공지 조회"; public static final String NOTICE_READ = "단일 공지 조회"; @@ -43,4 +50,5 @@ public class ApiDoc { public static final String STUDENT_DELETE = "학생 삭제"; public static final String DASHBOARD = "메인페이지 대시보드 정보 조회"; + } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/major/application/MajorService.java b/src/main/java/com/server/hispath/major/application/MajorService.java index d22fe4e..e448879 100644 --- a/src/main/java/com/server/hispath/major/application/MajorService.java +++ b/src/main/java/com/server/hispath/major/application/MajorService.java @@ -1,15 +1,50 @@ package com.server.hispath.major.application; +import com.server.hispath.exception.major.MajorNotFoundException; +import com.server.hispath.major.application.dto.MajorContentDto; +import com.server.hispath.major.application.dto.MajorDto; +import com.server.hispath.major.domain.Major; import com.server.hispath.major.domain.repository.MajorRepository; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; +import javax.transaction.Transactional; + @Service @RequiredArgsConstructor public class MajorService { private final MajorRepository majorRepository; + @Transactional + public Long create(MajorContentDto dto) { + Major major = Major.from(dto); + Major savedMajor = majorRepository.save(major); + return savedMajor.getId(); + } + @Transactional + public MajorDto find(Long id) { + Major major = this.findById(id); + return MajorDto.from(major); + } + + @Transactional + public MajorDto update(Long id, MajorContentDto dto) { + Major major = this.findById(id); + major.update(dto); + + return MajorDto.from(major); + } + + @Transactional + public void delete(Long id){ + majorRepository.deleteById(id); + } + + public Major findById(Long id) { + return majorRepository.findById(id).orElseThrow(MajorNotFoundException::new); + } + } diff --git a/src/main/java/com/server/hispath/major/application/dto/MajorContentDto.java b/src/main/java/com/server/hispath/major/application/dto/MajorContentDto.java new file mode 100644 index 0000000..611ea94 --- /dev/null +++ b/src/main/java/com/server/hispath/major/application/dto/MajorContentDto.java @@ -0,0 +1,21 @@ +package com.server.hispath.major.application.dto; + +import com.server.hispath.major.presentation.request.MajorCURequest; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class MajorContentDto { + + private String majorName; + + + public static MajorContentDto from(MajorCURequest request) { + return new MajorContentDto(request.getMajorName()); + } +} diff --git a/src/main/java/com/server/hispath/major/application/dto/MajorDto.java b/src/main/java/com/server/hispath/major/application/dto/MajorDto.java new file mode 100644 index 0000000..a45377b --- /dev/null +++ b/src/main/java/com/server/hispath/major/application/dto/MajorDto.java @@ -0,0 +1,19 @@ +package com.server.hispath.major.application.dto; + +import com.server.hispath.major.domain.Major; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class MajorDto { + private Long id; + private String majorName; + + public static MajorDto from(Major major) { + return new MajorDto(major.getId(), major.getName()); + } +} diff --git a/src/main/java/com/server/hispath/major/domain/Major.java b/src/main/java/com/server/hispath/major/domain/Major.java index 679b58b..b8b25b2 100644 --- a/src/main/java/com/server/hispath/major/domain/Major.java +++ b/src/main/java/com/server/hispath/major/domain/Major.java @@ -1,12 +1,13 @@ package com.server.hispath.major.domain; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import javax.persistence.*; +import com.fasterxml.jackson.annotation.JsonFormat; import com.server.hispath.common.BaseEntity; + +import com.server.hispath.major.application.dto.MajorContentDto; + import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -14,9 +15,13 @@ import org.hibernate.annotations.SQLDelete; import org.hibernate.annotations.Where; +import java.time.LocalDate; + @Entity @Getter +@Builder @NoArgsConstructor +@AllArgsConstructor @Where(clause = "deleted = false") @SQLDelete(sql = "UPDATE major SET deleted = true Where id = ?") public class Major extends BaseEntity { @@ -27,4 +32,17 @@ public class Major extends BaseEntity { private String name; + public static Major from(MajorContentDto dto){ + return Major.builder() + .name(dto.getMajorName()) + .build(); + } + + public void update(MajorContentDto dto){ + this.name = dto.getMajorName(); + } + + + + } diff --git a/src/main/java/com/server/hispath/major/presentation/MajorController.java b/src/main/java/com/server/hispath/major/presentation/MajorController.java index 0a8d5ca..00ff3cf 100644 --- a/src/main/java/com/server/hispath/major/presentation/MajorController.java +++ b/src/main/java/com/server/hispath/major/presentation/MajorController.java @@ -1,14 +1,57 @@ package com.server.hispath.major.presentation; +import com.server.hispath.docs.ApiDoc; import com.server.hispath.major.application.MajorService; -import org.springframework.web.bind.annotation.RestController; +import com.server.hispath.major.application.dto.MajorContentDto; +import com.server.hispath.major.application.dto.MajorDto; +import com.server.hispath.major.presentation.request.MajorCURequest; +import com.server.hispath.major.presentation.response.MajorResponse; + +import io.swagger.annotations.ApiOperation; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; import lombok.RequiredArgsConstructor; +import java.sql.SQLOutput; + @RestController @RequiredArgsConstructor +@RequestMapping("/api") public class MajorController { private final MajorService majorService; + + @PostMapping("/major") + @ApiOperation(value = ApiDoc.MAJOR_CREATE) + public ResponseEntity create(@RequestBody MajorCURequest request) { + Long id = majorService.create(MajorContentDto.from(request)); + return ResponseEntity.ok(id); + } + + + @GetMapping("/major/{id}") + @ApiOperation(value = ApiDoc.MAJOR_READ) + public ResponseEntity find(@PathVariable Long id) { + MajorResponse response = MajorResponse.from(majorService.find(id)); + return ResponseEntity.ok(response); + } + + @PatchMapping("/major/{id}") + @ApiOperation(value= ApiDoc.MAJOR_UPDATE) + public ResponseEntity update(@PathVariable Long id, @RequestBody MajorCURequest request) { + MajorDto dto = majorService.update(id, MajorContentDto.from(request)); + MajorResponse response = MajorResponse.from(dto); + return ResponseEntity.ok(response); + } + + @DeleteMapping("/major/{id}") + @ApiOperation(value = ApiDoc.MAJOR_DELETE) + public ResponseEntity delete(@PathVariable Long id) { + majorService.delete(id); + return ResponseEntity.ok(id); + } + + } diff --git a/src/main/java/com/server/hispath/major/presentation/MajorTestController.java b/src/main/java/com/server/hispath/major/presentation/MajorTestController.java new file mode 100644 index 0000000..359041d --- /dev/null +++ b/src/main/java/com/server/hispath/major/presentation/MajorTestController.java @@ -0,0 +1,39 @@ +package com.server.hispath.major.presentation; + + +import com.server.hispath.major.domain.Major; +import com.server.hispath.major.domain.repository.MajorRepository; +import lombok.Builder; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + + +@RestController +@RequiredArgsConstructor +@RequestMapping("/major") +public class MajorTestController { + + private final MajorRepository majorRepository; + + @GetMapping("/init") + public ResponseEntity testInit() { + + majorRepository.save(Major.builder().name("AI컴퓨터공학심화").build()); + majorRepository.save(Major.builder().name("전자공학심화").build()); + majorRepository.save(Major.builder().name("국제지역학").build()); + majorRepository.save(Major.builder().name("국제관계학").build()); + majorRepository.save(Major.builder().name("경영학").build()); + majorRepository.save(Major.builder().name("언론정보학").build()); + majorRepository.save(Major.builder().name("법학").build()); + majorRepository.save(Major.builder().name("ICT융합전공").build()); + majorRepository.save(Major.builder().name("생명과학").build()); + majorRepository.save(Major.builder().name("경제학").build()); + + return ResponseEntity.ok(null); + } +} diff --git a/src/main/java/com/server/hispath/major/presentation/request/MajorCURequest.java b/src/main/java/com/server/hispath/major/presentation/request/MajorCURequest.java new file mode 100644 index 0000000..b275101 --- /dev/null +++ b/src/main/java/com/server/hispath/major/presentation/request/MajorCURequest.java @@ -0,0 +1,12 @@ +package com.server.hispath.major.presentation.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class MajorCURequest { + private String majorName; +} diff --git a/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java b/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java new file mode 100644 index 0000000..49403ef --- /dev/null +++ b/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java @@ -0,0 +1,19 @@ +package com.server.hispath.major.presentation.response; + + +import com.server.hispath.major.application.dto.MajorDto; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class MajorResponse { + private Long id; + private String majorName; + + public static MajorResponse from(MajorDto dto) { + return new MajorResponse(dto.getId(), dto.getMajorName()); + } +} diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java new file mode 100644 index 0000000..bd7282a --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -0,0 +1,34 @@ +package com.server.hispath.scholarship.application; + +import com.server.hispath.category.application.dto.CategoryContentDto; +import com.server.hispath.category.domain.Category; +import com.server.hispath.scholarship.application.dto.ScholarshipCUDto; +import com.server.hispath.scholarship.application.dto.ScholarshipContentDto; +import com.server.hispath.scholarship.domain.Scholarship; +import com.server.hispath.scholarship.domain.repository.ScholarshipRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class ScholarshipService { + private final ScholarshipRepository scholarshipRepository; + + @Transactional + public Long apply(ScholarshipCUDto dto){ + Scholarship savedScholarship = scholarshipRepository.save(Scholarship.from(dto)); + return savedScholarship.getId(); + } + + @Transactional + public List findAll() { + List scholarships = scholarshipRepository.findAll(); + return scholarships.stream() + .map(ScholarshipContentDto::from) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipCUDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipCUDto.java new file mode 100644 index 0000000..fa0d4de --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipCUDto.java @@ -0,0 +1,16 @@ +package com.server.hispath.scholarship.application.dto; + + +import com.server.hispath.scholarship.presentation.request.ScholarshipCURequest; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ScholarshipCUDto { + private String semester; + + public static ScholarshipCUDto of(ScholarshipCURequest request) { return new ScholarshipCUDto(request.getSemester());} +} diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipContentDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipContentDto.java new file mode 100644 index 0000000..b228cb3 --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipContentDto.java @@ -0,0 +1,21 @@ +package com.server.hispath.scholarship.application.dto; + +import com.server.hispath.scholarship.domain.Scholarship; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ScholarshipContentDto { + private Long id; + private String semester; + private int totalMileage; + private boolean approved; + + public static ScholarshipContentDto from(Scholarship scholarship) { + return new ScholarshipContentDto(scholarship.getId(), scholarship.getSemester(), scholarship.getTotalMileage(), scholarship.isApproved()); + } + +} diff --git a/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java b/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java index 73d4786..c5a3b90 100644 --- a/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java +++ b/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java @@ -3,15 +3,25 @@ import javax.persistence.*; import com.server.hispath.common.BaseEntity; +import com.server.hispath.scholarship.application.dto.ScholarshipCUDto; +import com.server.hispath.student.domain.Student; +import com.sun.istack.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; import org.hibernate.annotations.Where; +import java.util.ArrayList; +import java.util.List; + @Entity @Getter +@Builder @NoArgsConstructor +@AllArgsConstructor @Where(clause = "deleted = false") @SQLDelete(sql = "UPDATE scholarShip SET deleted = true Where id = ?") public class Scholarship extends BaseEntity { @@ -20,5 +30,18 @@ public class Scholarship extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; +// @OneToMany(mappedBy = "student") +// private List students = new ArrayList<>(); + + @NotNull + private String semester; + + private int totalMileage; + + private boolean approved; + + public static Scholarship from(ScholarshipCUDto dto){ + return Scholarship.builder().semester(dto.getSemester()).build(); + } //ToDO : 나중 구현 예정 } diff --git a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java new file mode 100644 index 0000000..9b7a2fa --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java @@ -0,0 +1,9 @@ +package com.server.hispath.scholarship.domain.repository; + +import com.server.hispath.scholarship.domain.Scholarship; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ScholarshipRepository extends JpaRepository { + +} + diff --git a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java new file mode 100644 index 0000000..880bb8f --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java @@ -0,0 +1,30 @@ +package com.server.hispath.scholarship.presentation; + +import com.server.hispath.docs.ApiDoc; +import com.server.hispath.scholarship.application.ScholarshipService; +import com.server.hispath.scholarship.application.dto.ScholarshipCUDto; +import com.server.hispath.scholarship.domain.Scholarship; +import com.server.hispath.scholarship.presentation.request.ScholarshipCURequest; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +public class ScholarshipController { + + private final ScholarshipService scholarshipService; + // 장학금 신청 + @PostMapping("/scholarship") + @ApiOperation(value = ApiDoc.SCHOLARSHIP_CREATE) + public ResponseEntity apply(@RequestBody ScholarshipCURequest request) { + Long appliedId = scholarshipService.apply(ScholarshipCUDto.of(request)); + return ResponseEntity.ok(appliedId); + } + +} diff --git a/src/main/java/com/server/hispath/scholarship/presentation/request/ScholarshipCURequest.java b/src/main/java/com/server/hispath/scholarship/presentation/request/ScholarshipCURequest.java new file mode 100644 index 0000000..bf90d32 --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/presentation/request/ScholarshipCURequest.java @@ -0,0 +1,12 @@ +package com.server.hispath.scholarship.presentation.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class ScholarshipCURequest { + private String semester; +} From ea8b0d5d477bae7cc8fc1e474b7c28ebbd0bed77 Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Wed, 5 Oct 2022 15:31:13 +0900 Subject: [PATCH 045/148] =?UTF-8?q?[#8]=20Student=20CRUD=20=EC=99=84?= =?UTF-8?q?=EC=84=B1=20(#22)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#8]:학생 CRUD * fix[#8] : register participants 추가 * fix[#13] request 데이터 수정 * fix[#13] update 수정 * feat[#8] : major, department CRUD 추가 --- .../server/hispath/HispathApplication.java | 1 - .../response/CategoryResponse.java | 2 +- .../server/hispath/common/TestController.java | 31 +++++----- .../application/DepartmentService.java | 54 ++++++++++++++++ .../department/application/dto/DepartmentDto | 0 .../application/dto/DepartmentDto.java | 23 +++++++ .../hispath/department/domain/Department.java | 14 +++++ .../repository/DepartementRepository.java | 7 +++ .../presentation/DepartmentController.java | 61 +++++++++++++++++++ .../request/DepartmentCRRequest.java | 12 ++++ .../response/DepartmentResponse.java | 20 ++++++ .../java/com/server/hispath/docs/ApiDoc.java | 10 ++- .../major/application/MajorService.java | 3 +- .../application/dto/MajorContentDto.java | 1 - .../major/application/dto/MajorDto.java | 5 +- .../server/hispath/major/domain/Major.java | 1 - .../presentation/response/MajorResponse.java | 4 +- .../student/application/StudentService.java | 45 +++++++++++--- .../student/application/dto/StudentCUDto.java | 31 ++++++++++ .../student/application/dto/StudentDto.java | 22 +++++-- .../hispath/student/domain/Student.java | 42 +++++++++++-- .../presentation/StudentController.java | 14 ++++- .../request/StudentCURequest.java | 13 +++- .../response/StudentResponse.java | 20 +++++- 24 files changed, 385 insertions(+), 51 deletions(-) create mode 100644 src/main/java/com/server/hispath/department/application/DepartmentService.java create mode 100644 src/main/java/com/server/hispath/department/application/dto/DepartmentDto create mode 100644 src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java create mode 100644 src/main/java/com/server/hispath/department/domain/repository/DepartementRepository.java create mode 100644 src/main/java/com/server/hispath/department/presentation/DepartmentController.java create mode 100644 src/main/java/com/server/hispath/department/presentation/request/DepartmentCRRequest.java create mode 100644 src/main/java/com/server/hispath/department/presentation/response/DepartmentResponse.java create mode 100644 src/main/java/com/server/hispath/student/application/dto/StudentCUDto.java diff --git a/src/main/java/com/server/hispath/HispathApplication.java b/src/main/java/com/server/hispath/HispathApplication.java index 13c7ac8..d1bf399 100644 --- a/src/main/java/com/server/hispath/HispathApplication.java +++ b/src/main/java/com/server/hispath/HispathApplication.java @@ -11,5 +11,4 @@ public class HispathApplication { public static void main(String[] args) { SpringApplication.run(HispathApplication.class, args); } - } diff --git a/src/main/java/com/server/hispath/category/presentation/response/CategoryResponse.java b/src/main/java/com/server/hispath/category/presentation/response/CategoryResponse.java index 3ffbf4a..7900313 100644 --- a/src/main/java/com/server/hispath/category/presentation/response/CategoryResponse.java +++ b/src/main/java/com/server/hispath/category/presentation/response/CategoryResponse.java @@ -18,4 +18,4 @@ public class CategoryResponse { public static CategoryResponse from(CategoryContentDto dto) { return new CategoryResponse(dto.getId(), dto.getName()); } -} +} \ No newline at end of file diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index bb1785d..bbcfb34 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -21,6 +21,7 @@ import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; +import lombok.AllArgsConstructor; import lombok.Builder; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -43,19 +44,22 @@ public class TestController { private final ManagerRepository managerRepository; - @GetMapping("/register/ref") - public ResponseEntity testRegisterRefStudent() { - for (int i = 0; i < 20; i++) { - String studentNum = Integer.toString(i); - String name = "학생" + i; - Student student = Student.builder() - .studentNum(studentNum) - .name(name) - .build(); - studentRepository.save(student); - } - return ResponseEntity.ok(null); - } +// @GetMapping("/register/ref") +// public ResponseEntity testRegisterRefStudent() { +// for (int i = 0; i < 10; i++) { +// String studentNum = Integer.toString(22200000 + i); +// String name = "학생" + i; +// String email = "test" + i + "@handong.ac.kr"; +// int semester = 1; +// Student student = Student.builder() +// .studentNum(studentNum) +// .name(name) +// .email(email) +// } .semester(semester) +// .build(); +// studentRepository.save(student); +// return ResponseEntity.ok(null); +// } @GetMapping("/init/category") public ResponseEntity testCategoryInit() { @@ -226,5 +230,4 @@ public ResponseEntity initNotice(){ .build()); return ResponseEntity.ok(null); } - } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/department/application/DepartmentService.java b/src/main/java/com/server/hispath/department/application/DepartmentService.java new file mode 100644 index 0000000..5089cc3 --- /dev/null +++ b/src/main/java/com/server/hispath/department/application/DepartmentService.java @@ -0,0 +1,54 @@ +package com.server.hispath.department.application; + +import com.server.hispath.department.application.dto.DepartmentDto; +import com.server.hispath.department.domain.Department; +import com.server.hispath.department.domain.repository.DepartementRepository; +import com.server.hispath.exception.student.StudentNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class DepartmentService { + private final DepartementRepository departmentRepository; + + @Transactional + public Long create(DepartmentDto dto){ + Department savedDepartment = departmentRepository.save(Department.from(dto)); + return savedDepartment.getId(); + } + + @Transactional + public DepartmentDto find(Long id) { + Department department = this.findById(id); + return DepartmentDto.from(department); + } + + @Transactional + public List findAll() { + List department = departmentRepository.findAll(); + return department.stream() + .map(DepartmentDto::from) + .collect(Collectors.toList()); + } + + @Transactional + public DepartmentDto update(Long id, DepartmentDto dto) { + Department department = departmentRepository.findById(id).orElseThrow(StudentNotFoundException::new);; + department.update(dto); + return DepartmentDto.from(department); + } + + @Transactional + public void delete(Long id) { + departmentRepository.deleteById(id); + } + + public Department findById(Long id) { + return departmentRepository.findById(id).orElseThrow(StudentNotFoundException::new); + } +} diff --git a/src/main/java/com/server/hispath/department/application/dto/DepartmentDto b/src/main/java/com/server/hispath/department/application/dto/DepartmentDto new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java b/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java new file mode 100644 index 0000000..4715267 --- /dev/null +++ b/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java @@ -0,0 +1,23 @@ +package com.server.hispath.department.application.dto; + +import com.server.hispath.department.domain.Department; +import com.server.hispath.department.presentation.request.DepartmentCRRequest; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class DepartmentDto { + private Long id; + private String name; + + public static DepartmentDto from (Department department) { + return new DepartmentDto(department.getId(), department.getName()); + } + + public static DepartmentDto of(DepartmentCRRequest request) { + return new DepartmentDto(request.getDepartmentId(), request.getName()); + } +} diff --git a/src/main/java/com/server/hispath/department/domain/Department.java b/src/main/java/com/server/hispath/department/domain/Department.java index f748d6a..ada9921 100644 --- a/src/main/java/com/server/hispath/department/domain/Department.java +++ b/src/main/java/com/server/hispath/department/domain/Department.java @@ -7,7 +7,9 @@ import com.server.hispath.common.BaseEntity; +import com.server.hispath.department.application.dto.DepartmentDto; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; @@ -15,6 +17,7 @@ @Entity @Getter +@Builder @NoArgsConstructor @AllArgsConstructor @Where(clause = "deleted = false") @@ -26,4 +29,15 @@ public class Department extends BaseEntity { private Long id; private String name; + + public void update(DepartmentDto dto) { + this.name = dto.getName(); + } + + public static Department from(DepartmentDto dto) { + return Department.builder() + .name(dto.getName()) + .build(); + } } + diff --git a/src/main/java/com/server/hispath/department/domain/repository/DepartementRepository.java b/src/main/java/com/server/hispath/department/domain/repository/DepartementRepository.java new file mode 100644 index 0000000..755a9b5 --- /dev/null +++ b/src/main/java/com/server/hispath/department/domain/repository/DepartementRepository.java @@ -0,0 +1,7 @@ +package com.server.hispath.department.domain.repository; + +import com.server.hispath.department.domain.Department; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface DepartementRepository extends JpaRepository { +} diff --git a/src/main/java/com/server/hispath/department/presentation/DepartmentController.java b/src/main/java/com/server/hispath/department/presentation/DepartmentController.java new file mode 100644 index 0000000..7f152bc --- /dev/null +++ b/src/main/java/com/server/hispath/department/presentation/DepartmentController.java @@ -0,0 +1,61 @@ +package com.server.hispath.department.presentation; + +import com.server.hispath.department.application.DepartmentService; +import com.server.hispath.department.application.dto.DepartmentDto; +import com.server.hispath.department.presentation.request.DepartmentCRRequest; +import com.server.hispath.department.presentation.response.DepartmentResponse; +import com.server.hispath.docs.ApiDoc; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +public class DepartmentController { + private final DepartmentService departmentService; + + @PostMapping("/department") + @ApiOperation(value = ApiDoc.DEPARTMENT_CREATE) + public ResponseEntity create(@RequestBody DepartmentCRRequest request) { + Long savedId = departmentService.create(DepartmentDto.of(request)); + return ResponseEntity.ok(savedId); + } + + @GetMapping("/department/{id}") + @ApiOperation(value = ApiDoc.DEPARTMENT_READ) + public ResponseEntity find(@PathVariable Long id) { + DepartmentDto dto = departmentService.find(id); + DepartmentResponse response = DepartmentResponse.from(dto); + return ResponseEntity.ok(response); + } + + @GetMapping("/departments") + @ApiOperation(value = ApiDoc.DEPARTMENT_READ_ALL) + public ResponseEntity> findAll() { + List dtos = departmentService.findAll(); + List responses = dtos.stream() + .map(DepartmentResponse::from) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } + + @PatchMapping("/department/{id}") + @ApiOperation(value = ApiDoc.DEPARTMENT_UPDATE) + public ResponseEntity update(@PathVariable Long id, @RequestBody DepartmentCRRequest request) { + DepartmentDto dto = departmentService.update(id, DepartmentDto.of(request)); + DepartmentResponse response = DepartmentResponse.from(dto); + return ResponseEntity.ok(response); + } + + @DeleteMapping("/department/{id}") + @ApiOperation(value = ApiDoc.DEPARTMENT_DELETE) + public ResponseEntity delete(@PathVariable Long id) { + departmentService.delete(id); + return ResponseEntity.ok(id); + } +} diff --git a/src/main/java/com/server/hispath/department/presentation/request/DepartmentCRRequest.java b/src/main/java/com/server/hispath/department/presentation/request/DepartmentCRRequest.java new file mode 100644 index 0000000..5224c2b --- /dev/null +++ b/src/main/java/com/server/hispath/department/presentation/request/DepartmentCRRequest.java @@ -0,0 +1,12 @@ +package com.server.hispath.department.presentation.request; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class DepartmentCRRequest { + private Long departmentId; + private String name; +} diff --git a/src/main/java/com/server/hispath/department/presentation/response/DepartmentResponse.java b/src/main/java/com/server/hispath/department/presentation/response/DepartmentResponse.java new file mode 100644 index 0000000..d1b7d8a --- /dev/null +++ b/src/main/java/com/server/hispath/department/presentation/response/DepartmentResponse.java @@ -0,0 +1,20 @@ +package com.server.hispath.department.presentation.response; + +import com.server.hispath.department.application.dto.DepartmentDto; +import com.server.hispath.student.application.dto.StudentDto; +import com.server.hispath.student.presentation.response.StudentResponse; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class DepartmentResponse { + private Long departmentId; + private String name; + + public static DepartmentResponse from (DepartmentDto dto) { + return new DepartmentResponse(dto.getId(), dto.getName()); + } +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 06382bb..133e29e 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -41,14 +41,20 @@ public class ApiDoc { public static final String NOTICE_UPDATE = "공지 수정"; - /* Student 관련 API 명세 */ public static final String STUDENT_READ = "단일 학생 조회"; public static final String STUDENT_READ_ALL = "모든 학생 조회"; public static final String STUDENT_CREATE = "학생 추가"; + public static final String STUDENTS_CREATE = "학생 단일 추가"; public static final String STUDENT_UPDATE = "학생 수정"; public static final String STUDENT_DELETE = "학생 삭제"; - public static final String DASHBOARD = "메인페이지 대시보드 정보 조회"; + /* Department 관련 API 명세 */ + public static final String DEPARTMENT_READ = "단일 학부 조회"; + public static final String DEPARTMENT_READ_ALL = "모든 학부 조회"; + public static final String DEPARTMENT_CREATE = "학부 추가"; + public static final String DEPARTMENT_UPDATE = "학부 수정"; + public static final String DEPARTMENT_DELETE = "학부 삭제"; + public static final String DASHBOARD = "메인페이지 대시보드 정보 조회"; } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/major/application/MajorService.java b/src/main/java/com/server/hispath/major/application/MajorService.java index e448879..6ec20ce 100644 --- a/src/main/java/com/server/hispath/major/application/MajorService.java +++ b/src/main/java/com/server/hispath/major/application/MajorService.java @@ -9,8 +9,8 @@ import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; -import javax.transaction.Transactional; @Service @RequiredArgsConstructor @@ -46,5 +46,4 @@ public void delete(Long id){ public Major findById(Long id) { return majorRepository.findById(id).orElseThrow(MajorNotFoundException::new); } - } diff --git a/src/main/java/com/server/hispath/major/application/dto/MajorContentDto.java b/src/main/java/com/server/hispath/major/application/dto/MajorContentDto.java index 611ea94..03c4008 100644 --- a/src/main/java/com/server/hispath/major/application/dto/MajorContentDto.java +++ b/src/main/java/com/server/hispath/major/application/dto/MajorContentDto.java @@ -14,7 +14,6 @@ public class MajorContentDto { private String majorName; - public static MajorContentDto from(MajorCURequest request) { return new MajorContentDto(request.getMajorName()); } diff --git a/src/main/java/com/server/hispath/major/application/dto/MajorDto.java b/src/main/java/com/server/hispath/major/application/dto/MajorDto.java index a45377b..ec9908f 100644 --- a/src/main/java/com/server/hispath/major/application/dto/MajorDto.java +++ b/src/main/java/com/server/hispath/major/application/dto/MajorDto.java @@ -5,15 +5,14 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; @Getter @NoArgsConstructor @AllArgsConstructor public class MajorDto { private Long id; - private String majorName; + private String name; public static MajorDto from(Major major) { return new MajorDto(major.getId(), major.getName()); } -} +} \ No newline at end of file diff --git a/src/main/java/com/server/hispath/major/domain/Major.java b/src/main/java/com/server/hispath/major/domain/Major.java index b8b25b2..4d0da31 100644 --- a/src/main/java/com/server/hispath/major/domain/Major.java +++ b/src/main/java/com/server/hispath/major/domain/Major.java @@ -29,7 +29,6 @@ public class Major extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private String name; public static Major from(MajorContentDto dto){ diff --git a/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java b/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java index 49403ef..ba3ac5c 100644 --- a/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java +++ b/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java @@ -11,9 +11,9 @@ @AllArgsConstructor public class MajorResponse { private Long id; - private String majorName; + private String name; public static MajorResponse from(MajorDto dto) { - return new MajorResponse(dto.getId(), dto.getMajorName()); + return new MajorResponse(dto.getId(), dto.getName()); } } diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java index 3879743..c77d205 100644 --- a/src/main/java/com/server/hispath/student/application/StudentService.java +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -1,14 +1,17 @@ package com.server.hispath.student.application; -import com.server.hispath.exception.category.CategoryNotFoundException; +import com.server.hispath.department.application.DepartmentService; +import com.server.hispath.department.domain.Department; import com.server.hispath.exception.student.StudentNotFoundException; +import com.server.hispath.major.application.MajorService; +import com.server.hispath.major.domain.Major; +import com.server.hispath.student.application.dto.StudentCUDto; import com.server.hispath.student.application.dto.StudentDto; import java.util.List; import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.MActivityService; import com.server.hispath.activity.domain.Activity; import com.server.hispath.exception.student.StudentDataNotMatchException; -import com.server.hispath.exception.student.StudentNotFoundException; import com.server.hispath.student.application.dto.StudentRefDto; import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; @@ -17,9 +20,7 @@ import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; -import org.springframework.transaction.annotation.Transactional; -import java.util.List; import java.util.stream.Collectors; @Service @@ -29,13 +30,29 @@ public class StudentService { private final StudentRepository studentRepository; private final ActivityService activityService; private final MActivityService mActivityService; + private final MajorService majorService; + private final DepartmentService departmentService; + @Transactional - public Long create(StudentDto dto){ - Student savedStudent = studentRepository.save(Student.from(dto)); + public Long create(StudentCUDto dto) { + Department department = departmentService.findById(dto.getDepartmentId()); + Major major1 = majorService.findById(dto.getMajor1Id()); + Major major2 = majorService.findById(dto.getMajor2Id()); + Student savedStudent = studentRepository.save(Student.from(dto, department, major1, major2)); return savedStudent.getId(); } + @Transactional + public void createAll(List dtos) { + List students = dtos.stream() + .map(dto -> { + Student student = findById(Long.valueOf(dto.getStudentNum())); + return Student.from(dto); + }).collect(Collectors.toList()); + studentRepository.saveAll(students); + } + @Transactional public StudentDto find(Long id) { Student student = this.findById(id); @@ -45,15 +62,23 @@ public StudentDto find(Long id) { @Transactional public List findAll() { List students = studentRepository.findAll(); + students.stream() + .forEach(student -> { + System.out.println("student.getName() = " + student.getName()); + + }); return students.stream() .map(StudentDto::from) .collect(Collectors.toList()); } @Transactional - public StudentDto update(Long id, StudentDto dto) { - Student student = studentRepository.findById(id).orElseThrow(StudentNotFoundException::new);; - student.update(dto); + public StudentDto update(Long id, Long departmentId, Long major1Id, Long major2Id, StudentCUDto dto) { + Department department = departmentService.findById(departmentId); + Student student = studentRepository.findById(id).orElseThrow(StudentNotFoundException::new); + Major major1 = majorService.findById(major1Id); + Major major2 = majorService.findById(major2Id); + student.update(department, major1, major2, dto); return StudentDto.from(student); } @@ -72,7 +97,7 @@ public void registerParticipants(Long activityId, List studentRef mActivityService.deleteAllParticipant(activity); studentRefDtos.forEach(dto -> { Student student = studentRepository.findByStudentNum(dto.getStudentNum()) - .orElseThrow(StudentNotFoundException::new); + .orElseThrow(StudentNotFoundException::new); if (!student.isNameMatch(dto.getName())) { throw new StudentDataNotMatchException(dto.getStudentNum(), dto.getName()); } diff --git a/src/main/java/com/server/hispath/student/application/dto/StudentCUDto.java b/src/main/java/com/server/hispath/student/application/dto/StudentCUDto.java new file mode 100644 index 0000000..45d4f04 --- /dev/null +++ b/src/main/java/com/server/hispath/student/application/dto/StudentCUDto.java @@ -0,0 +1,31 @@ +package com.server.hispath.student.application.dto; + +import com.server.hispath.student.domain.Student; +import com.server.hispath.student.presentation.request.StudentCURequest; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class StudentCUDto { + private Long departmentId; + private Long major1Id; + private Long major2Id; + private String studentNum; + private int semester; + private String name; + private String phone; + private String email; + private String profile; + private String blog; + private String githubId; + private String readme; + + public static StudentCUDto of(StudentCURequest request) { + return new StudentCUDto(request.getDepartmentId(), request.getMajor1Id(), request.getMajor2Id(), + request.getStudentNum(), request.getSemester(), request.getName(), request.getPhone(), + request.getEmail(), request.getProfile(), request.getBlog(), request.getGithubId(), request.getReadme()); + } +} diff --git a/src/main/java/com/server/hispath/student/application/dto/StudentDto.java b/src/main/java/com/server/hispath/student/application/dto/StudentDto.java index 3f676f0..b4d3097 100644 --- a/src/main/java/com/server/hispath/student/application/dto/StudentDto.java +++ b/src/main/java/com/server/hispath/student/application/dto/StudentDto.java @@ -1,5 +1,8 @@ package com.server.hispath.student.application.dto; +import com.server.hispath.category.application.dto.CategoryDto; +import com.server.hispath.department.application.dto.DepartmentDto; +import com.server.hispath.major.application.dto.MajorDto; import com.server.hispath.student.domain.Student; import com.server.hispath.student.presentation.request.StudentCURequest; import lombok.AllArgsConstructor; @@ -12,12 +15,23 @@ public class StudentDto { private Long id; private String name; + private int semester; + private String phone; + private String email; + private String profile; + private DepartmentDto departmentDto; + private MajorDto major1; + private MajorDto major2; + private long loginCnt; + private String blog; + private String githubId; + private String readme; public static StudentDto from (Student student) { - return new StudentDto(student.getId(), student.getName()); + return new StudentDto(student.getId(), student.getName(), student.getSemester(), student.getPhone(), + student.getEmail(), student.getProfile(), DepartmentDto.from(student.getDepartment()), + MajorDto.from(student.getMajor1()), MajorDto.from(student.getMajor2()), + student.getLoginCnt(), student.getBlog(), student.getGithubId(), student.getReadme()); } - public static StudentDto of(StudentCURequest request) { - return new StudentDto(request.getStudentId(), request.getName()); - } } diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index c775a79..93543f4 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -6,12 +6,12 @@ import java.util.Objects; import javax.persistence.*; -import com.server.hispath.category.domain.Category; -import com.server.hispath.activity.domain.Activity; import com.server.hispath.common.BaseEntity; import com.server.hispath.department.domain.Department; import com.server.hispath.major.domain.Major; +import com.server.hispath.student.application.dto.StudentCUDto; import com.server.hispath.student.application.dto.StudentDto; +import com.server.hispath.student.application.dto.StudentRefDto; import com.server.hispath.student.domain.participate.Participant; import lombok.AllArgsConstructor; @@ -23,11 +23,11 @@ @Entity @Getter +@Builder @NoArgsConstructor @Where(clause = "deleted = false") @SQLDelete(sql = "UPDATE student SET deleted = true Where id = ?") @AllArgsConstructor -@Builder public class Student extends BaseEntity { @Id @@ -69,10 +69,44 @@ public class Student extends BaseEntity { private List participants = new ArrayList<>(); - public void update(StudentDto dto) { + public void update(Department department, Major major1, Major major2, StudentCUDto dto) { this.name = dto.getName(); + this.studentNum = dto.getStudentNum(); + this.semester = dto.getSemester(); + this.phone = dto.getPhone(); + this.email = dto.getEmail(); + this.profile = dto.getProfile(); + this.department = department; + this.major1 = major1; + this.major2 = major2; + this.blog = dto.getBlog(); + this.githubId = dto.getGithubId(); + this.readme = dto.getReadme(); } + public static Student from(StudentCUDto dto, Department department, Major major1, Major major2) { + return Student.builder() + .name(dto.getName()) + .department(department) + .studentNum(dto.getStudentNum()) + .semester(dto.getSemester()) + .major1(major1) + .major2(major2) + .phone(dto.getPhone()) + .email(dto.getEmail()) + .profile(dto.getProfile()) + .blog(dto.getBlog()) + .githubId(dto.getGithubId()) + .loginCnt(0L) + .readme(dto.getReadme()) + .build(); + } + + public static Student from(StudentRefDto dto) { + return Student.builder() + .name(dto.getName()) + .build(); + } public static Student from(StudentDto dto) { return Student.builder() .name(dto.getName()) diff --git a/src/main/java/com/server/hispath/student/presentation/StudentController.java b/src/main/java/com/server/hispath/student/presentation/StudentController.java index 6c8c26a..e68c38d 100644 --- a/src/main/java/com/server/hispath/student/presentation/StudentController.java +++ b/src/main/java/com/server/hispath/student/presentation/StudentController.java @@ -3,15 +3,18 @@ import com.server.hispath.docs.ApiDoc; import com.server.hispath.student.application.StudentService; +import com.server.hispath.student.application.dto.StudentCUDto; import com.server.hispath.student.application.dto.StudentDto; import com.server.hispath.student.presentation.request.StudentCURequest; import com.server.hispath.student.presentation.response.StudentResponse; +import com.server.hispath.util.ExcelManager; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import lombok.RequiredArgsConstructor; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.stream.Collectors; @@ -26,10 +29,17 @@ public class StudentController { @PostMapping("/student") @ApiOperation(value = ApiDoc.STUDENT_CREATE) public ResponseEntity create(@RequestBody StudentCURequest request) { - Long savedId = studentService.create(StudentDto.of(request)); + Long savedId = studentService.create(StudentCUDto.of(request)); return ResponseEntity.ok(savedId); } + @PostMapping("/students") + @ApiOperation(value = ApiDoc.STUDENTS_CREATE) + public ResponseEntity createStudents(MultipartFile file) throws Exception { + studentService.createAll(ExcelManager.getStudentDatas(ExcelManager.extract(file))); + return ResponseEntity.ok(null); + } + @GetMapping("/student/{id}") @ApiOperation(value = ApiDoc.STUDENT_READ) public ResponseEntity find(@PathVariable Long id) { @@ -51,7 +61,7 @@ public ResponseEntity> findAll() { @PatchMapping("/student/{id}") @ApiOperation(value = ApiDoc.STUDENT_UPDATE) public ResponseEntity update(@PathVariable Long id, @RequestBody StudentCURequest request) { - StudentDto dto = studentService.update(id, StudentDto.of(request)); + StudentDto dto = studentService.update(id, request.getDepartmentId(), request.getMajor1Id(), request.getMajor2Id(), StudentCUDto.of(request)); StudentResponse response = StudentResponse.from(dto); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/server/hispath/student/presentation/request/StudentCURequest.java b/src/main/java/com/server/hispath/student/presentation/request/StudentCURequest.java index f2634d1..51c6835 100644 --- a/src/main/java/com/server/hispath/student/presentation/request/StudentCURequest.java +++ b/src/main/java/com/server/hispath/student/presentation/request/StudentCURequest.java @@ -1,6 +1,5 @@ package com.server.hispath.student.presentation.request; -import lombok.Data; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -9,6 +8,16 @@ @Setter @NoArgsConstructor public class StudentCURequest { - private Long studentId; + private Long departmentId; + private Long major1Id; + private Long major2Id; + private String studentNum; + private int semester; private String name; + private String phone; + private String email; + private String profile; + private String blog; + private String githubId; + private String readme; } diff --git a/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java b/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java index d110130..1d4177e 100644 --- a/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java +++ b/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java @@ -9,10 +9,26 @@ @Setter @AllArgsConstructor public class StudentResponse { - private Long id; + private Long studentId; private String name; + private int semester; + private String phone; + private String email; + private String profile; + private Long departmentId; + private String departmentName; + private String major1; + private String major2; + private long loginCnt; + private String blog; + private String githubId; + private String readme; public static StudentResponse from (StudentDto dto) { - return new StudentResponse(dto.getId(), dto.getName()); + return new StudentResponse(dto.getId(), dto.getName(), dto.getSemester(), dto.getPhone(), dto.getEmail(), + dto.getProfile(), dto.getDepartmentDto().getId(), dto.getDepartmentDto().getName(), + dto.getMajor1().getName(), dto.getMajor2().getName(), + dto.getLoginCnt(), + dto.getBlog(), dto.getGithubId(), dto.getReadme()); } } From 6b57c8e246bd090bfee4e090ffd9452f4b8f6a4e Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Thu, 6 Oct 2022 06:26:48 +0900 Subject: [PATCH 046/148] =?UTF-8?q?[#8]=20Student=20Excel=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=20=EA=B5=AC=ED=98=84=20(#23)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#8]:학생 CRUD * fix[#8] : register participants 추가 * fix[#13] request 데이터 수정 * fix[#13] update 수정 * feat[#8] : major, department CRUD 추가 --- .../server/hispath/common/TestController.java | 203 +++++++++++++++++- .../application/dto/DepartmentDto.java | 2 + .../major/application/dto/MajorDto.java | 1 - .../student/application/StudentService.java | 8 +- .../student/application/dto/StudentDto.java | 3 +- .../application/dto/StudentRefDto.java | 16 +- .../hispath/student/domain/Student.java | 14 +- .../domain/repository/StudentRepository.java | 1 - .../response/StudentResponse.java | 3 +- .../com/server/hispath/util/ExcelManager.java | 22 +- 10 files changed, 254 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index bbcfb34..1b0add6 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -1,17 +1,17 @@ package com.server.hispath.common; import java.time.LocalDate; -import java.time.LocalDateTime; import java.time.Month; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import com.server.hispath.activity.application.ActivityService; -import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.auth.domain.*; import com.server.hispath.category.domain.Category; import com.server.hispath.category.domain.repository.CategoryRepository; +import com.server.hispath.department.application.dto.DepartmentDto; +import com.server.hispath.department.domain.Department; +import com.server.hispath.department.domain.repository.DepartementRepository; import com.server.hispath.exception.manager.ManagerNotFoundException; import com.server.hispath.major.domain.repository.MajorRepository; import com.server.hispath.manager.domain.Manager; @@ -42,6 +42,7 @@ public class TestController { private final NoticeRepository noticeRepository; private final MajorRepository majorRepository; private final ManagerRepository managerRepository; + private final DepartementRepository departementRepository; // @GetMapping("/register/ref") @@ -230,4 +231,200 @@ public ResponseEntity initNotice(){ .build()); return ResponseEntity.ok(null); } + + @GetMapping("/init/student") + public ResponseEntity initStudent(){ + studentRepository.save(Student.builder() + .name("김한동") +// .departmentId(1) + .studentNum("22200000") + .semester(5) +// .major1("전산") +// .major2("전자") + .phone("010-1234-1234") + .email("kim@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@kim.github") + .loginCnt(0L) + .readme("kim's readme") + .build()); + studentRepository.save(Student.builder() + .name("박한동") +// .department("커뮤니케이션학부") + .studentNum("22200001") + .semester(3) +// .major1("공연") +// .major2("영상") + .phone("010-1234-5678") + .email("park@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@park.github") + .loginCnt(0L) + .readme("park's readme") + .build()); + studentRepository.save(Student.builder() + .name("이한동") +// .department("국제어문학부") + .studentNum("22200002") + .semester(5) +// .major1("국제관계학") +// .major2("") + .phone("010-5678-1234") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@lee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); + studentRepository.save(Student.builder() + .name("정한동") +// .department("국제어문학부") + .studentNum("22200003") + .semester(6) +// .major1("국제관계학") +// .major2("") + .phone("010-1111-1111") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); + studentRepository.save(Student.builder() + .name("우한동") +// .department("국제어문학부") + .studentNum("22200004") + .semester(6) +// .major1("국제관계학") +// .major2("") + .phone("010-2222-3333") + .email("woo@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@woo.github") + .loginCnt(0L) + .readme("woo's readme") + .build()); + studentRepository.save(Student.builder() + .name("위한동") +// .department("국제어문학부") + .studentNum("22200005") + .semester(6) +// .major1("국제관계학") +// .major2("") + .phone("010-4444-1234") + .email("wi@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wi.github") + .loginCnt(0L) + .readme("wi's readme") + .build()); + studentRepository.save(Student.builder() + .name("하한동") +// .department("국제어문학부") + .studentNum("22200006") + .semester(8) +// .major1("국제관계학") +// .major2("") + .phone("010-9999-1111") + .email("ha@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ha.github") + .loginCnt(0L) + .readme("ha's readme") + .build()); + studentRepository.save(Student.builder() + .name("마한동") +// .department("국제어문학부") + .studentNum("22200007") + .semester(4) +// .major1("국제관계학") +// .major2("") + .phone("010-4312-4312") + .email("ma@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ma.github") + .loginCnt(0L) + .readme("ma's readme") + .build()); + studentRepository.save(Student.builder() + .name("유한동") +// .department("국제어문학부") + .studentNum("22200008") + .semester(6) +// .major1("국제관계학") +// .major2("") + .phone("010-3434-2323") + .email("yu@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@yu.github") + .loginCnt(0L) + .readme("yu's readme") + .build()); + studentRepository.save(Student.builder() + .name("진한동") +// .department("국제어문학부") + .studentNum("22200009") + .semester(7) +// .major1("국제관계학") +// .major2("") + .phone("010-8787-8787") + .email("jin@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jin.github") + .loginCnt(0L) + .readme("jin's readme") + .build()); + return ResponseEntity.ok(null); + } + + @GetMapping("/init/department") + public ResponseEntity initDepartment(){ + departementRepository.save(Department.builder() + .name("전산전자") + .build()); + departementRepository.save(Department.builder() + .name("국제어문") + .build()); + departementRepository.save(Department.builder() + .name("경영경제") + .build()); + departementRepository.save(Department.builder() + .name("법학부") + .build()); + departementRepository.save(Department.builder() + .name("커뮤니케이션") + .build()); + departementRepository.save(Department.builder() + .name("상당복지") + .build()); + departementRepository.save(Department.builder() + .name("상당복지") + .build()); + departementRepository.save(Department.builder() + .name("공간환경시스템") + .build()); + departementRepository.save(Department.builder() + .name("콘텐츠융합디자인") + .build()); + departementRepository.save(Department.builder() + .name("기계제어") + .build()); + departementRepository.save(Department.builder() + .name("ICT창업학부") + .build()); + departementRepository.save(Department.builder() + .name("기계제어") + .build()); + return ResponseEntity.ok(null); + } } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java b/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java index 4715267..b32e57f 100644 --- a/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java +++ b/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java @@ -5,8 +5,10 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; @Getter +@Setter @NoArgsConstructor @AllArgsConstructor public class DepartmentDto { diff --git a/src/main/java/com/server/hispath/major/application/dto/MajorDto.java b/src/main/java/com/server/hispath/major/application/dto/MajorDto.java index ec9908f..306f71f 100644 --- a/src/main/java/com/server/hispath/major/application/dto/MajorDto.java +++ b/src/main/java/com/server/hispath/major/application/dto/MajorDto.java @@ -11,7 +11,6 @@ public class MajorDto { private Long id; private String name; - public static MajorDto from(Major major) { return new MajorDto(major.getId(), major.getName()); } diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java index c77d205..edd1156 100644 --- a/src/main/java/com/server/hispath/student/application/StudentService.java +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -47,8 +47,11 @@ public Long create(StudentCUDto dto) { public void createAll(List dtos) { List students = dtos.stream() .map(dto -> { - Student student = findById(Long.valueOf(dto.getStudentNum())); - return Student.from(dto); + Student student = findById(Long.valueOf(dto.getId())); + Department department = departmentService.findById(dto.getDepartmentId()); + Major major1 = majorService.findById(dto.getMajor1Id()); + Major major2 = majorService.findById(dto.getMajor2Id()); + return student.from(dto, department, major1, major2); }).collect(Collectors.toList()); studentRepository.saveAll(students); } @@ -65,7 +68,6 @@ public List findAll() { students.stream() .forEach(student -> { System.out.println("student.getName() = " + student.getName()); - }); return students.stream() .map(StudentDto::from) diff --git a/src/main/java/com/server/hispath/student/application/dto/StudentDto.java b/src/main/java/com/server/hispath/student/application/dto/StudentDto.java index b4d3097..2ad8866 100644 --- a/src/main/java/com/server/hispath/student/application/dto/StudentDto.java +++ b/src/main/java/com/server/hispath/student/application/dto/StudentDto.java @@ -16,6 +16,7 @@ public class StudentDto { private Long id; private String name; private int semester; + private String studentNum; private String phone; private String email; private String profile; @@ -28,7 +29,7 @@ public class StudentDto { private String readme; public static StudentDto from (Student student) { - return new StudentDto(student.getId(), student.getName(), student.getSemester(), student.getPhone(), + return new StudentDto(student.getId(), student.getName(), student.getSemester(), student.getStudentNum(), student.getPhone(), student.getEmail(), student.getProfile(), DepartmentDto.from(student.getDepartment()), MajorDto.from(student.getMajor1()), MajorDto.from(student.getMajor2()), student.getLoginCnt(), student.getBlog(), student.getGithubId(), student.getReadme()); diff --git a/src/main/java/com/server/hispath/student/application/dto/StudentRefDto.java b/src/main/java/com/server/hispath/student/application/dto/StudentRefDto.java index 6489314..093a241 100644 --- a/src/main/java/com/server/hispath/student/application/dto/StudentRefDto.java +++ b/src/main/java/com/server/hispath/student/application/dto/StudentRefDto.java @@ -1,6 +1,5 @@ package com.server.hispath.student.application.dto; - import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -9,8 +8,17 @@ @NoArgsConstructor @AllArgsConstructor public class StudentRefDto { - private String studentNum; + private Long id; private String name; - - + private String studentNum; + private int semester; + private Long departmentId; + private Long major1Id; + private Long major2Id; + private String phone; + private String email; + private String profile; + private String blog; + private String githubId; + private String readme; } diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index 93543f4..fd23a56 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -102,9 +102,21 @@ public static Student from(StudentCUDto dto, Department department, Major major1 .build(); } - public static Student from(StudentRefDto dto) { + public static Student from(StudentRefDto dto, Department department, Major major1, Major major2) { return Student.builder() .name(dto.getName()) + .studentNum(dto.getStudentNum()) + .semester(dto.getSemester()) + .department(department) + .major1(major1) + .major2(major2) + .phone(dto.getPhone()) + .email(dto.getEmail()) + .profile(dto.getProfile()) + .blog(dto.getBlog()) + .githubId(dto.getGithubId()) + .loginCnt(0L) + .readme(dto.getReadme()) .build(); } public static Student from(StudentDto dto) { diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java index 4d22abb..f112a5e 100644 --- a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java @@ -9,6 +9,5 @@ public interface StudentRepository extends JpaRepository { Optional findByStudentNum(String studentNum); - Optional findByEmail(String email); } diff --git a/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java b/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java index 1d4177e..00cbeda 100644 --- a/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java +++ b/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java @@ -12,6 +12,7 @@ public class StudentResponse { private Long studentId; private String name; private int semester; + private String studentNum; private String phone; private String email; private String profile; @@ -25,7 +26,7 @@ public class StudentResponse { private String readme; public static StudentResponse from (StudentDto dto) { - return new StudentResponse(dto.getId(), dto.getName(), dto.getSemester(), dto.getPhone(), dto.getEmail(), + return new StudentResponse(dto.getId(), dto.getName(), dto.getSemester(), dto.getStudentNum(), dto.getPhone(), dto.getEmail(), dto.getProfile(), dto.getDepartmentDto().getId(), dto.getDepartmentDto().getName(), dto.getMajor1().getName(), dto.getMajor2().getName(), dto.getLoginCnt(), diff --git a/src/main/java/com/server/hispath/util/ExcelManager.java b/src/main/java/com/server/hispath/util/ExcelManager.java index 5747c31..ffd7dff 100644 --- a/src/main/java/com/server/hispath/util/ExcelManager.java +++ b/src/main/java/com/server/hispath/util/ExcelManager.java @@ -1,17 +1,23 @@ package com.server.hispath.util; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; +import com.fasterxml.jackson.databind.ObjectMapper; import com.server.hispath.activity.application.dto.MActivityContentDto; +import com.server.hispath.department.application.dto.DepartmentDto; import com.server.hispath.exception.common.ExcelDataFormatException; import com.server.hispath.exception.common.ExcelFormatException; import com.server.hispath.exception.common.NotExcelExtensionException; +import com.server.hispath.major.application.dto.MajorDto; import com.server.hispath.student.application.dto.StudentRefDto; +import org.apache.tomcat.util.json.JSONParser; +import org.springframework.boot.configurationprocessor.json.JSONObject; import org.springframework.web.multipart.MultipartFile; import org.apache.commons.io.FilenameUtils; @@ -69,14 +75,22 @@ public static List getMActivities(Sheet worksheet) { public static List getStudentDatas(Sheet worksheet) { List studentRefDtos = new ArrayList<>(); - for (int i = 1; i < worksheet.getPhysicalNumberOfRows(); i++) { try { Row row = worksheet.getRow(i); - String studentNum = row.getCell(0).toString(); - String studentName = row.getCell(1).toString(); + String studentName = row.getCell(0).toString(); + String str = row.getCell(1).toString(); + int num = new BigDecimal(str).intValue(); + String studentNum = Integer.toString(num); + int studentSemester = Integer.parseInt(row.getCell(2).toString().split("\\.")[0]); + Long departmentId = Long.parseLong(row.getCell(3).toString().split("\\.")[0]);// int departmentId = 0; + Long major1Id = Long.parseLong(row.getCell(4).toString().split("\\.")[0]); + Long major2Id = Long.parseLong(row.getCell(5).toString().split("\\.")[0]); + + studentRefDtos.add(new StudentRefDto((long) i, studentName, studentNum, + studentSemester, departmentId, major1Id, major2Id, "010-1234-1234", "handong@ac.kr", + "url", "blog.com", "@github", "readme content")); - studentRefDtos.add(new StudentRefDto(studentNum, studentName)); } catch (Exception e) { throw new ExcelFormatException(e.getMessage()); } From c7c4fb24c4840d4739ccb5cd7fdf1647e03b49f2 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Tue, 11 Oct 2022 17:41:49 +0900 Subject: [PATCH 047/148] =?UTF-8?q?feat[#18,=20#24]=20:=20Main=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20API=20=EA=B5=AC=ED=98=84,=20Manager=20CRUD?= =?UTF-8?q?,=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=8A=B9=EC=9D=B8=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#18] : Excel 파일 넣었으면 Check 기능 추가 - Entity에 studentRegistered라는 field 추가 * feat[#18] : Dashboard중간 개발 다른 crud가 완성이 안되어 잠시 멈춘 다음에 마저 개발합니다. * feat[#24] : Manager CRUD, Manager 승인 API 구현 * feat[#18] : 메인페이지 정보 API 구현 --- .../java/com/server/hispath/docs/ApiDoc.java | 10 ++- .../manager/application/ManagerService.java | 39 +++++++++++- .../manager/application/dto/ManagerCUDto.java | 9 ++- .../manager/application/dto/ManagerDto.java | 9 ++- .../hispath/manager/domain/Manager.java | 36 ++++++++--- .../presentation/ManagerController.java | 62 +++++++++++++++---- .../request/ManagerCURequest.java | 5 ++ .../response/ManagerResponse.java | 26 ++++++++ .../notice/application/NoticeService.java | 35 ++++++----- .../application/dto/DashboardNoticeDto.java | 22 +++++++ .../notice/application/dto/NoticeDto.java | 2 +- .../domain/repository/NoticeRepository.java | 9 +-- .../response/NoticeDashboardResponse.java | 9 ++- .../student/application/dto/DashboardDto.java | 1 - .../presentation/StudentController.java | 20 +++++- .../response/DashboardResponse.java | 20 +++++- 16 files changed, 252 insertions(+), 62 deletions(-) create mode 100644 src/main/java/com/server/hispath/manager/presentation/response/ManagerResponse.java create mode 100644 src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 133e29e..83b69f0 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -48,6 +48,15 @@ public class ApiDoc { public static final String STUDENTS_CREATE = "학생 단일 추가"; public static final String STUDENT_UPDATE = "학생 수정"; public static final String STUDENT_DELETE = "학생 삭제"; + public static final String DASHBOARD = "메인페이지 대시보드 정보 조회"; + + /* Manager 관련 API 명세 */ + public static final String MANAGER_READ = "단일 관리자 조회"; + public static final String MANAGER_READ_ALL = "모든 관리자 조회"; + public static final String MANAGER_CREATE = "관리자 생성"; + public static final String MANAGER_UPDATE = "관리자 수정"; + public static final String MANAGER_APPROVE = "관리자 승인"; + public static final String MANAGER_DELETE = "관리자 삭제"; /* Department 관련 API 명세 */ public static final String DEPARTMENT_READ = "단일 학부 조회"; @@ -55,6 +64,5 @@ public class ApiDoc { public static final String DEPARTMENT_CREATE = "학부 추가"; public static final String DEPARTMENT_UPDATE = "학부 수정"; public static final String DEPARTMENT_DELETE = "학부 삭제"; - public static final String DASHBOARD = "메인페이지 대시보드 정보 조회"; } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/manager/application/ManagerService.java b/src/main/java/com/server/hispath/manager/application/ManagerService.java index fed86a9..8669169 100644 --- a/src/main/java/com/server/hispath/manager/application/ManagerService.java +++ b/src/main/java/com/server/hispath/manager/application/ManagerService.java @@ -1,8 +1,13 @@ package com.server.hispath.manager.application; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.category.domain.Category; import com.server.hispath.exception.category.CategoryNotFoundException; import com.server.hispath.exception.manager.ManagerNotFoundException; +import com.server.hispath.manager.application.dto.ManagerCUDto; +import com.server.hispath.manager.application.dto.ManagerDto; import com.server.hispath.manager.domain.Manager; import com.server.hispath.manager.domain.repository.ManagerRepository; @@ -16,7 +21,39 @@ public class ManagerService { private final ManagerRepository managerRepository; - public Manager findById(Long id){ + public Long create(ManagerCUDto dto) { + Manager savedManager = managerRepository.save(Manager.of(dto)); + return savedManager.getId(); + } + + public ManagerDto findManager(Long id) { + return ManagerDto.of(this.findById(id)); + } + + public List findManagers() { + return managerRepository.findAll() + .stream() + .map(ManagerDto::of) + .collect(Collectors.toList()); + } + + public ManagerDto update(Long id, ManagerCUDto dto){ + Manager manager = this.findById(id); + manager.update(dto); + return ManagerDto.of(manager); + } + + public Long delete(Long id){ + managerRepository.deleteById(id); + return id; + } + + public Long approve(Long id){ + this.findById(id).approve(); + return id; + } + + public Manager findById(Long id) { return managerRepository.findById(id).orElseThrow(ManagerNotFoundException::new); } } diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java index f7d0140..e2e2192 100644 --- a/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java +++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java @@ -1,6 +1,7 @@ package com.server.hispath.manager.application.dto; import com.server.hispath.manager.presentation.request.ManagerCURequest; + import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -9,10 +10,14 @@ @NoArgsConstructor @AllArgsConstructor public class ManagerCUDto { + private String name; + private int power; + private String email; + private String department; - public static ManagerCUDto of(ManagerCURequest request){ - return new ManagerCUDto(request.getName()); + public static ManagerCUDto of(ManagerCURequest request) { + return new ManagerCUDto(request.getName(), request.getPower(), request.getEmail(), request.getDepartment()); } } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java index d1e0200..e4828f3 100644 --- a/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java +++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java @@ -2,6 +2,7 @@ import com.server.hispath.manager.domain.Manager; import com.server.hispath.notice.domain.Notice; + import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -17,10 +18,12 @@ public class ManagerDto { private String name; private String email; private String department; + private int power; + private boolean approved; - public static ManagerDto from (Manager manager){ - return new ManagerDto(manager.getId(), manager.getName(), - manager.getEmail(), manager.getDepartment()); + public static ManagerDto of(Manager manager) { + return new ManagerDto(manager.getId(), manager.getName(), manager.getEmail(), + manager.getDepartment(), manager.getPower(), manager.isApproved()); } diff --git a/src/main/java/com/server/hispath/manager/domain/Manager.java b/src/main/java/com/server/hispath/manager/domain/Manager.java index ed7f555..ebdafe0 100644 --- a/src/main/java/com/server/hispath/manager/domain/Manager.java +++ b/src/main/java/com/server/hispath/manager/domain/Manager.java @@ -1,13 +1,12 @@ package com.server.hispath.manager.domain; -import java.util.ArrayList; -import java.util.List; -import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; -import com.server.hispath.category.application.dto.CategoryCUDto; -import com.server.hispath.category.domain.Category; import com.server.hispath.common.BaseEntity; -import com.server.hispath.notice.domain.Notice; +import com.server.hispath.manager.application.dto.ManagerCUDto; import lombok.AllArgsConstructor; import lombok.Builder; @@ -28,14 +27,31 @@ public class Manager extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - + private int power; private String name; private String email; private String department; - private boolean approved; - - + public static Manager of(ManagerCUDto dto) { + return Manager.builder() + .power(dto.getPower()) + .name(dto.getName()) + .email(dto.getEmail()) + .department(dto.getDepartment()) + .approved(false) + .build(); + } + + public void update(ManagerCUDto dto){ + this.email = dto.getEmail(); + this.name = dto.getName(); + this.department = dto.getDepartment(); + this.power = dto.getPower(); + } + + public void approve() { + this.approved = true; + } } diff --git a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java index 2d57b54..f57e0d0 100644 --- a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java +++ b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java @@ -1,9 +1,19 @@ package com.server.hispath.manager.presentation; +import java.util.List; +import java.util.stream.Collectors; + +import com.server.hispath.docs.ApiDoc; import com.server.hispath.manager.application.ManagerService; +import com.server.hispath.manager.application.dto.ManagerCUDto; +import com.server.hispath.manager.presentation.request.ManagerCURequest; +import com.server.hispath.manager.presentation.response.ManagerResponse; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.ApiOperation; + import lombok.RequiredArgsConstructor; @RestController @@ -13,20 +23,48 @@ public class ManagerController { private final ManagerService managerService; -// @PostMapping("/") -// @ApiOperation(value= ApiDoc.Manager_CREATE) -// public ResponseEntity create(@RequestBody ManagerCURequest request){ -// Long savedId = managerService.create(ManagerCUDto.of(request)); -// return ResponseEntity.ok(savedId); -// } -// -// public ResponseEntity find(@PathVariable Long id){ -// ManagerContentDto dto = managerService.find(id); -// ManagerResponse response = ManagerResponse.from(dto); -// return ResponseEntity.ok(response); -// } + @PostMapping("/manager") + @ApiOperation(value = ApiDoc.MANAGER_CREATE) + public ResponseEntity create(@RequestBody ManagerCURequest request) { + Long savedId = managerService.create(ManagerCUDto.of(request)); + return ResponseEntity.ok(savedId); + } + + @GetMapping("/manager/{id}") + @ApiOperation(value = ApiDoc.MANAGER_READ) + public ResponseEntity find(@PathVariable Long id) { + ManagerResponse response = ManagerResponse.of(managerService.findManager(id)); + return ResponseEntity.ok(response); + } + @GetMapping("/managers") + @ApiOperation(value = ApiDoc.MANAGER_READ_ALL) + public ResponseEntity> findAll() { + List responses = managerService.findManagers() + .stream() + .map(ManagerResponse::of) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } + @PutMapping("/manager/{id}") + @ApiOperation(value = ApiDoc.MANAGER_UPDATE) + public ResponseEntity update(@PathVariable Long id, @RequestBody ManagerCURequest request) { + ManagerResponse response = ManagerResponse.of(managerService.update(id, ManagerCUDto.of(request))); + return ResponseEntity.ok(response); + } + @PutMapping("/manager/approve/{id}") + @ApiOperation(value = ApiDoc.MANAGER_APPROVE) + public ResponseEntity approve(@PathVariable Long id) { + Long response = managerService.approve(id); + return ResponseEntity.ok(response); + } + @DeleteMapping("/manager/{id}") + @ApiOperation(value = ApiDoc.MANAGER_DELETE) + public ResponseEntity delete(@PathVariable Long id) { + Long response = managerService.delete(id); + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java b/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java index c0b1408..8dd225f 100644 --- a/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java +++ b/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java @@ -8,5 +8,10 @@ @Setter @NoArgsConstructor public class ManagerCURequest { + private String name; + private int power; + private String email; + private String department; + } diff --git a/src/main/java/com/server/hispath/manager/presentation/response/ManagerResponse.java b/src/main/java/com/server/hispath/manager/presentation/response/ManagerResponse.java new file mode 100644 index 0000000..b83d644 --- /dev/null +++ b/src/main/java/com/server/hispath/manager/presentation/response/ManagerResponse.java @@ -0,0 +1,26 @@ +package com.server.hispath.manager.presentation.response; + +import com.server.hispath.manager.application.dto.ManagerDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ManagerResponse { + private Long id; + private int power; + private String name; + private String email; + private String department; + private boolean approved; + + + public static ManagerResponse of(ManagerDto dto) { + return new ManagerResponse(dto.getId(), dto.getPower(), dto.getName(), + dto.getEmail(), dto.getDepartment(), dto.isApproved()); + } + +} diff --git a/src/main/java/com/server/hispath/notice/application/NoticeService.java b/src/main/java/com/server/hispath/notice/application/NoticeService.java index 725f200..f9a6b12 100644 --- a/src/main/java/com/server/hispath/notice/application/NoticeService.java +++ b/src/main/java/com/server/hispath/notice/application/NoticeService.java @@ -3,16 +3,18 @@ import com.server.hispath.exception.notice.NoticeNotFoundException; import com.server.hispath.manager.application.ManagerService; import com.server.hispath.manager.domain.Manager; +import com.server.hispath.notice.application.dto.DashboardNoticeDto; import com.server.hispath.notice.application.dto.NoticeContentDto; import com.server.hispath.notice.application.dto.NoticeDto; import com.server.hispath.notice.domain.Notice; import com.server.hispath.notice.domain.repository.NoticeRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; -import javax.transaction.Transactional; +import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; @@ -24,13 +26,10 @@ public class NoticeService { private final ManagerService managerService; - private Notice findById(Long id){ + private Notice findById(Long id) { return noticeRepository.findById(id).orElseThrow(NoticeNotFoundException::new); } - - //C - @Transactional public Long create(Long managerId, NoticeContentDto dto) { Manager manager = managerService.findById(managerId); @@ -39,25 +38,20 @@ public Long create(Long managerId, NoticeContentDto dto) { return savedNotice.getId(); } - // R - @Transactional + @Transactional(readOnly = true) public List findAll() { List notices = noticeRepository.findAll(); return notices.stream().map(NoticeDto::from).collect(Collectors.toList()); } - @Transactional - public NoticeDto find(Long id){ + @Transactional(readOnly = true) + public NoticeDto find(Long id) { Notice notice = this.findById(id); return NoticeDto.from(notice); } - - - // U - @Transactional - public NoticeDto update(Long id, Long managerId, NoticeContentDto dto){ + public NoticeDto update(Long id, Long managerId, NoticeContentDto dto) { Notice notice = this.findById(id); Manager manager = managerService.findById(managerId); notice.update(manager, dto); @@ -65,10 +59,17 @@ public NoticeDto update(Long id, Long managerId, NoticeContentDto dto){ return NoticeDto.from(notice); } - - // D @Transactional - public void delete(Long id){ + public void delete(Long id) { noticeRepository.deleteById(id); } + + @Transactional(readOnly = true) + public List findRecentNotice() { + List notices = noticeRepository.findTop5ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate.now(), LocalDate.now()); + + return notices.stream() + .map(DashboardNoticeDto::of) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java b/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java new file mode 100644 index 0000000..7f7fb86 --- /dev/null +++ b/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java @@ -0,0 +1,22 @@ +package com.server.hispath.notice.application.dto; + +import java.time.LocalDate; + +import com.server.hispath.notice.domain.Notice; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class DashboardNoticeDto { + private Long id; + private String title; + private LocalDate pubDate; + + public static DashboardNoticeDto of(Notice notice) { + return new DashboardNoticeDto(notice.getId(), notice.getTitle(), notice.getPubDate()); + } +} diff --git a/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java b/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java index 9f73e84..6286073 100644 --- a/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java +++ b/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java @@ -27,7 +27,7 @@ public class NoticeDto{ private LocalDate expDate; public static NoticeDto from(Notice notice) { - return new NoticeDto(notice.getId(), ManagerDto.from(notice.getManager()), notice.getTitle(), + return new NoticeDto(notice.getId(), ManagerDto.of(notice.getManager()), notice.getTitle(), notice.getContent(), notice.getViewCnt(), notice.isImportance(), notice.getPubDate(), notice.getExpDate()); } } diff --git a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java index 73e0bb7..4f37684 100644 --- a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java +++ b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java @@ -6,15 +6,12 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.time.LocalDate; +import java.util.List; import java.util.Optional; @Repository public interface NoticeRepository extends JpaRepository { - -// //SELECT * from student where title = ? -// @Query("SELECT n FROM notice n WHERE n.title=?1") -// Optional findNoticeByTitle(String search); - - + List findTop5ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate pubDate, LocalDate expDate); } diff --git a/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java b/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java index e4d2b74..90062b4 100644 --- a/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java +++ b/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java @@ -1,8 +1,8 @@ package com.server.hispath.notice.presentation.response; -import java.time.LocalDateTime; +import java.time.LocalDate; -import com.server.hispath.notice.application.dto.NoticeDto; +import com.server.hispath.notice.application.dto.DashboardNoticeDto; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,6 +14,9 @@ public class NoticeDashboardResponse { private Long noticeId; private String title; - private LocalDateTime pubDate; + private LocalDate pubDate; + static public NoticeDashboardResponse of(DashboardNoticeDto dto) { + return new NoticeDashboardResponse(dto.getId(), dto.getTitle(), dto.getPubDate()); + } } diff --git a/src/main/java/com/server/hispath/student/application/dto/DashboardDto.java b/src/main/java/com/server/hispath/student/application/dto/DashboardDto.java index 95d9990..e635263 100644 --- a/src/main/java/com/server/hispath/student/application/dto/DashboardDto.java +++ b/src/main/java/com/server/hispath/student/application/dto/DashboardDto.java @@ -3,7 +3,6 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; @Getter @NoArgsConstructor diff --git a/src/main/java/com/server/hispath/student/presentation/StudentController.java b/src/main/java/com/server/hispath/student/presentation/StudentController.java index e68c38d..26e0774 100644 --- a/src/main/java/com/server/hispath/student/presentation/StudentController.java +++ b/src/main/java/com/server/hispath/student/presentation/StudentController.java @@ -1,19 +1,26 @@ package com.server.hispath.student.presentation; import com.server.hispath.docs.ApiDoc; +import com.server.hispath.notice.application.NoticeService; +import com.server.hispath.notice.application.dto.DashboardNoticeDto; +import com.server.hispath.notice.application.dto.NoticeDto; import com.server.hispath.student.application.StudentService; import com.server.hispath.student.application.dto.StudentCUDto; import com.server.hispath.student.application.dto.StudentDto; import com.server.hispath.student.presentation.request.StudentCURequest; +import com.server.hispath.student.presentation.response.DashboardResponse; import com.server.hispath.student.presentation.response.StudentResponse; import com.server.hispath.util.ExcelManager; + import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; + import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import lombok.RequiredArgsConstructor; + import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -25,6 +32,7 @@ public class StudentController { private final StudentService studentService; + private final NoticeService noticeService; @PostMapping("/student") @ApiOperation(value = ApiDoc.STUDENT_CREATE) @@ -53,8 +61,8 @@ public ResponseEntity find(@PathVariable Long id) { public ResponseEntity> findAll() { List dtos = studentService.findAll(); List responses = dtos.stream() - .map(StudentResponse::from) - .collect(Collectors.toList()); + .map(StudentResponse::from) + .collect(Collectors.toList()); return ResponseEntity.ok(responses); } @@ -72,4 +80,12 @@ public ResponseEntity delete(@PathVariable Long id) { studentService.delete(id); return ResponseEntity.ok(id); } + + @GetMapping("/student/dashboard/{id}") + @ApiOperation(value = ApiDoc.DASHBOARD) + public ResponseEntity getDashboardInfo(@PathVariable Long id) { + StudentDto studentDto = studentService.find(id); + List dashboardNoticeDtos = noticeService.findRecentNotice(); + return ResponseEntity.ok(DashboardResponse.from(studentDto, dashboardNoticeDtos)); + } } diff --git a/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java b/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java index 4972244..6ea3227 100644 --- a/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java +++ b/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java @@ -1,6 +1,13 @@ package com.server.hispath.student.presentation.response; +import java.util.List; +import java.util.stream.Collectors; + +import com.server.hispath.major.presentation.response.MajorResponse; +import com.server.hispath.notice.application.dto.DashboardNoticeDto; import com.server.hispath.notice.presentation.response.NoticeDashboardResponse; +import com.server.hispath.student.application.dto.DashboardDto; +import com.server.hispath.student.application.dto.StudentDto; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,13 +21,20 @@ public class DashboardResponse { private String profile; private String name; private String studentNum; - private String major1; - private String major2; + private MajorResponse major1; + private MajorResponse major2; private int semester; private String email; private String phone; private String githubId; private String blog; private String readme; - private NoticeDashboardResponse notice; + private List notice; + + public static DashboardResponse from(StudentDto studentDto, List noticeDtos) { + return new DashboardResponse(studentDto.getId(), studentDto.getProfile(), studentDto.getName(), studentDto.getStudentNum(), + MajorResponse.from(studentDto.getMajor1()), MajorResponse.from(studentDto.getMajor2()), studentDto.getSemester(), + studentDto.getEmail(), studentDto.getPhone(), studentDto.getGithubId(), studentDto.getBlog(), studentDto.getReadme(), + noticeDtos.stream().map(NoticeDashboardResponse::of).collect(Collectors.toList())); + } } From 1055487d1c243aa8b96e235c002db263d5796198 Mon Sep 17 00:00:00 2001 From: lukehongg <79990740+lukehongg@users.noreply.github.com> Date: Wed, 12 Oct 2022 03:49:45 +0900 Subject: [PATCH 048/148] =?UTF-8?q?[#26]:=20=EA=B3=B5=EC=A7=80=20API=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EC=97=B0=EA=B2=B0=20(#27)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/hispath/common/TestController.java | 23 +++++++++++++++++++ .../java/com/server/hispath/docs/ApiDoc.java | 1 + .../server/hispath/notice/domain/Notice.java | 1 - .../notice/presentation/NoticeController.java | 13 ++++++----- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 1b0add6..2104911 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -24,6 +24,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -152,6 +153,10 @@ public ResponseEntity initManager(){ return ResponseEntity.ok(null); } + + + + @GetMapping("/init/notice") public ResponseEntity initNotice(){ List l = new ArrayList(); @@ -229,6 +234,24 @@ public ResponseEntity initNotice(){ .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 7)) .expDate(LocalDate.of(2022, Month.OCTOBER, 12)) .build()); + noticeRepository.save(Notice.builder() + .manager(l.get(1)) + .title("SW news for Novem") + .content("Is going to be FUNNN") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.OCTOBER, 21)) + .expDate(LocalDate.of(2022, Month.OCTOBER, 30)) + .build()); + noticeRepository.save(Notice.builder() + .manager(l.get(6)) + .title("SW Festival ends") + .content("See you next year!") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2)) + .expDate(LocalDate.of(2022, Month.NOVEMBER, 9)) + .build()); return ResponseEntity.ok(null); } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 83b69f0..c9248a7 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -65,4 +65,5 @@ public class ApiDoc { public static final String DEPARTMENT_UPDATE = "학부 수정"; public static final String DEPARTMENT_DELETE = "학부 삭제"; + } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/notice/domain/Notice.java b/src/main/java/com/server/hispath/notice/domain/Notice.java index 7808eaa..2409388 100644 --- a/src/main/java/com/server/hispath/notice/domain/Notice.java +++ b/src/main/java/com/server/hispath/notice/domain/Notice.java @@ -60,7 +60,6 @@ public static Notice from(Manager manager, NoticeContentDto dto) { .build(); } - // dto와 manager를 받아서 notice로 병합 public void update(Manager manager, NoticeContentDto dto) { this.manager = manager; this.title = dto.getTitle(); diff --git a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java index b05b49b..9951f49 100644 --- a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java +++ b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java @@ -13,6 +13,7 @@ import lombok.RequiredArgsConstructor; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -24,8 +25,7 @@ public class NoticeController { private final NoticeService noticeService; - // C - + @CrossOrigin(origins = "http://localhost:3000") @PostMapping("/notice/add") @ApiOperation(value= ApiDoc.NOTICE_CREATE) public ResponseEntity create(@RequestBody NoticeRequest request){ @@ -33,15 +33,15 @@ public ResponseEntity create(@RequestBody NoticeRequest request){ return ResponseEntity.ok(id); } - // R - + @CrossOrigin(origins = "http://localhost:3000") @GetMapping("/notice") @ApiOperation(value = ApiDoc.NOTICE_READ_ALL) public ResponseEntity> findAll() { - List responses = noticeService.findAll().stream().map(NoticeResponse::from).collect(Collectors.toList()); + List responses = noticeService.findAll().stream().sorted(Comparator.comparing(NoticeDto::getId).reversed()).map(NoticeResponse::from).collect(Collectors.toList()); return ResponseEntity.ok(responses); } + @CrossOrigin(origins = "http://localhost:3000") @GetMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_READ) public ResponseEntity find(@PathVariable Long id){ @@ -50,8 +50,8 @@ public ResponseEntity find(@PathVariable Long id){ } - // U + @CrossOrigin(origins = "http://localhost:3000") @PatchMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_UPDATE) public ResponseEntity update(@PathVariable Long id, @RequestBody NoticeRequest request){ @@ -63,6 +63,7 @@ public ResponseEntity update(@PathVariable Long id, @RequestBody // D + @CrossOrigin(origins = "http://localhost:3000") @DeleteMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_DELETE) public ResponseEntity delete(@PathVariable Long id){ From d1b0f87b223f0b47f6a65dba86a28b25afc694d6 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Wed, 12 Oct 2022 19:38:46 +0900 Subject: [PATCH 049/148] =?UTF-8?q?[#28]=20:=20Activity,=20Participant=20E?= =?UTF-8?q?ntity=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EA=B4=80=EB=A0=A8=20A?= =?UTF-8?q?PI=20=EC=88=98=EC=A0=95=20(#30)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix[#28] : Activity 의 시간 관련 컬럼 삭제 * feat[#28] : 전체 데이터 init해주는 controller 생성 * fix[#28] : Participant 엑셀 등록시 Section 기타로 추가 --- .../application/dto/ActivityContentDto.java | 4 +- .../activity/application/dto/ActivityDto.java | 6 +- .../application/dto/MActivityContentDto.java | 4 +- .../application/dto/MActivityDetailDto.java | 4 +- .../hispath/activity/domain/Activity.java | 23 +- .../request/ActivityCURequest.java | 4 - .../request/MActivityCURequest.java | 4 - .../response/ActivityResponse.java | 6 +- .../server/hispath/common/TestController.java | 843 +++++++++++------- .../repository/DepartementRepository.java | 3 + .../java/com/server/hispath/docs/ApiDoc.java | 2 +- .../domain/repository/MajorRepository.java | 4 + .../student/application/StudentService.java | 3 +- .../domain/{participate => }/Participant.java | 8 +- .../hispath/student/domain/Section.java | 16 + .../hispath/student/domain/Student.java | 1 - .../com/server/hispath/util/ExcelManager.java | 24 +- 17 files changed, 566 insertions(+), 393 deletions(-) rename src/main/java/com/server/hispath/student/domain/{participate => }/Participant.java (79%) create mode 100644 src/main/java/com/server/hispath/student/domain/Section.java diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java index 269555f..b8a4a73 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java @@ -21,11 +21,9 @@ public class ActivityContentDto { private String name; private String remark; private int weight; - private LocalDateTime startDate; - private LocalDateTime endDate; public static ActivityContentDto from(ActivityCURequest request) { return new ActivityContentDto(request.getSemester(), request.isPersonal(), request.getRequestStatus(), - request.getName(), request.getRemark(), request.getWeight(), request.getStartDate(), request.getEndDate()); + request.getName(), request.getRemark(), request.getWeight()); } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java index 227acc9..d5eb6e1 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java @@ -1,7 +1,5 @@ package com.server.hispath.activity.application.dto; -import java.time.LocalDateTime; - import com.server.hispath.activity.domain.Activity; import com.server.hispath.category.application.dto.CategoryDto; @@ -21,12 +19,10 @@ public class ActivityDto { private String remark; private int weight; private boolean studentRegistered; - private LocalDateTime startDate; - private LocalDateTime endDate; public static ActivityDto from(Activity activity) { return new ActivityDto(activity.getId(), CategoryDto.from(activity.getCategory()), activity.getSemester(), activity.isPersonal(), activity.getName(), activity.getRemark(), activity.getWeight(), - activity.isStudentRegistered(), activity.getStartDate(), activity.getEndDate()); + activity.isStudentRegistered()); } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/MActivityContentDto.java b/src/main/java/com/server/hispath/activity/application/dto/MActivityContentDto.java index f842e47..7ebf9b0 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/MActivityContentDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/MActivityContentDto.java @@ -17,11 +17,9 @@ public class MActivityContentDto { private String name; private String remark; private int weight; - private LocalDateTime startDate; - private LocalDateTime endDate; public static MActivityContentDto of(MActivityCURequest request) { return new MActivityContentDto(request.getCategoryId(), request.getSemester(), request.getName(), - request.getRemark(), request.getWeight(), request.getStartDate(), request.getEndDate()); + request.getRemark(), request.getWeight()); } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/MActivityDetailDto.java b/src/main/java/com/server/hispath/activity/application/dto/MActivityDetailDto.java index d57682c..6d1cc24 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/MActivityDetailDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/MActivityDetailDto.java @@ -23,15 +23,13 @@ public class MActivityDetailDto { private CategoryDto category; private String semester; private String remark; - private LocalDateTime startDate; - private LocalDateTime endDate; private int weight; private List students = new ArrayList<>(); public static MActivityDetailDto from(Activity activity, List students) { return new MActivityDetailDto(activity.getId(), activity.getName(), CategoryDto.from(activity.getCategory()), - activity.getSemester(), activity.getRemark(), activity.getStartDate(), activity.getEndDate(), activity.getWeight(), students); + activity.getSemester(), activity.getRemark(), activity.getWeight(), students); } } diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index fd4e58c..42cb2cc 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -1,17 +1,16 @@ package com.server.hispath.activity.domain; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import javax.persistence.*; -import com.fasterxml.jackson.annotation.JsonFormat; import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.activity.application.dto.MActivityContentDto; import com.server.hispath.category.domain.Category; import com.server.hispath.common.BaseEntity; +import com.server.hispath.student.domain.Section; import com.server.hispath.student.domain.Student; -import com.server.hispath.student.domain.participate.Participant; +import com.server.hispath.student.domain.Participant; import com.sun.istack.NotNull; import lombok.AllArgsConstructor; @@ -50,12 +49,6 @@ public class Activity extends BaseEntity { private boolean studentRegistered = false; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") - private LocalDateTime startDate; - - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") - private LocalDateTime endDate; - int weight; @OneToMany(mappedBy = "activity", cascade = CascadeType.PERSIST, orphanRemoval = true) @@ -70,8 +63,6 @@ public static Activity from(Category category, ActivityContentDto dto) { .name(dto.getName()) .remark(dto.getRemark()) .weight(dto.getWeight()) - .startDate(dto.getStartDate()) - .endDate(dto.getEndDate()) .build(); } @@ -84,8 +75,6 @@ public static Activity from(Category category, MActivityContentDto dto) { .name(dto.getName()) .remark(dto.getRemark()) .weight(dto.getWeight()) - .startDate(dto.getStartDate()) - .endDate(dto.getEndDate()) .build(); } @@ -97,8 +86,6 @@ public void update(Category category, ActivityContentDto dto) { this.name = dto.getName(); this.remark = dto.getRemark(); this.weight = dto.getWeight(); - this.startDate = dto.getStartDate(); - this.endDate = dto.getEndDate(); } public void update(Category category, MActivityContentDto dto) { @@ -107,12 +94,10 @@ public void update(Category category, MActivityContentDto dto) { this.name = dto.getName(); this.remark = dto.getRemark(); this.weight = dto.getWeight(); - this.startDate = dto.getStartDate(); - this.endDate = dto.getEndDate(); } - public void addParticipant(Student student) { - Participant participant = new Participant(student, this); + public void addParticipant(Student student, Section section) { + Participant participant = new Participant(student, this, section); this.participants.add(participant); student.addParticipant(participant); diff --git a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java index 291d696..8ec02a3 100644 --- a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java +++ b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java @@ -20,8 +20,4 @@ public class ActivityCURequest { private String remark; private int weight; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") - private LocalDateTime startDate; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") - private LocalDateTime endDate; } diff --git a/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java index a7e72ad..843db11 100644 --- a/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java +++ b/src/main/java/com/server/hispath/activity/presentation/request/MActivityCURequest.java @@ -18,8 +18,4 @@ public class MActivityCURequest { private String remark; private int weight; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") - private LocalDateTime startDate; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") - private LocalDateTime endDate; } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java index f95f4ad..315b1d7 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java @@ -22,14 +22,10 @@ public class ActivityResponse { private String remark; private int weight; private boolean studentRegistered; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") - private LocalDateTime startDate; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") - private LocalDateTime endDate; public static ActivityResponse from(ActivityDto dto) { return new ActivityResponse(dto.getId(), dto.getCategoryDto().getId(), dto.getCategoryDto().getName(), dto.getSemester(), dto.isPersonal(), dto.getName(), dto.getRemark(), dto.getWeight(), - dto.isStudentRegistered(), dto.getStartDate(), dto.getEndDate()); + dto.isStudentRegistered()); } } diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 2104911..f57746a 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -4,31 +4,35 @@ import java.time.Month; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.auth.domain.*; import com.server.hispath.category.domain.Category; import com.server.hispath.category.domain.repository.CategoryRepository; -import com.server.hispath.department.application.dto.DepartmentDto; import com.server.hispath.department.domain.Department; import com.server.hispath.department.domain.repository.DepartementRepository; import com.server.hispath.exception.manager.ManagerNotFoundException; +import com.server.hispath.major.domain.Major; import com.server.hispath.major.domain.repository.MajorRepository; import com.server.hispath.manager.domain.Manager; import com.server.hispath.manager.domain.repository.ManagerRepository; import com.server.hispath.notice.domain.Notice; import com.server.hispath.notice.domain.repository.NoticeRepository; +import com.server.hispath.student.application.StudentService; +import com.server.hispath.student.application.dto.StudentRefDto; import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; -import lombok.AllArgsConstructor; -import lombok.Builder; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import lombok.Builder; import lombok.RequiredArgsConstructor; @RestController @@ -44,55 +48,75 @@ public class TestController { private final MajorRepository majorRepository; private final ManagerRepository managerRepository; private final DepartementRepository departementRepository; + private final ActivityRepository activityRepository; + private final StudentService studentService; + + @GetMapping("/init/all") + public ResponseEntity initAll() { + saveCategory(); + saveMajor(); + saveDepartment(); + saveStudent(); + saveManager(); + saveNotice(); + saveActivities(); + saveParticipant(); + return ResponseEntity.ok(null); + } + @GetMapping("/init/category") + public ResponseEntity initCategory() { + saveCategory(); + return ResponseEntity.ok(null); + } -// @GetMapping("/register/ref") -// public ResponseEntity testRegisterRefStudent() { -// for (int i = 0; i < 10; i++) { -// String studentNum = Integer.toString(22200000 + i); -// String name = "학생" + i; -// String email = "test" + i + "@handong.ac.kr"; -// int semester = 1; -// Student student = Student.builder() -// .studentNum(studentNum) -// .name(name) -// .email(email) -// } .semester(semester) -// .build(); -// studentRepository.save(student); -// return ResponseEntity.ok(null); -// } + @GetMapping("/init/department") + public ResponseEntity initDepartment() { + saveDepartment(); + return ResponseEntity.ok(null); + } - @GetMapping("/init/category") - public ResponseEntity testCategoryInit() { - categoryRepository.save(Category.builder() - .name("전공마일리지") - .build()); - categoryRepository.save(Category.builder() - .name("산학마일리지") - .build()); - categoryRepository.save(Category.builder() - .name("비교과-연구활동") - .build()); - categoryRepository.save(Category.builder() - .name("비교과-특강참여") - .build()); - categoryRepository.save(Category.builder() - .name("비교과-행사참여") - .build()); - categoryRepository.save(Category.builder() - .name("비교과-학회할동") - .build()); - categoryRepository.save(Category.builder() - .name("기타") - .build()); + @GetMapping("/init/notice") + public ResponseEntity initNotice() { + saveNotice(); + return ResponseEntity.ok(null); + } + @GetMapping("/init/activity") + public ResponseEntity initActivity() { + saveActivities(); + return ResponseEntity.ok(null); + } + + @GetMapping("/init/manager") + public ResponseEntity initManager() { + + saveManager(); + + return ResponseEntity.ok(null); + } + + @GetMapping("/init/major") + public ResponseEntity initMajor() { + saveMajor(); + return ResponseEntity.ok(null); + } + + @GetMapping("/init/student") + public ResponseEntity initStudent() { + saveStudent(); + return ResponseEntity.ok(null); + } + + @GetMapping("/init/participant") + public ResponseEntity initParticipant() { + saveParticipant(); return ResponseEntity.ok(null); } @GetMapping("/student/auth") @RequiredStudentLogin - public ResponseEntity testStudentAuth(@StudentLogin LoginStudent loginStudent){ + public ResponseEntity testStudentAuth(@StudentLogin LoginStudent loginStudent) { System.out.println(loginStudent.getId()); System.out.println(loginStudent.getStudentNum()); return ResponseEntity.ok(null); @@ -100,354 +124,521 @@ public ResponseEntity testStudentAuth(@StudentLogin LoginStudent loginStud @GetMapping("/manager/auth") @RequiredManagerLogin - public ResponseEntity testManagerAuth(@ManagerLogin LoginManager loginManager){ + public ResponseEntity testManagerAuth(@ManagerLogin LoginManager loginManager) { System.out.println(loginManager.getId()); return ResponseEntity.ok(null); } - @GetMapping("/init/manager") - public ResponseEntity initManager(){ - managerRepository.save(Manager.builder() - .name("Adam") - .email("Adams@handong.ac.kr") - .department("CSEE") - .approved(true).build()); + public void saveParticipant() { + List activities = activityRepository.findAll(); + List students = studentRepository.findAll(); + + + activities.forEach(activity -> { + studentService.registerParticipants(activity.getId(), + students.stream().map(student -> { + return new StudentRefDto(student.getId(), student.getName(), student.getStudentNum(), student.getSemester(), + student.getDepartment().getId(), student.getMajor1().getId(), student.getMajor2().getId(), + student.getPhone(), student.getEmail(), student.getProfile(), student.getBlog(), student.getGithubId(), + student.getReadme()); + }) + .collect(Collectors.toList())); + activity.updateStudentRegister(); + }); + + } + + private void saveManager() { managerRepository.save(Manager.builder() - .name("Boyci") - .email("BCI@handong.ac.kr") - .department("GLS") - .approved(true).build()); + .name("Adam") + .email("Adams@handong.ac.kr") + .department("CSEE") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("Charlie") - .email("Chars@handong.ac.kr") - .department("ME") - .approved(true).build()); + .name("Boyci") + .email("BCI@handong.ac.kr") + .department("GLS") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("David") - .email("Dvd@handong.ac.kr") - .department("CSEE") - .approved(true).build()); + .name("Charlie") + .email("Chars@handong.ac.kr") + .department("ME") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("Ethen") - .email("Eth@handong.ac.kr") - .department("GLS") - .approved(false).build()); + .name("David") + .email("Dvd@handong.ac.kr") + .department("CSEE") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("Jenny") - .email("jenny@handong.ac.kr") - .department("CUD") - .approved(false).build()); + .name("Ethen") + .email("Eth@handong.ac.kr") + .department("GLS") + .approved(false).build()); managerRepository.save(Manager.builder() - .name("Lucy") - .email("lucc@handong.ac.kr") - .department("CSEE") - .approved(true).build()); + .name("Jenny") + .email("jenny@handong.ac.kr") + .department("CUD") + .approved(false).build()); - return ResponseEntity.ok(null); + managerRepository.save(Manager.builder() + .name("Lucy") + .email("lucc@handong.ac.kr") + .department("CSEE") + .approved(true).build()); } - - - - @GetMapping("/init/notice") - public ResponseEntity initNotice(){ + private void saveNotice() { List l = new ArrayList(); - for(Long i = Long.valueOf(1); i<8; i++){ + for (Long i = Long.valueOf(1); i < 8; i++) { Manager temp = managerRepository.findById(i).orElseThrow(ManagerNotFoundException::new); l.add(temp); } noticeRepository.save(Notice.builder() - .manager(l.get(1)) - .title("Welcome to notice") - .content("This is the first notice") - .viewCnt(100) - .importance(true) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 5)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 12)) - .build()); + .manager(l.get(1)) + .title("Welcome to notice") + .content("This is the first notice") + .viewCnt(100) + .importance(true) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 5)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 12)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(2)) - .title("Second notice") - .content("This is the second notice") - .viewCnt(90) - .importance(false) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 6)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 18)) - .build()); + .manager(l.get(2)) + .title("Second notice") + .content("This is the second notice") + .viewCnt(90) + .importance(false) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 6)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 18)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(3)) - .title("SW festival") - .content("This is the third notice") - .viewCnt(50) - .importance(false) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 9)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 20)) - .build()); + .manager(l.get(3)) + .title("SW festival") + .content("This is the third notice") + .viewCnt(50) + .importance(false) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 9)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 20)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(4)) - .title("Capstone festival") - .content("Capstone festival in November") - .viewCnt(80) - .importance(true) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 5)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 30)) - .build()); + .manager(l.get(4)) + .title("Capstone festival") + .content("Capstone festival in November") + .viewCnt(80) + .importance(true) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 5)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 30)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(5)) - .title("GongPgi festival") - .content("GongPgi festival in October") - .viewCnt(100) - .importance(true) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 20)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 27)) - .build()); + .manager(l.get(5)) + .title("GongPgi festival") + .content("GongPgi festival in October") + .viewCnt(100) + .importance(true) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 20)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 27)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(2)) - .title("CSEE lecture") - .content("At october 17 in NTH 313") - .viewCnt(56) - .importance(false) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 18)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 25)) - .build()); + .manager(l.get(2)) + .title("CSEE lecture") + .content("At october 17 in NTH 313") + .viewCnt(56) + .importance(false) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 18)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 25)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(5)) - .title("SW news for October") - .content("Is coming soon!") - .viewCnt(1004) - .importance(true) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 7)) - .expDate(LocalDate.of(2022, Month.OCTOBER, 12)) - .build()); + .manager(l.get(5)) + .title("SW news for October") + .content("Is coming soon!") + .viewCnt(1004) + .importance(true) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 7)) + .expDate(LocalDate.of(2022, Month.OCTOBER, 12)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(1)) - .title("SW news for Novem") - .content("Is going to be FUNNN") - .viewCnt(0) - .importance(true) - .pubDate(LocalDate.of(2022, Month.OCTOBER, 21)) - .expDate(LocalDate.of(2022, Month.OCTOBER, 30)) - .build()); + .manager(l.get(1)) + .title("SW news for Novem") + .content("Is going to be FUNNN") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.OCTOBER, 21)) + .expDate(LocalDate.of(2022, Month.OCTOBER, 30)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(6)) - .title("SW Festival ends") - .content("See you next year!") - .viewCnt(0) - .importance(true) - .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2)) - .expDate(LocalDate.of(2022, Month.NOVEMBER, 9)) - .build()); - return ResponseEntity.ok(null); + .manager(l.get(6)) + .title("SW Festival ends") + .content("See you next year!") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2)) + .expDate(LocalDate.of(2022, Month.NOVEMBER, 9)) + .build()); } - @GetMapping("/init/student") - public ResponseEntity initStudent(){ + + private void saveStudent() { studentRepository.save(Student.builder() - .name("김한동") -// .departmentId(1) - .studentNum("22200000") - .semester(5) -// .major1("전산") -// .major2("전자") - .phone("010-1234-1234") - .email("kim@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@kim.github") - .loginCnt(0L) - .readme("kim's readme") - .build()); + .name("김한동") + .department(departementRepository.findByName("전산전자")) + .studentNum("22200000") + .semester(5) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1234-1234") + .email("kim@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@kim.github") + .loginCnt(0L) + .readme("kim's readme") + .build()); studentRepository.save(Student.builder() - .name("박한동") -// .department("커뮤니케이션학부") - .studentNum("22200001") - .semester(3) -// .major1("공연") -// .major2("영상") - .phone("010-1234-5678") - .email("park@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@park.github") - .loginCnt(0L) - .readme("park's readme") - .build()); + .name("박한동") + .department(departementRepository.findByName("전산전자")) + .studentNum("22200001") + .semester(3) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1234-5678") + .email("park@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@park.github") + .loginCnt(0L) + .readme("park's readme") + .build()); studentRepository.save(Student.builder() - .name("이한동") -// .department("국제어문학부") - .studentNum("22200002") - .semester(5) -// .major1("국제관계학") -// .major2("") - .phone("010-5678-1234") - .email("lee@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@lee.github") - .loginCnt(0L) - .readme("lee's readme") - .build()); + .name("이한동") + .department(departementRepository.findByName("전산전자")) + .studentNum("22200002") + .semester(5) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-5678-1234") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@lee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); studentRepository.save(Student.builder() - .name("정한동") -// .department("국제어문학부") - .studentNum("22200003") - .semester(6) -// .major1("국제관계학") -// .major2("") - .phone("010-1111-1111") - .email("jeong@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jeong.github") - .loginCnt(0L) - .readme("jeong's readme") - .build()); + .name("정한동") + .department(departementRepository.findByName("전산전자")) + .studentNum("22200003") + .semester(6) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1111-1111") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); studentRepository.save(Student.builder() - .name("우한동") -// .department("국제어문학부") - .studentNum("22200004") - .semester(6) -// .major1("국제관계학") -// .major2("") - .phone("010-2222-3333") - .email("woo@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@woo.github") - .loginCnt(0L) - .readme("woo's readme") - .build()); + .name("우한동") + .department(departementRepository.findByName("전산전자")) + .studentNum("22200004") + .semester(6) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2222-3333") + .email("woo@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@woo.github") + .loginCnt(0L) + .readme("woo's readme") + .build()); studentRepository.save(Student.builder() - .name("위한동") -// .department("국제어문학부") - .studentNum("22200005") - .semester(6) -// .major1("국제관계학") -// .major2("") - .phone("010-4444-1234") - .email("wi@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@wi.github") - .loginCnt(0L) - .readme("wi's readme") - .build()); + .name("위한동") + .department(departementRepository.findByName("전산전자")) + .studentNum("22200005") + .semester(6) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4444-1234") + .email("wi@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wi.github") + .loginCnt(0L) + .readme("wi's readme") + .build()); studentRepository.save(Student.builder() - .name("하한동") -// .department("국제어문학부") - .studentNum("22200006") - .semester(8) -// .major1("국제관계학") -// .major2("") - .phone("010-9999-1111") - .email("ha@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ha.github") - .loginCnt(0L) - .readme("ha's readme") - .build()); + .name("하한동") + .department(departementRepository.findByName("전산전자")) + .studentNum("22200006") + .semester(8) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-9999-1111") + .email("ha@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ha.github") + .loginCnt(0L) + .readme("ha's readme") + .build()); studentRepository.save(Student.builder() - .name("마한동") -// .department("국제어문학부") - .studentNum("22200007") - .semester(4) -// .major1("국제관계학") -// .major2("") - .phone("010-4312-4312") - .email("ma@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ma.github") - .loginCnt(0L) - .readme("ma's readme") - .build()); + .name("마한동") + .department(departementRepository.findByName("전산전자")) + .studentNum("22200007") + .semester(4) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4312-4312") + .email("ma@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ma.github") + .loginCnt(0L) + .readme("ma's readme") + .build()); studentRepository.save(Student.builder() - .name("유한동") -// .department("국제어문학부") - .studentNum("22200008") - .semester(6) -// .major1("국제관계학") -// .major2("") - .phone("010-3434-2323") - .email("yu@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@yu.github") - .loginCnt(0L) - .readme("yu's readme") - .build()); + .name("유한동") + .department(departementRepository.findByName("전산전자")) + .studentNum("22200008") + .semester(6) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-3434-2323") + .email("yu@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@yu.github") + .loginCnt(0L) + .readme("yu's readme") + .build()); studentRepository.save(Student.builder() - .name("진한동") -// .department("국제어문학부") - .studentNum("22200009") - .semester(7) -// .major1("국제관계학") -// .major2("") - .phone("010-8787-8787") - .email("jin@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jin.github") - .loginCnt(0L) - .readme("jin's readme") - .build()); - return ResponseEntity.ok(null); + .name("진한동") + .department(departementRepository.findByName("전산전자")) + .studentNum("22200009") + .semester(7) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-8787-8787") + .email("jin@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jin.github") + .loginCnt(0L) + .readme("jin's readme") + .build()); } - @GetMapping("/init/department") - public ResponseEntity initDepartment(){ + private void saveCategory() { + categoryRepository.save(Category.builder() + .name("전공마일리지") + .build()); + categoryRepository.save(Category.builder() + .name("산학마일리지") + .build()); + categoryRepository.save(Category.builder() + .name("비교과-연구활동") + .build()); + categoryRepository.save(Category.builder() + .name("비교과-특강참여") + .build()); + categoryRepository.save(Category.builder() + .name("비교과-행사참여") + .build()); + categoryRepository.save(Category.builder() + .name("비교과-학회할동") + .build()); + categoryRepository.save(Category.builder() + .name("기타") + .build()); + } + + + private void saveDepartment() { departementRepository.save(Department.builder() - .name("전산전자") - .build()); + .name("전산전자") + .build()); departementRepository.save(Department.builder() - .name("국제어문") - .build()); + .name("국제어문") + .build()); departementRepository.save(Department.builder() - .name("경영경제") - .build()); + .name("경영경제") + .build()); departementRepository.save(Department.builder() - .name("법학부") - .build()); + .name("법학부") + .build()); departementRepository.save(Department.builder() - .name("커뮤니케이션") - .build()); + .name("커뮤니케이션") + .build()); departementRepository.save(Department.builder() - .name("상당복지") - .build()); + .name("상당복지") + .build()); departementRepository.save(Department.builder() - .name("상당복지") - .build()); + .name("상당복지") + .build()); departementRepository.save(Department.builder() - .name("공간환경시스템") - .build()); + .name("공간환경시스템") + .build()); departementRepository.save(Department.builder() - .name("콘텐츠융합디자인") - .build()); + .name("콘텐츠융합디자인") + .build()); departementRepository.save(Department.builder() - .name("기계제어") - .build()); + .name("기계제어") + .build()); departementRepository.save(Department.builder() - .name("ICT창업학부") - .build()); + .name("ICT창업학부") + .build()); departementRepository.save(Department.builder() - .name("기계제어") - .build()); - return ResponseEntity.ok(null); + .name("기계제어") + .build()); + } + + + public void saveActivities() { + activityRepository.save(Activity.builder() + .semester("2021-2") + .personal(false) + .remark("Spring 이용") + .requestStatus(1) + .name("(캠프)웹서비스 프로젝트(spring)_장소연") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("우수상 수상") + .requestStatus(1) + .name("비즈플로우") + .weight(2) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2020-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)미리미리C 캠프_김광") + .weight(5) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2020-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("C 프로그래밍") + .weight(1) + .category(categoryRepository.findByName("전공마일리지")) + .build()); + activityRepository.save(Activity.builder() + .semester("2021-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("AI프로젝트 입문") + .weight(2) + .category(categoryRepository.findByName("전공마일리지")) + .build()); + activityRepository.save(Activity.builder() + .semester("2019-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)Advanced Flutter Camp_조성배") + .weight(4) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2019-1") + .personal(true) + .remark("") + .requestStatus(1) + .name("정보처리기사 자격증") + .weight(2) + .category(categoryRepository.findByName("기타")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("공학프로젝트기획") + .weight(6) + .category(categoryRepository.findByName("전공마일리지")) + .build()); + activityRepository.save(Activity.builder() + .semester("2020-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("캡스톤") + .weight(1) + .category(categoryRepository.findByName("전공마일리지")) + .build()); + activityRepository.save(Activity.builder() + .semester("2021-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("프로그래밍 집중훈련 캠프_김호준") + .weight(7) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + } + + + private void saveMajor() { + majorRepository.save(Major.builder().name("-").build()); + majorRepository.save(Major.builder().name("건설공학전공").build()); + majorRepository.save(Major.builder().name("도시환경공학전공").build()); + majorRepository.save(Major.builder().name("기계공학전공").build()); + majorRepository.save(Major.builder().name("전자제어공학전공").build()); + majorRepository.save(Major.builder().name("생명과학전공").build()); + majorRepository.save(Major.builder().name("글로벌융합전공").build()); + majorRepository.save(Major.builder().name("수학통계전공").build()); + majorRepository.save(Major.builder().name("학생설계융합전공").build()); + majorRepository.save(Major.builder().name("시각디자인전공").build()); + majorRepository.save(Major.builder().name("제품디자인전공").build()); + majorRepository.save(Major.builder().name("컴퓨터공학전공").build()); + majorRepository.save(Major.builder().name("컴퓨터공학심화전공").build()); + majorRepository.save(Major.builder().name("전자공학전공").build()); + majorRepository.save(Major.builder().name("전자공학심화전공").build()); + majorRepository.save(Major.builder().name("Information Technology").build()); + majorRepository.save(Major.builder().name("ICT 융합전공").build()); + majorRepository.save(Major.builder().name("AI Convergence & Entrepreneurship").build()); + majorRepository.save(Major.builder().name("Global Entrepreneurship").build()); + majorRepository.save(Major.builder().name("AI 융합").build()); + majorRepository.save(Major.builder().name("데이터 사이언스 전공").build()); + majorRepository.save(Major.builder().name("경영학전공").build()); + majorRepository.save(Major.builder().name("경제학전공").build()); + majorRepository.save(Major.builder().name("Global Management").build()); + majorRepository.save(Major.builder().name("국제지역학전공").build()); + majorRepository.save(Major.builder().name("영어전공").build()); + majorRepository.save(Major.builder().name("한국법전공").build()); + majorRepository.save(Major.builder().name("US & International Law").build()); + majorRepository.save(Major.builder().name("상담심리학전공").build()); + majorRepository.save(Major.builder().name("사회복지학전공").build()); + majorRepository.save(Major.builder().name("공연영상학전공").build()); + majorRepository.save(Major.builder().name("언로정보학전공").build()); + majorRepository.save(Major.builder().name("글로벌융합전공").build()); + majorRepository.save(Major.builder().name("학생설계융합전공").build()); + majorRepository.save(Major.builder().name("글로벌한국학전공").build()); } } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/department/domain/repository/DepartementRepository.java b/src/main/java/com/server/hispath/department/domain/repository/DepartementRepository.java index 755a9b5..a44c17b 100644 --- a/src/main/java/com/server/hispath/department/domain/repository/DepartementRepository.java +++ b/src/main/java/com/server/hispath/department/domain/repository/DepartementRepository.java @@ -1,7 +1,10 @@ package com.server.hispath.department.domain.repository; +import java.util.Optional; + import com.server.hispath.department.domain.Department; import org.springframework.data.jpa.repository.JpaRepository; public interface DepartementRepository extends JpaRepository { + Department findByName(String name); } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index c9248a7..044b861 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -28,7 +28,7 @@ public class ApiDoc { public static final String CATEGORY_DELETE = "카테고리 삭제"; public static final String SCHOLARSHIP_CREATE = "장학금 신청 등록"; - public static final String ACTIVITY_READ_SEMESTER = "활동 학기별 조회"; + public static final String ACTIVITY_READ_SEMESTER = "활동 학기 조회"; public static final String MAJOR_CREATE = "전공 생성"; public static final String MAJOR_READ = "단일 전공 조회"; public static final String MAJOR_UPDATE = "전공 수정"; diff --git a/src/main/java/com/server/hispath/major/domain/repository/MajorRepository.java b/src/main/java/com/server/hispath/major/domain/repository/MajorRepository.java index ed31101..1cd245b 100644 --- a/src/main/java/com/server/hispath/major/domain/repository/MajorRepository.java +++ b/src/main/java/com/server/hispath/major/domain/repository/MajorRepository.java @@ -1,8 +1,12 @@ package com.server.hispath.major.domain.repository; +import java.util.Optional; + import com.server.hispath.major.domain.Major; import org.springframework.data.jpa.repository.JpaRepository; public interface MajorRepository extends JpaRepository { + + Major findByName(String name); } diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java index edd1156..5dad0c9 100644 --- a/src/main/java/com/server/hispath/student/application/StudentService.java +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -13,6 +13,7 @@ import com.server.hispath.activity.domain.Activity; import com.server.hispath.exception.student.StudentDataNotMatchException; import com.server.hispath.student.application.dto.StudentRefDto; +import com.server.hispath.student.domain.Section; import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; @@ -103,7 +104,7 @@ public void registerParticipants(Long activityId, List studentRef if (!student.isNameMatch(dto.getName())) { throw new StudentDataNotMatchException(dto.getStudentNum(), dto.getName()); } - activity.addParticipant(student); + activity.addParticipant(student, Section.ETC); }); activity.updateStudentRegister(); } diff --git a/src/main/java/com/server/hispath/student/domain/participate/Participant.java b/src/main/java/com/server/hispath/student/domain/Participant.java similarity index 79% rename from src/main/java/com/server/hispath/student/domain/participate/Participant.java rename to src/main/java/com/server/hispath/student/domain/Participant.java index 532a9a7..64e2c72 100644 --- a/src/main/java/com/server/hispath/student/domain/participate/Participant.java +++ b/src/main/java/com/server/hispath/student/domain/Participant.java @@ -1,4 +1,4 @@ -package com.server.hispath.student.domain.participate; +package com.server.hispath.student.domain; import javax.persistence.*; @@ -28,10 +28,14 @@ public class Participant extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) private Activity activity; + @Enumerated(EnumType.STRING) + private Section section; + String data; - public Participant(Student student, Activity activity) { + public Participant(Student student, Activity activity, Section section) { this.student = student; this.activity = activity; + this.section = section; } } diff --git a/src/main/java/com/server/hispath/student/domain/Section.java b/src/main/java/com/server/hispath/student/domain/Section.java new file mode 100644 index 0000000..c151589 --- /dev/null +++ b/src/main/java/com/server/hispath/student/domain/Section.java @@ -0,0 +1,16 @@ +package com.server.hispath.student.domain; + +public enum Section { + REWARD("수상"), SKILL("기술"), COURSE("과정"),LINK("링크"), + INTERNSHIP("인턴"), CERTIFICATE("자격증"), LANGUAGE("언어"), ETC("기타"); + + private String name; + + Section(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index fd23a56..48910df 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -12,7 +12,6 @@ import com.server.hispath.student.application.dto.StudentCUDto; import com.server.hispath.student.application.dto.StudentDto; import com.server.hispath.student.application.dto.StudentRefDto; -import com.server.hispath.student.domain.participate.Participant; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/server/hispath/util/ExcelManager.java b/src/main/java/com/server/hispath/util/ExcelManager.java index ffd7dff..05a11df 100644 --- a/src/main/java/com/server/hispath/util/ExcelManager.java +++ b/src/main/java/com/server/hispath/util/ExcelManager.java @@ -1,23 +1,17 @@ package com.server.hispath.util; import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.regex.Pattern; -import com.fasterxml.jackson.databind.ObjectMapper; import com.server.hispath.activity.application.dto.MActivityContentDto; -import com.server.hispath.department.application.dto.DepartmentDto; import com.server.hispath.exception.common.ExcelDataFormatException; import com.server.hispath.exception.common.ExcelFormatException; import com.server.hispath.exception.common.NotExcelExtensionException; -import com.server.hispath.major.application.dto.MajorDto; import com.server.hispath.student.application.dto.StudentRefDto; -import org.apache.tomcat.util.json.JSONParser; -import org.springframework.boot.configurationprocessor.json.JSONObject; import org.springframework.web.multipart.MultipartFile; import org.apache.commons.io.FilenameUtils; @@ -51,20 +45,16 @@ public static void validate(String semester) { public static List getMActivities(Sheet worksheet) { List mActivityContentDtos = new ArrayList<>(); - DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); for (int i = 1; i < worksheet.getPhysicalNumberOfRows(); i++) { try { Row row = worksheet.getRow(i); Long categoryId = Long.parseLong(row.getCell(0).toString().split("\\.")[0].toString()); String activityName = row.getCell(1).toString(); - String remark = row.getCell(2).toString(); - - LocalDateTime startDate = LocalDateTime.parse(row.getCell(3).toString(), dateTimeFormatter); - LocalDateTime endDate = LocalDateTime.parse(row.getCell(4).toString(), dateTimeFormatter); - int weight = Integer.parseInt(row.getCell(5).toString()); - String semester = row.getCell(6).toString(); + String remark = Objects.isNull(row.getCell(2)) ? "" : row.getCell(2).toString(); + int weight = Integer.parseInt(row.getCell(3).toString()); + String semester = row.getCell(4).toString(); validate(semester); - mActivityContentDtos.add(new MActivityContentDto(categoryId, semester, activityName, remark, weight, startDate, endDate)); + mActivityContentDtos.add(new MActivityContentDto(categoryId, semester, activityName, remark, weight)); } catch (Exception e) { throw new ExcelFormatException(e.getMessage()); } @@ -83,7 +73,9 @@ public static List getStudentDatas(Sheet worksheet) { int num = new BigDecimal(str).intValue(); String studentNum = Integer.toString(num); int studentSemester = Integer.parseInt(row.getCell(2).toString().split("\\.")[0]); - Long departmentId = Long.parseLong(row.getCell(3).toString().split("\\.")[0]);// int departmentId = 0; + Long departmentId = Long.parseLong(row.getCell(3) + .toString() + .split("\\.")[0]);// int departmentId = 0; Long major1Id = Long.parseLong(row.getCell(4).toString().split("\\.")[0]); Long major2Id = Long.parseLong(row.getCell(5).toString().split("\\.")[0]); From eb8f9c65acecf2d44ec3ac8280451e6f39a9e265 Mon Sep 17 00:00:00 2001 From: shinel98 <75024473+shinel98@users.noreply.github.com> Date: Wed, 12 Oct 2022 21:38:09 +0900 Subject: [PATCH 050/148] =?UTF-8?q?feat[#29]=20:=20=ED=95=99=EC=83=9D?= =?UTF-8?q?=EB=B3=84=20=EB=A7=88=EC=9D=BC=EB=A6=AC=EC=A7=80=20=ED=99=9C?= =?UTF-8?q?=EB=8F=99=20=EC=A1=B0=ED=9A=8C=20=EA=B5=AC=ED=98=84=20(#32)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/ActivityService.java | 2 +- .../application/MActivityService.java | 17 +++++-- .../dto/MStudentActivityDetailDto.java | 46 +++++++++++++++++++ .../activity/application/dto/SemesterDto.java | 4 +- .../domain/repository/ActivityRepository.java | 4 +- .../presentation/ActivityController.java | 12 +++++ .../presentation/MActivityController.java | 13 ++++-- .../java/com/server/hispath/docs/ApiDoc.java | 2 + .../domain/repository/StudentRepository.java | 7 +++ 9 files changed, 97 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/server/hispath/activity/application/dto/MStudentActivityDetailDto.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index 9d81aeb..6899260 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -68,7 +68,7 @@ public Activity findById(Long id) { @Transactional(readOnly = true) public List bringSemester() { - Optional semesters = activityRepository.bringSemester(); + List semesters = activityRepository.bringSemester(); return semesters.stream() .map(SemesterDto::from) .collect(Collectors.toList()); diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index 4e50c5a..3ff94c1 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -4,9 +4,7 @@ import java.util.Objects; import java.util.stream.Collectors; -import com.server.hispath.activity.application.dto.ActivityDto; -import com.server.hispath.activity.application.dto.MActivityContentDto; -import com.server.hispath.activity.application.dto.MActivityDetailDto; +import com.server.hispath.activity.application.dto.*; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.category.application.CategoryService; @@ -96,4 +94,17 @@ public MActivityDetailDto findDetailActivityInfo(Long activityId) { .collect(Collectors.toList()); return MActivityDetailDto.from(activity, students); } + + @Transactional + public MStudentActivityDetailDto findActivitiesByStudent(Long studentId) { + Student student = studentRepository.findActivitiesByStudent(studentId).orElseThrow(StudentNotFoundException::new); + List activities = student.getParticipants() + .stream() + .map(participant -> { + return ActivityDto.from(participant.getActivity()); + }) + .collect(Collectors.toList()); + + return MStudentActivityDetailDto.from(student, activities); + } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/MStudentActivityDetailDto.java b/src/main/java/com/server/hispath/activity/application/dto/MStudentActivityDetailDto.java new file mode 100644 index 0000000..ce78262 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/MStudentActivityDetailDto.java @@ -0,0 +1,46 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.category.application.dto.CategoryDto; +import com.server.hispath.student.application.dto.StudentRefDetailDto; +import com.server.hispath.student.domain.Student; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class MStudentActivityDetailDto { +// private Long id; +// private String name; +// private CategoryDto category; +// private int studentNum; +// private String semester; +// private String remark; +// private LocalDateTime startDate; +// private LocalDateTime endDate; +// private int weight; + + + private Long id; + + private String name; + + private String studentNum; + + private int semester; + + + + private List activities = new ArrayList<>(); + + public static MStudentActivityDetailDto from(Student student, List activities) { + return new MStudentActivityDetailDto(student.getId(), student.getName(), student.getStudentNum(), student.getSemester() ,activities); + + } +} diff --git a/src/main/java/com/server/hispath/activity/application/dto/SemesterDto.java b/src/main/java/com/server/hispath/activity/application/dto/SemesterDto.java index 6414825..6a5c7df 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/SemesterDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/SemesterDto.java @@ -13,8 +13,8 @@ public class SemesterDto { private String semester; - public static SemesterDto from(Activity activity) { - return new SemesterDto(activity.getSemester()); + public static SemesterDto from(String semester) { + return new SemesterDto(semester); } } diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java index 701e384..fe9879b 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -17,7 +17,9 @@ public interface ActivityRepository extends JpaRepository { "where a.id = :id" ) Optional findActivityWithStudents(Long id); + + @Query("select distinct semester from Activity") - Optional bringSemester(); + List bringSemester(); } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index 1871f0d..bc593ba 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -4,8 +4,10 @@ import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.application.MActivityService; import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.activity.application.dto.ActivityDto; +import com.server.hispath.activity.application.dto.MStudentActivityDetailDto; import com.server.hispath.activity.application.dto.SemesterDto; import com.server.hispath.activity.presentation.request.ActivityCURequest; import com.server.hispath.activity.presentation.response.ActivityResponse; @@ -25,6 +27,8 @@ public class ActivityController { private final ActivityService activityService; + private final MActivityService mActivityService; + @PostMapping("/activity") @ApiOperation(value = ApiDoc.ACTIVITY_CREATE) public ResponseEntity create(@RequestBody ActivityCURequest request) { @@ -69,6 +73,8 @@ public ResponseEntity delete(@PathVariable Long id) { return ResponseEntity.ok(id); } + + @GetMapping("/semester") @ApiOperation(value = ApiDoc.ACTIVITY_READ_SEMESTER) public ResponseEntity> findAllBySemester() { @@ -78,4 +84,10 @@ public ResponseEntity> findAllBySemester() { .collect(Collectors.toList()); return ResponseEntity.ok(responses); } + + @GetMapping("/studentactivity/{id}") + @ApiOperation(value = ApiDoc.STUDENT_MILEAGE_READ) + public ResponseEntity findActivtyByStudentId(@PathVariable Long id) { + return ResponseEntity.ok(mActivityService.findActivitiesByStudent(id)); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 83049a9..197fde7 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -5,9 +5,7 @@ import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.MActivityService; -import com.server.hispath.activity.application.dto.ActivityDto; -import com.server.hispath.activity.application.dto.MActivityContentDto; -import com.server.hispath.activity.application.dto.MActivityDetailDto; +import com.server.hispath.activity.application.dto.*; import com.server.hispath.activity.presentation.request.MActivityCURequest; import com.server.hispath.activity.presentation.request.MParticipantRequest; import com.server.hispath.activity.presentation.response.ActivityResponse; @@ -94,4 +92,13 @@ public ResponseEntity deleteParticipant(@RequestBody MParticipantRequest r public ResponseEntity findMileageActivityById(@PathVariable Long id) { return ResponseEntity.ok(mActivityService.findDetailActivityInfo(id)); } + + @GetMapping("/studentmileage/{id}") + @ApiOperation(value = ApiDoc.STUDENT_MILEAGE_READ) + public ResponseEntity findActivtyByStudentId(@PathVariable Long id) { + return ResponseEntity.ok(mActivityService.findActivitiesByStudent(id)); + } + + + } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 044b861..6044585 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -20,6 +20,8 @@ public class ApiDoc { public static final String MILEAGE_REGISTER_STUDENTS = "마일리지 활동 참가 학생 엑셀 등록"; public static final String ACTIVITY_STUDENT_DELETE = "마일리지 활동 학생 참가 정보 삭제"; public static final String MILEAGE_READ = "단일 마일리지 활동 조회"; + + public static final String STUDENT_MILEAGE_READ = "학생별 마일리지 활동 조회"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java index f112a5e..14022e4 100644 --- a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java @@ -5,9 +5,16 @@ import com.server.hispath.student.domain.Student; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; public interface StudentRepository extends JpaRepository { Optional findByStudentNum(String studentNum); + + @Query("select a from Student a " + + "left join fetch a.participants as p " + + "left join fetch p.activity " + + "where a.id = :id" ) + Optional findActivitiesByStudent(Long id); Optional findByEmail(String email); } From cb5de4d75278c03da20d4b486e238f12600888ae Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 12 Oct 2022 22:58:31 +0900 Subject: [PATCH 051/148] =?UTF-8?q?student=20Ref=20Dto=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/MActivityController.java | 2 +- .../server/hispath/common/TestController.java | 8 ++------ .../student/application/StudentService.java | 3 ++- .../application/dto/StudentSimpleRefDto.java | 13 +++++++++++++ .../com/server/hispath/util/ExcelManager.java | 18 ++++++++++++++++++ 5 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/server/hispath/student/application/dto/StudentSimpleRefDto.java diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 197fde7..c4e9374 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -75,7 +75,7 @@ public ResponseEntity> findAllBySemester(@RequestParam St public ResponseEntity registerStudents(@RequestPart(value = "file", required = false) MultipartFile file, @RequestPart(value = "activityId") Long activityId) throws Exception { - studentService.registerParticipants(activityId, ExcelManager.getStudentDatas(ExcelManager.extract(file))); + studentService.registerParticipants(activityId, ExcelManager.getStudentSimpleDatas(ExcelManager.extract(file))); return ResponseEntity.ok(null); } diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index f57746a..d0eaf5e 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -22,12 +22,11 @@ import com.server.hispath.notice.domain.Notice; import com.server.hispath.notice.domain.repository.NoticeRepository; import com.server.hispath.student.application.StudentService; -import com.server.hispath.student.application.dto.StudentRefDto; +import com.server.hispath.student.application.dto.StudentSimpleRefDto; import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -138,10 +137,7 @@ public void saveParticipant() { activities.forEach(activity -> { studentService.registerParticipants(activity.getId(), students.stream().map(student -> { - return new StudentRefDto(student.getId(), student.getName(), student.getStudentNum(), student.getSemester(), - student.getDepartment().getId(), student.getMajor1().getId(), student.getMajor2().getId(), - student.getPhone(), student.getEmail(), student.getProfile(), student.getBlog(), student.getGithubId(), - student.getReadme()); + return new StudentSimpleRefDto(student.getStudentNum(), student.getName()); }) .collect(Collectors.toList())); diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java index 5dad0c9..4ec4dfc 100644 --- a/src/main/java/com/server/hispath/student/application/StudentService.java +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -13,6 +13,7 @@ import com.server.hispath.activity.domain.Activity; import com.server.hispath.exception.student.StudentDataNotMatchException; import com.server.hispath.student.application.dto.StudentRefDto; +import com.server.hispath.student.application.dto.StudentSimpleRefDto; import com.server.hispath.student.domain.Section; import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; @@ -95,7 +96,7 @@ public Student findById(Long id) { } @Transactional - public void registerParticipants(Long activityId, List studentRefDtos) { + public void registerParticipants(Long activityId, List studentRefDtos) { Activity activity = activityService.findById(activityId); mActivityService.deleteAllParticipant(activity); studentRefDtos.forEach(dto -> { diff --git a/src/main/java/com/server/hispath/student/application/dto/StudentSimpleRefDto.java b/src/main/java/com/server/hispath/student/application/dto/StudentSimpleRefDto.java new file mode 100644 index 0000000..dcf768a --- /dev/null +++ b/src/main/java/com/server/hispath/student/application/dto/StudentSimpleRefDto.java @@ -0,0 +1,13 @@ +package com.server.hispath.student.application.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class StudentSimpleRefDto { + private String studentNum; + private String name; +} diff --git a/src/main/java/com/server/hispath/util/ExcelManager.java b/src/main/java/com/server/hispath/util/ExcelManager.java index 05a11df..e5caf63 100644 --- a/src/main/java/com/server/hispath/util/ExcelManager.java +++ b/src/main/java/com/server/hispath/util/ExcelManager.java @@ -11,6 +11,7 @@ import com.server.hispath.exception.common.ExcelFormatException; import com.server.hispath.exception.common.NotExcelExtensionException; import com.server.hispath.student.application.dto.StudentRefDto; +import com.server.hispath.student.application.dto.StudentSimpleRefDto; import org.springframework.web.multipart.MultipartFile; @@ -63,6 +64,23 @@ public static List getMActivities(Sheet worksheet) { return mActivityContentDtos; } + public static List getStudentSimpleDatas(Sheet worksheet){ + List studentRefDtos = new ArrayList<>(); + + for (int i = 1; i < worksheet.getPhysicalNumberOfRows(); i++) { + try { + Row row = worksheet.getRow(i); + String studentNum = row.getCell(0).toString(); + String studentName = row.getCell(1).toString(); + + studentRefDtos.add(new StudentSimpleRefDto(studentNum, studentName)); + } catch (Exception e) { + throw new ExcelFormatException(e.getMessage()); + } + } + return studentRefDtos; + } + public static List getStudentDatas(Sheet worksheet) { List studentRefDtos = new ArrayList<>(); for (int i = 1; i < worksheet.getPhysicalNumberOfRows(); i++) { From 2f0b5044efd091055df19f1d2c633498ba4dea6a Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Thu, 13 Oct 2022 01:51:45 +0900 Subject: [PATCH 052/148] =?UTF-8?q?[#31]=20:=20=ED=95=99=EC=83=9D=20?= =?UTF-8?q?=ED=99=9C=EB=8F=99=20=ED=8E=98=EC=9D=B4=EC=A7=80,=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=9E=90=20=EB=A7=88=EC=9D=BC=EB=A6=AC=EC=A7=80=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=ED=8E=98=EC=9D=B4=EC=A7=80=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=20(#33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#31] : 모든 섹션 조회 API 구현 * feat[#31] : 개인활동 등록 API 구현 * feat[#31] : 학생 개인활동 등록 API 구현 * feat[#31] : 모든 마일리지 활동 조회, 마일리지 활동 학기별 조회 API 구현 * docs[#31] : 마일리지 승인활동 관련 docs 수정 * feat[#31] : 학생의 참여활동 학기별 조회 API 구현 * feat[#31] : 개인 활동 수정 API 구현 * feat[#31] : 마일리지 참가자 단일등록 * feat[#31] : 마일리지 참가자 단일 등록 API 구현 완성 --- .../activity/application/ActivityService.java | 62 ++++++++++++++++--- .../application/MActivityService.java | 10 ++- .../dto/ActivityParticipantDto.java | 26 ++++++++ .../dto/ParticipantContentDto.java | 24 +++++++ .../dto/StudentActivityContentDto.java | 20 ++++++ .../hispath/activity/domain/Activity.java | 39 +++++++++++- .../domain/repository/ActivityRepository.java | 6 +- .../presentation/ActivityController.java | 42 ++++++++++++- .../presentation/MActivityController.java | 22 ++++++- .../request/MStudentRegisterRequest.java | 16 +++++ .../request/StudentActivityCURequest.java | 19 ++++++ .../response/ActivityParticipantResponse.java | 24 +++++++ .../response/ActivityResponse.java | 3 - .../presentation/CategoryController.java | 2 +- .../java/com/server/hispath/docs/ApiDoc.java | 10 ++- .../student/SectionNotExistException.java | 9 +++ .../student/application/StudentService.java | 19 +++++- .../application/dto/StudentSimpleRefDto.java | 6 ++ .../hispath/student/domain/Participant.java | 25 +++++++- .../hispath/student/domain/Section.java | 15 ++++- .../domain/repository/StudentRepository.java | 6 ++ 21 files changed, 377 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/server/hispath/activity/application/dto/ActivityParticipantDto.java create mode 100644 src/main/java/com/server/hispath/activity/application/dto/ParticipantContentDto.java create mode 100644 src/main/java/com/server/hispath/activity/application/dto/StudentActivityContentDto.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/request/MStudentRegisterRequest.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/request/StudentActivityCURequest.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java create mode 100644 src/main/java/com/server/hispath/exception/student/SectionNotExistException.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index 6899260..72c00c9 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -4,14 +4,18 @@ import java.util.Optional; import java.util.stream.Collectors; -import com.server.hispath.activity.application.dto.ActivityContentDto; -import com.server.hispath.activity.application.dto.ActivityDto; -import com.server.hispath.activity.application.dto.SemesterDto; +import com.server.hispath.activity.application.dto.*; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.category.application.CategoryService; import com.server.hispath.category.domain.Category; +import com.server.hispath.category.domain.repository.CategoryRepository; import com.server.hispath.exception.activity.ActivityNotFoundException; +import com.server.hispath.exception.activity.ParticipantNotFoundException; +import com.server.hispath.exception.student.StudentNotFoundException; +import com.server.hispath.student.domain.Participant; +import com.server.hispath.student.domain.Student; +import com.server.hispath.student.domain.repository.StudentRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,6 +28,8 @@ public class ActivityService { private final ActivityRepository activityRepository; private final CategoryService categoryService; + private final CategoryRepository categoryRepository; + private final StudentRepository studentRepository; @Transactional public Long create(Long categoryId, ActivityContentDto dto) { @@ -32,6 +38,7 @@ public Long create(Long categoryId, ActivityContentDto dto) { Activity savedActivity = activityRepository.save(activity); return savedActivity.getId(); } + @Transactional(readOnly = true) public ActivityDto find(Long id) { Activity activity = this.findById(id); @@ -39,7 +46,6 @@ public ActivityDto find(Long id) { } - @Transactional(readOnly = true) public List findAll() { List activities = activityRepository.findAll(); @@ -49,7 +55,7 @@ public List findAll() { } @Transactional - public ActivityDto update(Long id, Long categoryId, ActivityContentDto dto){ + public ActivityDto update(Long id, Long categoryId, ActivityContentDto dto) { Activity activity = this.findById(id); Category category = categoryService.findById(categoryId); activity.update(category, dto); @@ -58,7 +64,7 @@ public ActivityDto update(Long id, Long categoryId, ActivityContentDto dto){ } @Transactional - public void delete(Long id){ + public void delete(Long id) { activityRepository.deleteById(id); } @@ -70,8 +76,48 @@ public Activity findById(Long id) { public List bringSemester() { List semesters = activityRepository.bringSemester(); return semesters.stream() - .map(SemesterDto::from) - .collect(Collectors.toList()); + .map(SemesterDto::from) + .collect(Collectors.toList()); + + } + + @Transactional + public Long createStudentActivity(Long studentId, + StudentActivityContentDto activityContentDto, + ParticipantContentDto participantContentDto) { + + Student student = studentRepository.findById(studentId).orElseThrow(StudentNotFoundException::new); + Category category = categoryRepository.findByName("기타"); + Activity activity = Activity.from(activityContentDto, category); + activity.addParticipant(student, participantContentDto); + return activityRepository.save(activity).getId(); + } + + @Transactional + public ActivityParticipantDto updateStudentActivity(Long activityId, Long studentId, + StudentActivityContentDto activityContentDto, + ParticipantContentDto participantContentDto) { + + Activity activity = this.findById(activityId); + activity.update(activityContentDto); + Student student = studentRepository.findById(studentId).orElseThrow(StudentNotFoundException::new); + Participant updatedParticipant = activity.getParticipants() + .stream() + .filter(participant -> participant.isSameStudent(student)) + .findFirst() + .orElseThrow(ParticipantNotFoundException::new); + updatedParticipant.update(participantContentDto); + return ActivityParticipantDto.of(updatedParticipant); + } + @Transactional(readOnly = true) + public List findAllParticipantActivites(Long id, String semester) { + Student student = studentRepository.findStudentWithActivities(id).orElseThrow(StudentNotFoundException::new); + return student.getParticipants() + .stream() + .filter(participant -> participant.isSameSemester(semester)) + .map(ActivityParticipantDto::of) + .collect(Collectors.toList()); } + } diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index 3ff94c1..f9eaa2b 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -58,13 +58,19 @@ public ActivityDto update(Long id, MActivityContentDto dto) { @Transactional(readOnly = true) public List findAllBySemester(String semester) { - List activities = activityRepository.findAllBySemester(semester); + List activities = activityRepository.findAllBySemesterAndRequestStatus(semester, 1); return activities.stream() .map(ActivityDto::from) .collect(Collectors.toList()); } - + @Transactional(readOnly = true) + public List findAll() { + List activities = activityRepository.findAllByRequestStatus(1); + return activities.stream() + .map(ActivityDto::from) + .collect(Collectors.toList()); + } @Transactional public void deleteAllParticipant(Activity activity) { diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityParticipantDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityParticipantDto.java new file mode 100644 index 0000000..4540ca1 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityParticipantDto.java @@ -0,0 +1,26 @@ +package com.server.hispath.activity.application.dto; + + +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.student.domain.Participant; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ActivityParticipantDto { + private Long id; + private String semester; + private String name; + private String remark; + private ParticipantContentDto participant; + + public static ActivityParticipantDto of(Participant participant) { + Activity activity = participant.getActivity(); + return new ActivityParticipantDto(activity.getId(), activity.getSemester(), activity.getName(), + activity.getRemark(), ParticipantContentDto.of(participant)); + } +} diff --git a/src/main/java/com/server/hispath/activity/application/dto/ParticipantContentDto.java b/src/main/java/com/server/hispath/activity/application/dto/ParticipantContentDto.java new file mode 100644 index 0000000..ab9581c --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ParticipantContentDto.java @@ -0,0 +1,24 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.activity.presentation.request.StudentActivityCURequest; +import com.server.hispath.student.domain.Participant; +import com.server.hispath.student.domain.Section; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ParticipantContentDto { + private Section section; + private String data; + + public static ParticipantContentDto of(StudentActivityCURequest request) { + return new ParticipantContentDto(Section.find(request.getSection()), request.getData()); + } + public static ParticipantContentDto of(Participant participant) { + return new ParticipantContentDto(participant.getSection(), participant.getData()); + } +} diff --git a/src/main/java/com/server/hispath/activity/application/dto/StudentActivityContentDto.java b/src/main/java/com/server/hispath/activity/application/dto/StudentActivityContentDto.java new file mode 100644 index 0000000..8f48d7b --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/StudentActivityContentDto.java @@ -0,0 +1,20 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.activity.presentation.request.StudentActivityCURequest; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class StudentActivityContentDto { + private String semester; + private String name; + private String remark; + + public static StudentActivityContentDto of(StudentActivityCURequest request){ + return new StudentActivityContentDto(request.getSemester(), request.getName(), request.getRemark()); + } +} diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 42cb2cc..908a0e0 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -2,15 +2,19 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; import javax.persistence.*; import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.activity.application.dto.MActivityContentDto; +import com.server.hispath.activity.application.dto.ParticipantContentDto; +import com.server.hispath.activity.application.dto.StudentActivityContentDto; import com.server.hispath.category.domain.Category; import com.server.hispath.common.BaseEntity; +import com.server.hispath.exception.activity.ParticipantNotFoundException; +import com.server.hispath.student.domain.Participant; import com.server.hispath.student.domain.Section; import com.server.hispath.student.domain.Student; -import com.server.hispath.student.domain.Participant; import com.sun.istack.NotNull; import lombok.AllArgsConstructor; @@ -33,7 +37,7 @@ public class Activity extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne(fetch = FetchType.LAZY , cascade = CascadeType.PERSIST ) + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) private Category category; @NotNull @@ -51,6 +55,7 @@ public class Activity extends BaseEntity { int weight; + @Builder.Default @OneToMany(mappedBy = "activity", cascade = CascadeType.PERSIST, orphanRemoval = true) private List participants = new ArrayList<>(); @@ -78,6 +83,18 @@ public static Activity from(Category category, MActivityContentDto dto) { .build(); } + public static Activity from(StudentActivityContentDto dto, Category category) { + return Activity.builder() + .category(category) + .semester(dto.getSemester()) + .remark(dto.getRemark()) + .personal(true) + .requestStatus(0) + .name(dto.getName()) + .weight(0) + .build(); + } + public void update(Category category, ActivityContentDto dto) { this.category = category; this.semester = dto.getSemester(); @@ -96,9 +113,23 @@ public void update(Category category, MActivityContentDto dto) { this.weight = dto.getWeight(); } + public void update(StudentActivityContentDto dto) { + this.semester = dto.getSemester(); + this.name = dto.getName(); + this.remark = dto.getRemark(); + } + public void addParticipant(Student student, Section section) { Participant participant = new Participant(student, this, section); + this.connectParticipant(student, participant); + } + + public void addParticipant(Student student, ParticipantContentDto participantContentDto) { + Participant participant = new Participant(student, this, participantContentDto); + this.connectParticipant(student, participant); + } + private void connectParticipant(Student student, Participant participant) { this.participants.add(participant); student.addParticipant(participant); } @@ -106,4 +137,8 @@ public void addParticipant(Student student, Section section) { public void updateStudentRegister() { studentRegistered = true; } + + public boolean isSameSemester(String semester) { + return Objects.equals(this.semester, semester); + } } diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java index fe9879b..5b90075 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -14,7 +14,7 @@ public interface ActivityRepository extends JpaRepository { @Query("select a from Activity a " + "left join fetch a.participants as p " + "left join fetch p.student " + - "where a.id = :id" ) + "where a.id = :id") Optional findActivityWithStudents(Long id); @@ -22,4 +22,8 @@ public interface ActivityRepository extends JpaRepository { @Query("select distinct semester from Activity") List bringSemester(); + List findAllBySemesterAndRequestStatus(String semester, int requestStatus); + + List findAllByRequestStatus(int requestStatus); + } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index bc593ba..2e07986 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -1,18 +1,23 @@ package com.server.hispath.activity.presentation; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.application.dto.*; import com.server.hispath.activity.application.MActivityService; import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.activity.application.dto.ActivityDto; import com.server.hispath.activity.application.dto.MStudentActivityDetailDto; import com.server.hispath.activity.application.dto.SemesterDto; import com.server.hispath.activity.presentation.request.ActivityCURequest; +import com.server.hispath.activity.presentation.request.StudentActivityCURequest; +import com.server.hispath.activity.presentation.response.ActivityParticipantResponse; import com.server.hispath.activity.presentation.response.ActivityResponse; import com.server.hispath.activity.presentation.response.SemesterResponse; import com.server.hispath.docs.ApiDoc; +import com.server.hispath.student.domain.Section; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -57,7 +62,7 @@ public ResponseEntity> findAll() { } - @PatchMapping("/activity/{id}") + @PutMapping("/activity/{id}") @ApiOperation(value = ApiDoc.ACTIVITY_UPDATE) public ResponseEntity update(@PathVariable Long id, @RequestBody ActivityCURequest request) { ActivityDto dto = activityService.update(id, request.getCategoryId(), ActivityContentDto.from(request)); @@ -73,8 +78,6 @@ public ResponseEntity delete(@PathVariable Long id) { return ResponseEntity.ok(id); } - - @GetMapping("/semester") @ApiOperation(value = ApiDoc.ACTIVITY_READ_SEMESTER) public ResponseEntity> findAllBySemester() { @@ -85,6 +88,39 @@ public ResponseEntity> findAllBySemester() { return ResponseEntity.ok(responses); } + @GetMapping("/sections") + @ApiOperation(value = ApiDoc.SECTION_READ_ALL) + public ResponseEntity> getSections() { + List sections = Arrays.stream(Section.values()) + .map(Section::getName) + .collect(Collectors.toList()); + return ResponseEntity.ok(sections); + } + + @PostMapping("/student-activity/{id}") + @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_CREATE) + public ResponseEntity createStudentActivity(@PathVariable Long id, @RequestBody StudentActivityCURequest request) { + Long response = activityService.createStudentActivity(id, StudentActivityContentDto.of(request), ParticipantContentDto.of(request)); + return ResponseEntity.ok(response); + } + + @PutMapping("/student-activity/{id}") + @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_UPDATE) + public ResponseEntity updateStudentActivity(@PathVariable Long id, @RequestBody StudentActivityCURequest request) { + ActivityParticipantDto activityParticipantDto = activityService.updateStudentActivity(id, 1L, StudentActivityContentDto.of(request), ParticipantContentDto.of(request)); + return ResponseEntity.ok(ActivityParticipantResponse.of(activityParticipantDto)); + } + + @GetMapping("/student-activities/{id}") + @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_READ_SEMESTER) + public ResponseEntity> findParticipatedActivities(@PathVariable Long id, @RequestParam String semester) { + List responses = activityService.findAllParticipantActivites(id, semester) + .stream() + .map(ActivityParticipantResponse::of) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } + @GetMapping("/studentactivity/{id}") @ApiOperation(value = ApiDoc.STUDENT_MILEAGE_READ) public ResponseEntity findActivtyByStudentId(@PathVariable Long id) { diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index c4e9374..e26d6a7 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -8,9 +8,11 @@ import com.server.hispath.activity.application.dto.*; import com.server.hispath.activity.presentation.request.MActivityCURequest; import com.server.hispath.activity.presentation.request.MParticipantRequest; +import com.server.hispath.activity.presentation.request.MStudentRegisterRequest; import com.server.hispath.activity.presentation.response.ActivityResponse; import com.server.hispath.docs.ApiDoc; import com.server.hispath.student.application.StudentService; +import com.server.hispath.student.application.dto.StudentSimpleRefDto; import com.server.hispath.util.ExcelManager; import org.springframework.http.ResponseEntity; @@ -44,7 +46,7 @@ public ResponseEntity createMActivites(MultipartFile file) throws Exceptio return ResponseEntity.ok(null); } - @PatchMapping("/mileage/{id}") + @PutMapping("/mileage/{id}") @ApiOperation(value = ApiDoc.MILEAGE_UPDATE) public ResponseEntity update(@PathVariable Long id, @RequestBody MActivityCURequest request) { ActivityDto dto = mActivityService.update(id, MActivityContentDto.of(request)); @@ -70,6 +72,16 @@ public ResponseEntity> findAllBySemester(@RequestParam St return ResponseEntity.ok(responses); } + @GetMapping("/mileages") + @ApiOperation(value = ApiDoc.MILEAGE_READ_ALL) + public ResponseEntity> findAll() { + List responses = mActivityService.findAll() + .stream() + .map(ActivityResponse::from) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } + @PostMapping("/mileage/students") @ApiOperation(value = ApiDoc.MILEAGE_REGISTER_STUDENTS) public ResponseEntity registerStudents(@RequestPart(value = "file", required = false) MultipartFile file, @@ -80,6 +92,14 @@ public ResponseEntity registerStudents(@RequestPart(value = "file", requir return ResponseEntity.ok(null); } + @PostMapping("/mileage/student") + @ApiOperation(value = ApiDoc.MILEAGE_REGISTER_STUDENT) + public ResponseEntity registerStudent(@RequestBody MStudentRegisterRequest request) { + + studentService.registerParticipant(request.getActivityId(), StudentSimpleRefDto.of(request)); + return ResponseEntity.ok(null); + } + @DeleteMapping("/mileage/student") @ApiOperation(value = ApiDoc.ACTIVITY_STUDENT_DELETE) public ResponseEntity deleteParticipant(@RequestBody MParticipantRequest request) { diff --git a/src/main/java/com/server/hispath/activity/presentation/request/MStudentRegisterRequest.java b/src/main/java/com/server/hispath/activity/presentation/request/MStudentRegisterRequest.java new file mode 100644 index 0000000..c1d408e --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/request/MStudentRegisterRequest.java @@ -0,0 +1,16 @@ +package com.server.hispath.activity.presentation.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class MStudentRegisterRequest { + private Long activityId; + private String name; + private String studentNum; +} diff --git a/src/main/java/com/server/hispath/activity/presentation/request/StudentActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/StudentActivityCURequest.java new file mode 100644 index 0000000..3756e49 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/request/StudentActivityCURequest.java @@ -0,0 +1,19 @@ +package com.server.hispath.activity.presentation.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class StudentActivityCURequest { + + private String semester; + private String name; + private String remark; + private String section; + private String data; +} diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java new file mode 100644 index 0000000..1714bd6 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java @@ -0,0 +1,24 @@ +package com.server.hispath.activity.presentation.response; + +import com.server.hispath.activity.application.dto.ActivityParticipantDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ActivityParticipantResponse { + private Long id; + private String semester; + private String name; + private String remark; + private String section; + private String data; + + public static ActivityParticipantResponse of(ActivityParticipantDto dto) { + return new ActivityParticipantResponse(dto.getId(), dto.getSemester(), dto.getName(), dto.getRemark(), + dto.getParticipant().getSection().getName(), dto.getParticipant().getData()); + } +} diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java index 315b1d7..4bf503a 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java @@ -1,8 +1,5 @@ package com.server.hispath.activity.presentation.response; -import java.time.LocalDateTime; - -import com.fasterxml.jackson.annotation.JsonFormat; import com.server.hispath.activity.application.dto.ActivityDto; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/server/hispath/category/presentation/CategoryController.java b/src/main/java/com/server/hispath/category/presentation/CategoryController.java index fe812e8..35cb52c 100644 --- a/src/main/java/com/server/hispath/category/presentation/CategoryController.java +++ b/src/main/java/com/server/hispath/category/presentation/CategoryController.java @@ -51,7 +51,7 @@ public ResponseEntity> findAll() { return ResponseEntity.ok(responses); } - @PatchMapping("/category/{id}") + @PutMapping("/category/{id}") @ApiOperation(value = ApiDoc.CATEGORY_UPDATE) public ResponseEntity update(@PathVariable Long id, @RequestBody CategoryCURequest request) { CategoryContentDto dto = categoryService.update(id, CategoryCUDto.of(request)); diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 6044585..99fdc19 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -16,12 +16,18 @@ public class ApiDoc { public static final String MILEAGES_CREATE = "단일 마일리지 다중 등록"; public static final String MILEAGE_UPDATE = "마일리지 활동 수정"; public static final String MILEAGE_DELETE = "마일리지 활동 삭제"; - public static final String MILEAGE_READ_SEMESTER = "마일리지 학기별 조회"; + public static final String MILEAGE_READ_SEMESTER = "승인된 마일리지 활동 학기별 조회"; + public static final String MILEAGE_READ_ALL = "모든 승인된 마일리지 활동 조회"; public static final String MILEAGE_REGISTER_STUDENTS = "마일리지 활동 참가 학생 엑셀 등록"; + public static final String MILEAGE_REGISTER_STUDENT = "마일리지 활동 참가 학생 단일 등록"; public static final String ACTIVITY_STUDENT_DELETE = "마일리지 활동 학생 참가 정보 삭제"; public static final String MILEAGE_READ = "단일 마일리지 활동 조회"; - public static final String STUDENT_MILEAGE_READ = "학생별 마일리지 활동 조회"; + public static final String STUDENT_ACTIVITY_CREATE = "학생의 개인 활동 생성"; + public static final String STUDENT_ACTIVITY_UPDATE = "학생의 참여 활동 수정"; + public static final String STUDENT_ACTIVITY_READ_SEMESTER = "학생의 참여 활동 학기별 조회"; + public static final String SECTION_READ_ALL = "모든 섹션 조회"; + public static final String PARTICIPANT_UPDATE = "학생 참여 데이터 수정"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; diff --git a/src/main/java/com/server/hispath/exception/student/SectionNotExistException.java b/src/main/java/com/server/hispath/exception/student/SectionNotExistException.java new file mode 100644 index 0000000..203ff9d --- /dev/null +++ b/src/main/java/com/server/hispath/exception/student/SectionNotExistException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.student; + +import org.springframework.http.HttpStatus; + +public class SectionNotExistException extends StudentException{ + public SectionNotExistException() { + super("존재하지 않는 섹션입니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java index 4ec4dfc..cca9cc5 100644 --- a/src/main/java/com/server/hispath/student/application/StudentService.java +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -102,11 +102,24 @@ public void registerParticipants(Long activityId, List stud studentRefDtos.forEach(dto -> { Student student = studentRepository.findByStudentNum(dto.getStudentNum()) .orElseThrow(StudentNotFoundException::new); - if (!student.isNameMatch(dto.getName())) { - throw new StudentDataNotMatchException(dto.getStudentNum(), dto.getName()); - } + validateStudent(student, dto); activity.addParticipant(student, Section.ETC); }); activity.updateStudentRegister(); } + + @Transactional + public void registerParticipant(Long activityId, StudentSimpleRefDto dto){ + Activity activity = activityService.findById(activityId); + Student student = studentRepository.findByStudentNum(dto.getStudentNum()) + .orElseThrow(StudentNotFoundException::new); + validateStudent(student, dto); + activity.addParticipant(student, Section.ETC); + } + + private void validateStudent(Student student, StudentSimpleRefDto dto){ + if (!student.isNameMatch(dto.getName())) { + throw new StudentDataNotMatchException(dto.getStudentNum(), dto.getName()); + } + } } diff --git a/src/main/java/com/server/hispath/student/application/dto/StudentSimpleRefDto.java b/src/main/java/com/server/hispath/student/application/dto/StudentSimpleRefDto.java index dcf768a..9ddbe0b 100644 --- a/src/main/java/com/server/hispath/student/application/dto/StudentSimpleRefDto.java +++ b/src/main/java/com/server/hispath/student/application/dto/StudentSimpleRefDto.java @@ -1,5 +1,7 @@ package com.server.hispath.student.application.dto; +import com.server.hispath.activity.presentation.request.MStudentRegisterRequest; + import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -10,4 +12,8 @@ public class StudentSimpleRefDto { private String studentNum; private String name; + + public static StudentSimpleRefDto of(MStudentRegisterRequest request){ + return new StudentSimpleRefDto(request.getStudentNum(), request.getName()); + } } diff --git a/src/main/java/com/server/hispath/student/domain/Participant.java b/src/main/java/com/server/hispath/student/domain/Participant.java index 64e2c72..7bcffa7 100644 --- a/src/main/java/com/server/hispath/student/domain/Participant.java +++ b/src/main/java/com/server/hispath/student/domain/Participant.java @@ -1,10 +1,11 @@ package com.server.hispath.student.domain; +import java.util.Objects; import javax.persistence.*; +import com.server.hispath.activity.application.dto.ParticipantContentDto; import com.server.hispath.activity.domain.Activity; import com.server.hispath.common.BaseEntity; -import com.server.hispath.student.domain.Student; import lombok.Getter; import lombok.NoArgsConstructor; @@ -37,5 +38,27 @@ public Participant(Student student, Activity activity, Section section) { this.student = student; this.activity = activity; this.section = section; + this.data = ""; + } + + public Participant(Student student, Activity activity, ParticipantContentDto dto) { + this.student = student; + this.activity = activity; + this.section = dto.getSection(); + this.data = dto.getData(); + } + + public boolean isSameSemester(String semester){ + if(Objects.equals(semester, "All")) return true; + return activity.isSameSemester(semester); + } + + public boolean isSameStudent(Student student){ + return Objects.equals(this.student, student); + } + + public void update(ParticipantContentDto participantContentDto){ + this.section = participantContentDto.getSection(); + this.data = participantContentDto.getData(); } } diff --git a/src/main/java/com/server/hispath/student/domain/Section.java b/src/main/java/com/server/hispath/student/domain/Section.java index c151589..b770f37 100644 --- a/src/main/java/com/server/hispath/student/domain/Section.java +++ b/src/main/java/com/server/hispath/student/domain/Section.java @@ -1,7 +1,14 @@ package com.server.hispath.student.domain; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.server.hispath.exception.student.SectionNotExistException; + public enum Section { - REWARD("수상"), SKILL("기술"), COURSE("과정"),LINK("링크"), + REWARD("수상"), SKILL("기술"), COURSE("과정"), LINK("링크"), INTERNSHIP("인턴"), CERTIFICATE("자격증"), LANGUAGE("언어"), ETC("기타"); private String name; @@ -13,4 +20,10 @@ public enum Section { public String getName() { return name; } + + private static final Map map = Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(Section::getName, Function.identity()))); + public static Section find(String name){ + return Optional.ofNullable(map.get(name)).orElseThrow(SectionNotExistException::new); + } } diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java index 14022e4..99deaf9 100644 --- a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java @@ -17,4 +17,10 @@ public interface StudentRepository extends JpaRepository { "where a.id = :id" ) Optional findActivitiesByStudent(Long id); Optional findByEmail(String email); + + @Query("select s from Student s " + + "left join fetch s.participants as p " + + "left join fetch p.activity as a " + + "where s.id = :id ") + Optional findStudentWithActivities(Long id); } From ca267ce4c3fb4425f21f822d060cf03b3e20664d Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Thu, 13 Oct 2022 12:37:52 +0900 Subject: [PATCH 053/148] =?UTF-8?q?feat[#34]=20:=20=EB=A7=88=EC=9D=BC?= =?UTF-8?q?=EB=A6=AC=EC=A7=80=20=EC=B0=B8=EC=97=AC=EC=9E=90=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20API=20=EA=B5=AC=ED=98=84=20(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/MActivityService.java | 44 ++++++++++--------- .../presentation/MActivityController.java | 10 ++--- .../response/ActivityParticipantResponse.java | 1 + .../java/com/server/hispath/docs/ApiDoc.java | 2 +- .../student/application/StudentService.java | 1 + 5 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index f9eaa2b..9bb8011 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -1,10 +1,12 @@ package com.server.hispath.activity.application; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; -import com.server.hispath.activity.application.dto.*; +import com.server.hispath.activity.application.dto.ActivityDto; +import com.server.hispath.activity.application.dto.MActivityContentDto; +import com.server.hispath.activity.application.dto.MActivityDetailDto; +import com.server.hispath.activity.application.dto.MStudentActivityDetailDto; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.category.application.CategoryService; @@ -77,17 +79,6 @@ public void deleteAllParticipant(Activity activity) { activity.getParticipants().forEach(BaseEntity::deleteContent); } - @Transactional - public void deleteParticipantById(Long activityId, Long studentId) { - Activity activity = activityService.findById(activityId); - Student student = studentRepository.findById(studentId).orElseThrow(StudentNotFoundException::new); - activity.getParticipants() - .stream() - .filter(participant -> Objects.equals(participant.getStudent(), student)) - .findFirst().orElseThrow(ParticipantNotFoundException::new) - .deleteContent(); - } - @Transactional public MActivityDetailDto findDetailActivityInfo(Long activityId) { Activity activity = activityRepository.findActivityWithStudents(activityId) @@ -103,14 +94,27 @@ public MActivityDetailDto findDetailActivityInfo(Long activityId) { @Transactional public MStudentActivityDetailDto findActivitiesByStudent(Long studentId) { - Student student = studentRepository.findActivitiesByStudent(studentId).orElseThrow(StudentNotFoundException::new); + Student student = studentRepository.findActivitiesByStudent(studentId) + .orElseThrow(StudentNotFoundException::new); List activities = student.getParticipants() - .stream() - .map(participant -> { - return ActivityDto.from(participant.getActivity()); - }) - .collect(Collectors.toList()); + .stream() + .map(participant -> { + return ActivityDto.from(participant.getActivity()); + }) + .collect(Collectors.toList()); - return MStudentActivityDetailDto.from(student, activities); + return MStudentActivityDetailDto.from(student, activities); + } + + @Transactional + public void deleteParticipant(Long studentId, Long activityId) { + Student student = studentRepository.findById(studentId).orElseThrow(StudentNotFoundException::new); + Activity activity = activityService.findById(activityId); + activity.getParticipants() + .stream() + .filter(participant -> participant.isSameStudent(student)) + .findFirst() + .orElseThrow(ParticipantNotFoundException::new) + .deleteContent(); } } diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index e26d6a7..8cc8983 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -5,7 +5,10 @@ import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.MActivityService; -import com.server.hispath.activity.application.dto.*; +import com.server.hispath.activity.application.dto.ActivityDto; +import com.server.hispath.activity.application.dto.MActivityContentDto; +import com.server.hispath.activity.application.dto.MActivityDetailDto; +import com.server.hispath.activity.application.dto.MStudentActivityDetailDto; import com.server.hispath.activity.presentation.request.MActivityCURequest; import com.server.hispath.activity.presentation.request.MParticipantRequest; import com.server.hispath.activity.presentation.request.MStudentRegisterRequest; @@ -103,7 +106,7 @@ public ResponseEntity registerStudent(@RequestBody MStudentRegisterRequest @DeleteMapping("/mileage/student") @ApiOperation(value = ApiDoc.ACTIVITY_STUDENT_DELETE) public ResponseEntity deleteParticipant(@RequestBody MParticipantRequest request) { - mActivityService.deleteParticipantById(request.getActivityId(), request.getStudentId()); + mActivityService.deleteParticipant(request.getStudentId(), request.getActivityId()); return ResponseEntity.ok(null); } @@ -118,7 +121,4 @@ public ResponseEntity findMileageActivityById(@PathVariable public ResponseEntity findActivtyByStudentId(@PathVariable Long id) { return ResponseEntity.ok(mActivityService.findActivitiesByStudent(id)); } - - - } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java index 1714bd6..2275cc4 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java @@ -19,6 +19,7 @@ public class ActivityParticipantResponse { public static ActivityParticipantResponse of(ActivityParticipantDto dto) { return new ActivityParticipantResponse(dto.getId(), dto.getSemester(), dto.getName(), dto.getRemark(), + dto.getParticipant().getSection().getName(), dto.getParticipant().getData()); } } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 99fdc19..a7d3413 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -27,7 +27,7 @@ public class ApiDoc { public static final String STUDENT_ACTIVITY_UPDATE = "학생의 참여 활동 수정"; public static final String STUDENT_ACTIVITY_READ_SEMESTER = "학생의 참여 활동 학기별 조회"; public static final String SECTION_READ_ALL = "모든 섹션 조회"; - public static final String PARTICIPANT_UPDATE = "학생 참여 데이터 수정"; + public static final String PARTICIPANT_DELETE = "학생 참여 데이터 삭제"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java index cca9cc5..899988b 100644 --- a/src/main/java/com/server/hispath/student/application/StudentService.java +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -2,6 +2,7 @@ import com.server.hispath.department.application.DepartmentService; import com.server.hispath.department.domain.Department; +import com.server.hispath.exception.activity.ParticipantNotFoundException; import com.server.hispath.exception.student.StudentNotFoundException; import com.server.hispath.major.application.MajorService; import com.server.hispath.major.domain.Major; From 60a60b55a59725b05a857c6a95acceb4c41af564 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Thu, 27 Oct 2022 14:09:56 +0900 Subject: [PATCH 054/148] =?UTF-8?q?[#36]=20:=20API=20=EC=9D=B8=EA=B0=80?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B6=8C=ED=95=9C=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#37)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix[#36] : participant 중복추가시 Exception 추가 * feat[#36] : Manager 권한 주기 완료 - SuperManager, Manager, Student, Login 3개로 나눔 --- .../hispath/activity/domain/Activity.java | 15 +++++++- .../hispath/auth/application/AuthService.java | 27 ++++++++++++++ .../server/hispath/auth/domain/Member.java | 14 ++++--- .../hispath/auth/domain/RequiredLogin.java | 11 ++++++ .../domain/RequiredSuperManagerLogin.java | 11 ++++++ .../auth/domain/SuperManagerLogin.java | 11 ++++++ .../auth/infrastructure/JwtProvider.java | 15 ++++++++ .../auth/presentation/LoginInterceptor.java | 18 +++++++-- .../LoginSuperManagerArgumentResolver.java | 37 +++++++++++++++++++ .../ParticipantDuplicateException.java | 9 +++++ .../ManagerNoAuthorizationException.java | 9 +++++ .../hispath/manager/domain/Manager.java | 4 ++ 12 files changed, 171 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/server/hispath/auth/domain/RequiredLogin.java create mode 100644 src/main/java/com/server/hispath/auth/domain/RequiredSuperManagerLogin.java create mode 100644 src/main/java/com/server/hispath/auth/domain/SuperManagerLogin.java create mode 100644 src/main/java/com/server/hispath/auth/presentation/LoginSuperManagerArgumentResolver.java create mode 100644 src/main/java/com/server/hispath/exception/activity/ParticipantDuplicateException.java create mode 100644 src/main/java/com/server/hispath/exception/manager/ManagerNoAuthorizationException.java diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 908a0e0..994239f 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; import javax.persistence.*; import com.server.hispath.activity.application.dto.ActivityContentDto; @@ -11,7 +12,7 @@ import com.server.hispath.activity.application.dto.StudentActivityContentDto; import com.server.hispath.category.domain.Category; import com.server.hispath.common.BaseEntity; -import com.server.hispath.exception.activity.ParticipantNotFoundException; +import com.server.hispath.exception.activity.ParticipantDuplicateException; import com.server.hispath.student.domain.Participant; import com.server.hispath.student.domain.Section; import com.server.hispath.student.domain.Student; @@ -120,10 +121,22 @@ public void update(StudentActivityContentDto dto) { } public void addParticipant(Student student, Section section) { + checkDuplicate(student); Participant participant = new Participant(student, this, section); this.connectParticipant(student, participant); } + public void checkDuplicate(Student student) { + Optional dupParticipant = this.getParticipants() + .stream() + .filter(participant -> participant.isSameStudent(student)) + .findFirst(); + if (dupParticipant.isPresent()) { + Student duplicatedStudent = dupParticipant.get().getStudent(); + throw new ParticipantDuplicateException(duplicatedStudent.getStudentNum(), duplicatedStudent.getName()); + } + } + public void addParticipant(Student student, ParticipantContentDto participantContentDto) { Participant participant = new Participant(student, this, participantContentDto); this.connectParticipant(student, participant); diff --git a/src/main/java/com/server/hispath/auth/application/AuthService.java b/src/main/java/com/server/hispath/auth/application/AuthService.java index 1c36848..5101ca0 100644 --- a/src/main/java/com/server/hispath/auth/application/AuthService.java +++ b/src/main/java/com/server/hispath/auth/application/AuthService.java @@ -11,6 +11,7 @@ import com.server.hispath.auth.domain.OauthUserInfo; import com.server.hispath.auth.infrastructure.JwtProvider; import com.server.hispath.auth.infrastructure.OauthHandler; +import com.server.hispath.exception.manager.ManagerNoAuthorizationException; import com.server.hispath.exception.oauth.InvalidTokenException; import com.server.hispath.exception.oauth.NotHandongEmailException; import com.server.hispath.manager.application.ManagerService; @@ -93,4 +94,30 @@ public LoginManager findManagerByToken(String token) { Manager manager = managerService.findById(id); return new LoginManager(manager.getId()); } + + + + @Transactional(readOnly = true) + public void checkSuperManagerByToken(String token) { + Manager manager = findSuperManagerByToken(token); + if(!manager.isSuperManager()) throw new ManagerNoAuthorizationException(); + } + + @Transactional(readOnly = true) + public LoginManager getSuperManagerId(String token){ + Manager manager = findSuperManagerByToken(token); + return new LoginManager(manager.getId()); + } + + @Transactional(readOnly = true) + public Manager findSuperManagerByToken(String token){ + if (!jwtProvider.isValidToken(token, Member.SUPER_MANAGER)) { + throw new InvalidTokenException(); + } + String payLoad = jwtProvider.getPayLoad(token, Member.SUPER_MANAGER); + Long id = Long.parseLong(payLoad); + Manager manager = managerService.findById(id); + if(!manager.isSuperManager()) throw new ManagerNoAuthorizationException(); + return manager; + } } diff --git a/src/main/java/com/server/hispath/auth/domain/Member.java b/src/main/java/com/server/hispath/auth/domain/Member.java index 766ed60..f1ba817 100644 --- a/src/main/java/com/server/hispath/auth/domain/Member.java +++ b/src/main/java/com/server/hispath/auth/domain/Member.java @@ -1,15 +1,19 @@ package com.server.hispath.auth.domain; -import java.util.Objects; - public enum Member { - STUDENT, MANAGER; + STUDENT, MANAGER, ALL, SUPER_MANAGER; - public static boolean isStudent(Member member){ + public static boolean isStudent(Member member) { return member.equals(STUDENT); } - public static boolean isManager(Member member){ + public static boolean isManager(Member member) { return member.equals(MANAGER); } + + public static boolean isSuperManager(Member member) { + return member.equals(SUPER_MANAGER); + } + + public static boolean isALl(Member member) {return member.equals(ALL);} } diff --git a/src/main/java/com/server/hispath/auth/domain/RequiredLogin.java b/src/main/java/com/server/hispath/auth/domain/RequiredLogin.java new file mode 100644 index 0000000..d6ab726 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/RequiredLogin.java @@ -0,0 +1,11 @@ +package com.server.hispath.auth.domain; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface RequiredLogin { +} diff --git a/src/main/java/com/server/hispath/auth/domain/RequiredSuperManagerLogin.java b/src/main/java/com/server/hispath/auth/domain/RequiredSuperManagerLogin.java new file mode 100644 index 0000000..86fed78 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/RequiredSuperManagerLogin.java @@ -0,0 +1,11 @@ +package com.server.hispath.auth.domain; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface RequiredSuperManagerLogin { +} diff --git a/src/main/java/com/server/hispath/auth/domain/SuperManagerLogin.java b/src/main/java/com/server/hispath/auth/domain/SuperManagerLogin.java new file mode 100644 index 0000000..1673227 --- /dev/null +++ b/src/main/java/com/server/hispath/auth/domain/SuperManagerLogin.java @@ -0,0 +1,11 @@ +package com.server.hispath.auth.domain; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface SuperManagerLogin { +} diff --git a/src/main/java/com/server/hispath/auth/infrastructure/JwtProvider.java b/src/main/java/com/server/hispath/auth/infrastructure/JwtProvider.java index e027066..f8e83eb 100644 --- a/src/main/java/com/server/hispath/auth/infrastructure/JwtProvider.java +++ b/src/main/java/com/server/hispath/auth/infrastructure/JwtProvider.java @@ -49,6 +49,21 @@ public String getSecretKey(Member member){ return managerSecretKey; } + public boolean validateBothToken(String token){ + + try{ + validateToken(token, Member.STUDENT); + return true; + } catch (JwtException | IllegalArgumentException e){ + try{ + validateToken(token, Member.MANAGER); + return true; + } catch (JwtException | IllegalArgumentException e2){ + return false; + } + } + } + public void validateToken(String token, Member member) { try { JwtParser jwtParser = getJwtParser(member); diff --git a/src/main/java/com/server/hispath/auth/presentation/LoginInterceptor.java b/src/main/java/com/server/hispath/auth/presentation/LoginInterceptor.java index 71fd82c..bdc7d5d 100644 --- a/src/main/java/com/server/hispath/auth/presentation/LoginInterceptor.java +++ b/src/main/java/com/server/hispath/auth/presentation/LoginInterceptor.java @@ -3,9 +3,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import com.server.hispath.auth.domain.Member; -import com.server.hispath.auth.domain.RequiredManagerLogin; -import com.server.hispath.auth.domain.RequiredStudentLogin; +import com.server.hispath.auth.application.AuthService; +import com.server.hispath.auth.domain.*; import com.server.hispath.auth.infrastructure.JwtProvider; import com.server.hispath.util.AuthorizationExtractor; @@ -20,6 +19,7 @@ @RequiredArgsConstructor public class LoginInterceptor implements HandlerInterceptor { private final JwtProvider jwtProvider; + private final AuthService authService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { @@ -27,7 +27,7 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; - if (!(handlerMethod.hasMethodAnnotation(RequiredStudentLogin.class) || handlerMethod.hasMethodAnnotation(RequiredManagerLogin.class))) { + if (!(hasAnnotation(handlerMethod))) { return true; } String token = AuthorizationExtractor.extractAccessToken(request); @@ -36,11 +36,21 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons jwtProvider.validateToken(token, Member.STUDENT); } else if (handlerMethod.hasMethodAnnotation(RequiredManagerLogin.class)) { jwtProvider.validateToken(token, Member.MANAGER); + } else if (handlerMethod.hasMethodAnnotation(RequiredLogin.class)){ + jwtProvider.validateBothToken(token); + } else if (handlerMethod.hasMethodAnnotation(RequiredSuperManagerLogin.class)){ + authService.checkSuperManagerByToken(token); } return true; } + private boolean hasAnnotation(HandlerMethod handlerMethod){ + return handlerMethod.hasMethodAnnotation(RequiredLogin.class) + || handlerMethod.hasMethodAnnotation(RequiredStudentLogin.class) + || handlerMethod.hasMethodAnnotation(RequiredManagerLogin.class); + } + private boolean isPreflight(HttpServletRequest request) { return HttpMethod.OPTIONS.matches(request.getMethod()); } diff --git a/src/main/java/com/server/hispath/auth/presentation/LoginSuperManagerArgumentResolver.java b/src/main/java/com/server/hispath/auth/presentation/LoginSuperManagerArgumentResolver.java new file mode 100644 index 0000000..a2eadcf --- /dev/null +++ b/src/main/java/com/server/hispath/auth/presentation/LoginSuperManagerArgumentResolver.java @@ -0,0 +1,37 @@ +package com.server.hispath.auth.presentation; + +import java.util.Objects; +import javax.servlet.http.HttpServletRequest; + +import com.server.hispath.auth.application.AuthService; +import com.server.hispath.auth.domain.ManagerLogin; +import com.server.hispath.auth.domain.SuperManagerLogin; +import com.server.hispath.util.AuthorizationExtractor; + +import org.springframework.core.MethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class LoginSuperManagerArgumentResolver implements HandlerMethodArgumentResolver { + private final AuthService authService; + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.hasParameterAnnotation(SuperManagerLogin.class); + } + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { + String accessToken = AuthorizationExtractor + .extractAccessToken(Objects.requireNonNull(webRequest.getNativeRequest(HttpServletRequest.class))); + return authService.getSuperManagerId(accessToken); + } +} diff --git a/src/main/java/com/server/hispath/exception/activity/ParticipantDuplicateException.java b/src/main/java/com/server/hispath/exception/activity/ParticipantDuplicateException.java new file mode 100644 index 0000000..ba7a982 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/activity/ParticipantDuplicateException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.activity; + +import org.springframework.http.HttpStatus; + +public class ParticipantDuplicateException extends ActivityException { + public ParticipantDuplicateException(String studentNum, String name) { + super("이미 존재하는 참여자입니다.\n" + "학번: " + studentNum + " 이름: " + name, HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/exception/manager/ManagerNoAuthorizationException.java b/src/main/java/com/server/hispath/exception/manager/ManagerNoAuthorizationException.java new file mode 100644 index 0000000..96d20ee --- /dev/null +++ b/src/main/java/com/server/hispath/exception/manager/ManagerNoAuthorizationException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.manager; + +import org.springframework.http.HttpStatus; + +public class ManagerNoAuthorizationException extends ManagerException { + public ManagerNoAuthorizationException() { + super("사용 권한이 없습니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/manager/domain/Manager.java b/src/main/java/com/server/hispath/manager/domain/Manager.java index ebdafe0..9c222a1 100644 --- a/src/main/java/com/server/hispath/manager/domain/Manager.java +++ b/src/main/java/com/server/hispath/manager/domain/Manager.java @@ -54,4 +54,8 @@ public void update(ManagerCUDto dto){ public void approve() { this.approved = true; } + + public boolean isSuperManager(){ + return this.power > 1; + } } From 5cd3f5e5ed3203c837c1343360f71846d08b839d Mon Sep 17 00:00:00 2001 From: lukehongg <79990740+lukehongg@users.noreply.github.com> Date: Sat, 29 Oct 2022 00:48:25 +0900 Subject: [PATCH 055/148] =?UTF-8?q?[#38]:=EA=B3=B5=EC=A7=80=20Dto=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#39)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/server/hispath/notice/application/dto/NoticeDto.java | 3 ++- .../server/hispath/notice/presentation/NoticeController.java | 3 --- .../hispath/notice/presentation/response/NoticeResponse.java | 3 ++- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java b/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java index 6286073..df855a3 100644 --- a/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java +++ b/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java @@ -19,6 +19,7 @@ public class NoticeDto{ private String content; private int viewCnt; private boolean importance; + private boolean deleted; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") private LocalDate pubDate; @@ -28,6 +29,6 @@ public class NoticeDto{ public static NoticeDto from(Notice notice) { return new NoticeDto(notice.getId(), ManagerDto.of(notice.getManager()), notice.getTitle(), - notice.getContent(), notice.getViewCnt(), notice.isImportance(), notice.getPubDate(), notice.getExpDate()); + notice.getContent(), notice.getViewCnt(), notice.isImportance(), notice.isDeleted(), notice.getPubDate(), notice.getExpDate()); } } diff --git a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java index 9951f49..b13cbfa 100644 --- a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java +++ b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java @@ -60,9 +60,6 @@ public ResponseEntity update(@PathVariable Long id, @RequestBody return ResponseEntity.ok(response); } - - // D - @CrossOrigin(origins = "http://localhost:3000") @DeleteMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_DELETE) diff --git a/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java b/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java index 8d2fb7f..a260f1c 100644 --- a/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java +++ b/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java @@ -23,6 +23,7 @@ public class NoticeResponse { private String content; private int viewCnt; private boolean importance; + private boolean deleted; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") private LocalDate pubDate; @@ -32,6 +33,6 @@ public class NoticeResponse { public static NoticeResponse from(NoticeDto dto) { return new NoticeResponse(dto.getId(), dto.getManager().getId(), dto.getManager().getName(), - dto.getTitle(), dto.getContent(), dto.getViewCnt(), dto.isImportance(), dto.getPubDate(), dto.getExpDate()); + dto.getTitle(), dto.getContent(), dto.getViewCnt(), dto.isImportance(), dto.isDeleted(), dto.getPubDate(), dto.getExpDate()); } } From d6adfca9360c630370854fa5338856e235b5413a Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sat, 29 Oct 2022 15:37:36 +0900 Subject: [PATCH 056/148] =?UTF-8?q?feat[#41]=20:=20Major=20find=20all=20AP?= =?UTF-8?q?I=20=EA=B5=AC=ED=98=84=20(#42)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/server/hispath/docs/ApiDoc.java | 1 + .../major/application/MajorService.java | 16 +++++++++++-- .../major/presentation/MajorController.java | 24 +++++++++++++------ 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index a7d3413..bba5b2e 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -39,6 +39,7 @@ public class ApiDoc { public static final String ACTIVITY_READ_SEMESTER = "활동 학기 조회"; public static final String MAJOR_CREATE = "전공 생성"; public static final String MAJOR_READ = "단일 전공 조회"; + public static final String MAJOR_READ_ALL = "모든 전공 조회"; public static final String MAJOR_UPDATE = "전공 수정"; public static final String MAJOR_DELETE = "전공 삭제"; diff --git a/src/main/java/com/server/hispath/major/application/MajorService.java b/src/main/java/com/server/hispath/major/application/MajorService.java index 6ec20ce..a70e18a 100644 --- a/src/main/java/com/server/hispath/major/application/MajorService.java +++ b/src/main/java/com/server/hispath/major/application/MajorService.java @@ -1,5 +1,8 @@ package com.server.hispath.major.application; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.exception.major.MajorNotFoundException; import com.server.hispath.major.application.dto.MajorContentDto; import com.server.hispath.major.application.dto.MajorDto; @@ -7,9 +10,9 @@ import com.server.hispath.major.domain.repository.MajorRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; -import org.springframework.transaction.annotation.Transactional; @Service @@ -24,6 +27,7 @@ public Long create(MajorContentDto dto) { Major savedMajor = majorRepository.save(major); return savedMajor.getId(); } + @Transactional public MajorDto find(Long id) { Major major = this.findById(id); @@ -39,11 +43,19 @@ public MajorDto update(Long id, MajorContentDto dto) { } @Transactional - public void delete(Long id){ + public void delete(Long id) { majorRepository.deleteById(id); } public Major findById(Long id) { return majorRepository.findById(id).orElseThrow(MajorNotFoundException::new); } + + @Transactional(readOnly = true) + public List findAll() { + return majorRepository.findAll() + .stream() + .map(MajorDto::from) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/server/hispath/major/presentation/MajorController.java b/src/main/java/com/server/hispath/major/presentation/MajorController.java index 00ff3cf..81c1d4d 100644 --- a/src/main/java/com/server/hispath/major/presentation/MajorController.java +++ b/src/main/java/com/server/hispath/major/presentation/MajorController.java @@ -1,20 +1,21 @@ package com.server.hispath.major.presentation; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.docs.ApiDoc; import com.server.hispath.major.application.MajorService; - import com.server.hispath.major.application.dto.MajorContentDto; import com.server.hispath.major.application.dto.MajorDto; import com.server.hispath.major.presentation.request.MajorCURequest; import com.server.hispath.major.presentation.response.MajorResponse; -import io.swagger.annotations.ApiOperation; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import lombok.RequiredArgsConstructor; +import io.swagger.annotations.ApiOperation; -import java.sql.SQLOutput; +import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor @@ -26,8 +27,8 @@ public class MajorController { @PostMapping("/major") @ApiOperation(value = ApiDoc.MAJOR_CREATE) public ResponseEntity create(@RequestBody MajorCURequest request) { - Long id = majorService.create(MajorContentDto.from(request)); - return ResponseEntity.ok(id); + Long id = majorService.create(MajorContentDto.from(request)); + return ResponseEntity.ok(id); } @@ -39,7 +40,7 @@ public ResponseEntity find(@PathVariable Long id) { } @PatchMapping("/major/{id}") - @ApiOperation(value= ApiDoc.MAJOR_UPDATE) + @ApiOperation(value = ApiDoc.MAJOR_UPDATE) public ResponseEntity update(@PathVariable Long id, @RequestBody MajorCURequest request) { MajorDto dto = majorService.update(id, MajorContentDto.from(request)); MajorResponse response = MajorResponse.from(dto); @@ -53,5 +54,14 @@ public ResponseEntity delete(@PathVariable Long id) { return ResponseEntity.ok(id); } + @GetMapping("/majors") + @ApiOperation(value = ApiDoc.MAJOR_READ_ALL) + public ResponseEntity> findAll() { + List responses = majorService.findAll() + .stream() + .map(MajorResponse::from) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } } From 3a520b7bc17ff5aa27f7833a18081ce40c2afc76 Mon Sep 17 00:00:00 2001 From: lukehongg <79990740+lukehongg@users.noreply.github.com> Date: Sat, 29 Oct 2022 16:06:25 +0900 Subject: [PATCH 057/148] =?UTF-8?q?[#44]:=EA=B3=B5=EC=A7=80=20Content=20Le?= =?UTF-8?q?ngth=20=EC=84=A4=EC=A0=95=20(#45)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/notice/application/dto/NoticeContentDto.java | 1 + .../com/server/hispath/notice/application/dto/NoticeDto.java | 4 ++-- src/main/java/com/server/hispath/notice/domain/Notice.java | 1 + .../hispath/notice/presentation/request/NoticeRequest.java | 1 + .../hispath/notice/presentation/response/NoticeResponse.java | 4 ++-- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/server/hispath/notice/application/dto/NoticeContentDto.java b/src/main/java/com/server/hispath/notice/application/dto/NoticeContentDto.java index f5bc450..a043d16 100644 --- a/src/main/java/com/server/hispath/notice/application/dto/NoticeContentDto.java +++ b/src/main/java/com/server/hispath/notice/application/dto/NoticeContentDto.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; +import javax.persistence.Column; import java.time.LocalDate; @Getter diff --git a/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java b/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java index df855a3..6b569b4 100644 --- a/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java +++ b/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java @@ -7,6 +7,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import javax.persistence.Column; import java.time.LocalDate; @Getter @@ -19,7 +20,6 @@ public class NoticeDto{ private String content; private int viewCnt; private boolean importance; - private boolean deleted; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") private LocalDate pubDate; @@ -29,6 +29,6 @@ public class NoticeDto{ public static NoticeDto from(Notice notice) { return new NoticeDto(notice.getId(), ManagerDto.of(notice.getManager()), notice.getTitle(), - notice.getContent(), notice.getViewCnt(), notice.isImportance(), notice.isDeleted(), notice.getPubDate(), notice.getExpDate()); + notice.getContent(), notice.getViewCnt(), notice.isImportance(), notice.getPubDate(), notice.getExpDate()); } } diff --git a/src/main/java/com/server/hispath/notice/domain/Notice.java b/src/main/java/com/server/hispath/notice/domain/Notice.java index 2409388..3621592 100644 --- a/src/main/java/com/server/hispath/notice/domain/Notice.java +++ b/src/main/java/com/server/hispath/notice/domain/Notice.java @@ -35,6 +35,7 @@ public class Notice extends BaseEntity { private String title; + @Column(length = 5555) private String content; private int viewCnt; diff --git a/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java b/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java index f2b450c..9375b1b 100644 --- a/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java +++ b/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java @@ -4,6 +4,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; +import javax.persistence.Column; import java.time.LocalDate; import java.time.LocalDateTime; diff --git a/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java b/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java index a260f1c..cefd8a5 100644 --- a/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java +++ b/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java @@ -7,6 +7,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import javax.persistence.Column; import java.time.LocalDate; @@ -23,7 +24,6 @@ public class NoticeResponse { private String content; private int viewCnt; private boolean importance; - private boolean deleted; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") private LocalDate pubDate; @@ -33,6 +33,6 @@ public class NoticeResponse { public static NoticeResponse from(NoticeDto dto) { return new NoticeResponse(dto.getId(), dto.getManager().getId(), dto.getManager().getName(), - dto.getTitle(), dto.getContent(), dto.getViewCnt(), dto.isImportance(), dto.isDeleted(), dto.getPubDate(), dto.getExpDate()); + dto.getTitle(), dto.getContent(), dto.getViewCnt(), dto.isImportance(), dto.getPubDate(), dto.getExpDate()); } } From c30f3739c5f03a1472f7ab43dff8daabd8e41f6a Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sat, 29 Oct 2022 16:16:37 +0900 Subject: [PATCH 058/148] =?UTF-8?q?fix[#43]=20:=20major=20id=EA=B9=8C?= =?UTF-8?q?=EC=A7=80=20=EB=B3=B4=EB=82=B4=EC=A3=BC=EB=8A=94=20=EA=B2=83?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=20(#46)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../student/presentation/response/StudentResponse.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java b/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java index 00cbeda..d65b4fc 100644 --- a/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java +++ b/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java @@ -18,8 +18,10 @@ public class StudentResponse { private String profile; private Long departmentId; private String departmentName; - private String major1; - private String major2; + private Long major1Id; + private String major1Name; + private Long major2; + private String major2Name; private long loginCnt; private String blog; private String githubId; @@ -28,7 +30,7 @@ public class StudentResponse { public static StudentResponse from (StudentDto dto) { return new StudentResponse(dto.getId(), dto.getName(), dto.getSemester(), dto.getStudentNum(), dto.getPhone(), dto.getEmail(), dto.getProfile(), dto.getDepartmentDto().getId(), dto.getDepartmentDto().getName(), - dto.getMajor1().getName(), dto.getMajor2().getName(), + dto.getMajor1().getId(), dto.getMajor1().getName(), dto.getMajor2().getId(), dto.getMajor2().getName(), dto.getLoginCnt(), dto.getBlog(), dto.getGithubId(), dto.getReadme()); } From b9e3e1b72628145df98a693b65d5dfa16e38e335 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sat, 29 Oct 2022 17:28:03 +0900 Subject: [PATCH 059/148] =?UTF-8?q?[#40]=20:=20Resume=20CRUD=20=EB=B0=8F?= =?UTF-8?q?=20=ED=95=99=EC=83=9D=EC=9D=B4=20Resume=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=EC=8B=9C=20=EB=B3=B4=EB=8A=94=20API=20=EA=B5=AC=ED=98=84=20(#4?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#40] : resume domain 생성 * feat[#40] : Resume create API 구현 * feat[#40] : Resume update API 구현 * feat[#40] : Resume Delete API 구현 * fix[#40] : Resume domain 에 title 추가 * fix[#40] : resume 정보에 생성일, 수정일 추가 * feat[#40] : 단일 Resume 조회 API 구현 * feat[#40] : 학생의 모든 Resume 조회 API 구현 * feat[#40] : 학생의 Resume생성을 위한 Info 조회 API 구현 * feat[#40] : resume 데이터 넣는 test controller 구현 --- .../response/ActivitySimpleResponse.java | 21 +++++ .../server/hispath/common/TestController.java | 47 +++++++++++ .../java/com/server/hispath/docs/ApiDoc.java | 7 ++ .../exception/resume/ResumeException.java | 11 +++ .../resume/ResumeNotFoundException.java | 9 ++ .../resume/application/ResumeService.java | 68 +++++++++++++++ .../resume/application/dto/ResumeDto.java | 37 +++++++++ .../server/hispath/resume/domain/Resume.java | 44 ++++++++++ .../domain/repository/ResumeRepository.java | 12 +++ .../resume/presentation/ResumeController.java | 83 +++++++++++++++++++ .../presentation/request/ResumeCURequest.java | 13 +++ .../presentation/response/ResumeResponse.java | 26 ++++++ .../response/ResumeStudentInfo.java | 44 ++++++++++ .../hispath/student/domain/Student.java | 7 ++ .../presentation/StudentController.java | 18 ++-- 15 files changed, 436 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/ActivitySimpleResponse.java create mode 100644 src/main/java/com/server/hispath/exception/resume/ResumeException.java create mode 100644 src/main/java/com/server/hispath/exception/resume/ResumeNotFoundException.java create mode 100644 src/main/java/com/server/hispath/resume/application/ResumeService.java create mode 100644 src/main/java/com/server/hispath/resume/application/dto/ResumeDto.java create mode 100644 src/main/java/com/server/hispath/resume/domain/Resume.java create mode 100644 src/main/java/com/server/hispath/resume/domain/repository/ResumeRepository.java create mode 100644 src/main/java/com/server/hispath/resume/presentation/ResumeController.java create mode 100644 src/main/java/com/server/hispath/resume/presentation/request/ResumeCURequest.java create mode 100644 src/main/java/com/server/hispath/resume/presentation/response/ResumeResponse.java create mode 100644 src/main/java/com/server/hispath/resume/presentation/response/ResumeStudentInfo.java diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivitySimpleResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivitySimpleResponse.java new file mode 100644 index 0000000..344125c --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivitySimpleResponse.java @@ -0,0 +1,21 @@ +package com.server.hispath.activity.presentation.response; + +import com.server.hispath.activity.application.dto.ActivityDto; +import com.server.hispath.activity.application.dto.ActivityParticipantDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ActivitySimpleResponse { + private Long id; + private String name; + private String semester; + + public static ActivitySimpleResponse of(ActivityParticipantDto activityDto){ + return new ActivitySimpleResponse(activityDto.getId(), activityDto.getName(), activityDto.getSemester()); + } +} diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index d0eaf5e..006f854 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -21,6 +21,9 @@ import com.server.hispath.manager.domain.repository.ManagerRepository; import com.server.hispath.notice.domain.Notice; import com.server.hispath.notice.domain.repository.NoticeRepository; +import com.server.hispath.resume.application.ResumeService; +import com.server.hispath.resume.domain.Resume; +import com.server.hispath.resume.domain.repository.ResumeRepository; import com.server.hispath.student.application.StudentService; import com.server.hispath.student.application.dto.StudentSimpleRefDto; import com.server.hispath.student.domain.Student; @@ -49,6 +52,8 @@ public class TestController { private final DepartementRepository departementRepository; private final ActivityRepository activityRepository; private final StudentService studentService; + private final ResumeRepository resumeRepository; + private final ResumeService resumeService; @GetMapping("/init/all") public ResponseEntity initAll() { @@ -60,6 +65,7 @@ public ResponseEntity initAll() { saveNotice(); saveActivities(); saveParticipant(); + saveResumes(); return ResponseEntity.ok(null); } @@ -128,6 +134,47 @@ public ResponseEntity testManagerAuth(@ManagerLogin LoginManager loginMana return ResponseEntity.ok(null); } + @GetMapping("init/resume") + public ResponseEntity initResume() { + + saveResumes(); + return ResponseEntity.ok(null); + } + + private void saveResumes() { + Student student = studentService.findById(1L); + resumeRepository.save(Resume.builder() + .student(student) + .title("첫번째 이력서") + .content("jsonData가 들어가야해") + .build()); + resumeRepository.save(Resume.builder() + .student(student) + .title("두번째 이력서") + .content("jsonData가 들어가야해") + .build()); + resumeRepository.save(Resume.builder() + .student(student) + .title("세번째 이력서") + .content("jsonData가 들어가야해") + .build()); + resumeRepository.save(Resume.builder() + .student(student) + .title("네번째 이력서") + .content("jsonData가 들어가야해") + .build()); + resumeRepository.save(Resume.builder() + .student(student) + .title("다섯번째 이력서") + .content("jsonData가 들어가야해") + .build()); + resumeRepository.save(Resume.builder() + .student(student) + .title("여섯번째 이력서") + .content("jsonData가 들어가야해") + .build()); + } + public void saveParticipant() { List activities = activityRepository.findAll(); diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index bba5b2e..69472e1 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -75,4 +75,11 @@ public class ApiDoc { public static final String DEPARTMENT_DELETE = "학부 삭제"; + /* Resume 관련 API 명세 */ + public static final String RESUME_READ = "학생의 단일 이력서 조회"; + public static final String RESUME_READ_ALL = "학생의 모든 이력서 조회"; + public static final String RESUME_CREATE = "단일 이력서 생성"; + public static final String RESUME_UPDATE = "이력서 수정"; + public static final String RESUME_DELETE = "이력서 삭제"; + public static final String RESUME_INFO = "학생의 모든 정보 및 활동정보 조회"; } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/exception/resume/ResumeException.java b/src/main/java/com/server/hispath/exception/resume/ResumeException.java new file mode 100644 index 0000000..61ed34d --- /dev/null +++ b/src/main/java/com/server/hispath/exception/resume/ResumeException.java @@ -0,0 +1,11 @@ +package com.server.hispath.exception.resume; + +import com.server.hispath.exception.HisPathException; + +import org.springframework.http.HttpStatus; + +public class ResumeException extends HisPathException { + protected ResumeException(String message, HttpStatus httpStatus) { + super(message, httpStatus); + } +} diff --git a/src/main/java/com/server/hispath/exception/resume/ResumeNotFoundException.java b/src/main/java/com/server/hispath/exception/resume/ResumeNotFoundException.java new file mode 100644 index 0000000..d64c412 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/resume/ResumeNotFoundException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.resume; + +import org.springframework.http.HttpStatus; + +public class ResumeNotFoundException extends ResumeException { + public ResumeNotFoundException() { + super("존재하지 않는 이력서입니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/resume/application/ResumeService.java b/src/main/java/com/server/hispath/resume/application/ResumeService.java new file mode 100644 index 0000000..8e61dfb --- /dev/null +++ b/src/main/java/com/server/hispath/resume/application/ResumeService.java @@ -0,0 +1,68 @@ +package com.server.hispath.resume.application; + +import java.util.List; +import java.util.stream.Collectors; + +import com.server.hispath.exception.resume.ResumeNotFoundException; +import com.server.hispath.resume.application.dto.ResumeDto; +import com.server.hispath.resume.domain.Resume; +import com.server.hispath.resume.domain.repository.ResumeRepository; +import com.server.hispath.student.application.StudentService; +import com.server.hispath.student.domain.Student; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class ResumeService { + + private final ResumeRepository resumeRepository; + private final StudentService studentService; + + @Transactional + public Long create(Long studentId, ResumeDto resumeDto) { + Student student = studentService.findById(studentId); + Resume resume = Resume.builder() + .student(student) + .title(resumeDto.getTitle()) + .content(resumeDto.getContent()) + .build(); + + Resume savedResume = resumeRepository.save(resume); + student.addResume(savedResume); + return savedResume.getId(); + } + + @Transactional + public ResumeDto update(ResumeDto resumeDto) { + Resume resume = this.findById(resumeDto.getId()); + resume.updateContent(resumeDto); + return ResumeDto.of(resume); + } + + public Resume findById(Long id) { + return resumeRepository.findById(id).orElseThrow(ResumeNotFoundException::new); + } + + @Transactional + public void delete(Long id) { + resumeRepository.deleteById(id); + } + + @Transactional(readOnly = true) + public ResumeDto find(Long id) { + return ResumeDto.of(this.findById(id)); + } + + @Transactional(readOnly = true) + public List findAllStudentResumes(Long studentId) { + Student student = studentService.findById(studentId); + return resumeRepository.findByStudent(student) + .stream() + .map(ResumeDto::of) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/server/hispath/resume/application/dto/ResumeDto.java b/src/main/java/com/server/hispath/resume/application/dto/ResumeDto.java new file mode 100644 index 0000000..990ebf7 --- /dev/null +++ b/src/main/java/com/server/hispath/resume/application/dto/ResumeDto.java @@ -0,0 +1,37 @@ +package com.server.hispath.resume.application.dto; + +import java.time.LocalDateTime; + +import com.server.hispath.resume.domain.Resume; +import com.server.hispath.resume.presentation.request.ResumeCURequest; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ResumeDto { + private Long id; + private String title; + private String content; + private LocalDateTime createdAt; + private LocalDateTime updateAt; + + public ResumeDto(Long id, ResumeCURequest request) { + this.id = id; + this.title = request.getTitle(); + this.content = request.getContent(); + } + + public ResumeDto(ResumeCURequest request) { + this.title = request.getTitle(); + this.content = request.getContent(); + } + + public static ResumeDto of(Resume resume) { + return new ResumeDto(resume.getId(), resume.getTitle(), resume.getContent(), + resume.getCreatedAt(), resume.getUpdatedAt()); + } +} diff --git a/src/main/java/com/server/hispath/resume/domain/Resume.java b/src/main/java/com/server/hispath/resume/domain/Resume.java new file mode 100644 index 0000000..1b7a059 --- /dev/null +++ b/src/main/java/com/server/hispath/resume/domain/Resume.java @@ -0,0 +1,44 @@ +package com.server.hispath.resume.domain; + +import javax.persistence.*; + +import com.server.hispath.common.BaseEntity; +import com.server.hispath.resume.application.dto.ResumeDto; +import com.server.hispath.student.domain.Student; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Entity +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Where(clause = "deleted = false") +@SQLDelete(sql = "UPDATE resume SET deleted = true Where id = ?") +public class Resume extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + private Student student; + + private String title; + + @Column(length = 5555) + private String content; + + // ToDo 여러 템플릿을 위한 필드 + // private Template template; + + public void updateContent(ResumeDto resumeDto){ + this.title = resumeDto.getTitle(); + this.content = resumeDto.getContent(); + } +} diff --git a/src/main/java/com/server/hispath/resume/domain/repository/ResumeRepository.java b/src/main/java/com/server/hispath/resume/domain/repository/ResumeRepository.java new file mode 100644 index 0000000..b1d7510 --- /dev/null +++ b/src/main/java/com/server/hispath/resume/domain/repository/ResumeRepository.java @@ -0,0 +1,12 @@ +package com.server.hispath.resume.domain.repository; + +import java.util.List; + +import com.server.hispath.resume.domain.Resume; +import com.server.hispath.student.domain.Student; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ResumeRepository extends JpaRepository { + List findByStudent(Student student); +} diff --git a/src/main/java/com/server/hispath/resume/presentation/ResumeController.java b/src/main/java/com/server/hispath/resume/presentation/ResumeController.java new file mode 100644 index 0000000..4a76f5f --- /dev/null +++ b/src/main/java/com/server/hispath/resume/presentation/ResumeController.java @@ -0,0 +1,83 @@ +package com.server.hispath.resume.presentation; + +import java.util.List; +import java.util.stream.Collectors; + +import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.application.dto.ActivityParticipantDto; +import com.server.hispath.docs.ApiDoc; +import com.server.hispath.resume.application.ResumeService; +import com.server.hispath.resume.application.dto.ResumeDto; +import com.server.hispath.resume.presentation.request.ResumeCURequest; +import com.server.hispath.resume.presentation.response.ResumeResponse; +import com.server.hispath.resume.presentation.response.ResumeStudentInfo; +import com.server.hispath.student.application.StudentService; +import com.server.hispath.student.application.dto.StudentDto; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import io.swagger.annotations.ApiOperation; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +public class ResumeController { + private final ResumeService resumeService; + private final StudentService studentService; + private final ActivityService activityService; + + @PostMapping("/resume") + @ApiOperation(value = ApiDoc.RESUME_CREATE) + public ResponseEntity create(@RequestBody ResumeCURequest request) { + // Todo @Login 을 통해 API 를 호출 할 수 있도록 하기 + // Todo 현재는 그냥 단순 테스트를 위해 1번에 넣기 + Long response = resumeService.create(1L, new ResumeDto(request)); + return ResponseEntity.ok(response); + } + + @PutMapping("/resume/{id}") + @ApiOperation(value = ApiDoc.RESUME_UPDATE) + public ResponseEntity update(@PathVariable Long id, @RequestBody ResumeCURequest request) { + ResumeResponse response = ResumeResponse.of(resumeService.update(new ResumeDto(id, request))); + return ResponseEntity.ok(response); + } + + @DeleteMapping("/resume/{id}") + @ApiOperation(value = ApiDoc.RESUME_DELETE) + public ResponseEntity delete(@PathVariable Long id) { + resumeService.delete(id); + return ResponseEntity.ok(null); + } + + @GetMapping("/resume") + @ApiOperation(value = ApiDoc.RESUME_READ) + public ResponseEntity find(@RequestParam Long resumeId) { + return ResponseEntity.ok(ResumeResponse.of(resumeService.find(resumeId))); + } + + @GetMapping("/resumes") + @ApiOperation(value = ApiDoc.RESUME_READ_ALL) + public ResponseEntity> findALl() { + // Todo @Login 을 통해 API 를 호출 할 수 있도록 하기 + // Todo 현재는 그냥 단순 테스트를 위해 1번에 넣기 + List responses = resumeService.findAllStudentResumes(1L) + .stream() + .map(ResumeResponse::of) + .collect(Collectors.toList()); + + return ResponseEntity.ok(responses); + } + + @GetMapping("/resume/info") + @ApiOperation(value = ApiDoc.RESUME_INFO) + public ResponseEntity findStudentActivityInfo() { + // Todo @Login 을 통해 API 를 호출 할 수 있도록 하기 + // Todo 현재는 그냥 단순 테스트를 위해 1번에 넣기 + StudentDto studentDto = studentService.find(1L); + List activities = activityService.findAllParticipantActivites(studentDto.getId(), "All"); + return ResponseEntity.ok(new ResumeStudentInfo(studentDto, activities)); + } +} diff --git a/src/main/java/com/server/hispath/resume/presentation/request/ResumeCURequest.java b/src/main/java/com/server/hispath/resume/presentation/request/ResumeCURequest.java new file mode 100644 index 0000000..5d93613 --- /dev/null +++ b/src/main/java/com/server/hispath/resume/presentation/request/ResumeCURequest.java @@ -0,0 +1,13 @@ +package com.server.hispath.resume.presentation.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class ResumeCURequest { + private String title; + private String content; +} diff --git a/src/main/java/com/server/hispath/resume/presentation/response/ResumeResponse.java b/src/main/java/com/server/hispath/resume/presentation/response/ResumeResponse.java new file mode 100644 index 0000000..be27ca8 --- /dev/null +++ b/src/main/java/com/server/hispath/resume/presentation/response/ResumeResponse.java @@ -0,0 +1,26 @@ +package com.server.hispath.resume.presentation.response; + + +import java.time.LocalDateTime; + +import com.server.hispath.resume.application.dto.ResumeDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ResumeResponse { + private Long resumeId; + private String title; + private String content; + private LocalDateTime createdAt; + private LocalDateTime updateAt; + + public static ResumeResponse of(ResumeDto resumeDto) { + return new ResumeResponse(resumeDto.getId(), resumeDto.getTitle(), resumeDto.getContent(), + resumeDto.getCreatedAt(), resumeDto.getUpdateAt()); + } +} diff --git a/src/main/java/com/server/hispath/resume/presentation/response/ResumeStudentInfo.java b/src/main/java/com/server/hispath/resume/presentation/response/ResumeStudentInfo.java new file mode 100644 index 0000000..0275592 --- /dev/null +++ b/src/main/java/com/server/hispath/resume/presentation/response/ResumeStudentInfo.java @@ -0,0 +1,44 @@ +package com.server.hispath.resume.presentation.response; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import com.server.hispath.activity.application.dto.ActivityParticipantDto; +import com.server.hispath.activity.presentation.response.ActivitySimpleResponse; +import com.server.hispath.student.application.dto.StudentDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ResumeStudentInfo { + private String studentName; + private String phone; + private String profile; + private String email; + private String departmentName; + private String major1; + private String major2; + private String blog; + private String githubId; + private List activities = new ArrayList<>(); + + public ResumeStudentInfo(StudentDto studentDto, List activityDtos){ + this.studentName = studentDto.getName(); + this.phone = studentDto.getPhone(); + this.profile = studentDto.getProfile(); + this.email = studentDto.getEmail(); + this.departmentName = studentDto.getDepartmentDto().getName(); + this.major1 = studentDto.getMajor1().getName(); + this.major2 = studentDto.getMajor2().getName(); + this.blog = studentDto.getBlog(); + this.githubId = studentDto.getGithubId(); + this.activities = activityDtos.stream() + .map(ActivitySimpleResponse::of) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index 48910df..888c268 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -9,6 +9,7 @@ import com.server.hispath.common.BaseEntity; import com.server.hispath.department.domain.Department; import com.server.hispath.major.domain.Major; +import com.server.hispath.resume.domain.Resume; import com.server.hispath.student.application.dto.StudentCUDto; import com.server.hispath.student.application.dto.StudentDto; import com.server.hispath.student.application.dto.StudentRefDto; @@ -67,6 +68,8 @@ public class Student extends BaseEntity { @OneToMany(mappedBy = "student", cascade = CascadeType.PERSIST, orphanRemoval = true) private List participants = new ArrayList<>(); + @OneToMany(mappedBy = "student") + private List resumes = new ArrayList<>(); public void update(Department department, Major major1, Major major2, StudentCUDto dto) { this.name = dto.getName(); @@ -132,6 +135,10 @@ public void addParticipant(Participant participant) { this.participants.add(participant); } + public void addResume(Resume resume){ + this.resumes.add(resume); + } + public void updateLogin() { loginCnt++; lastLoginDate = LocalDateTime.now(); diff --git a/src/main/java/com/server/hispath/student/presentation/StudentController.java b/src/main/java/com/server/hispath/student/presentation/StudentController.java index 26e0774..39e0e28 100644 --- a/src/main/java/com/server/hispath/student/presentation/StudentController.java +++ b/src/main/java/com/server/hispath/student/presentation/StudentController.java @@ -1,11 +1,12 @@ package com.server.hispath.student.presentation; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.docs.ApiDoc; import com.server.hispath.notice.application.NoticeService; import com.server.hispath.notice.application.dto.DashboardNoticeDto; -import com.server.hispath.notice.application.dto.NoticeDto; import com.server.hispath.student.application.StudentService; - import com.server.hispath.student.application.dto.StudentCUDto; import com.server.hispath.student.application.dto.StudentDto; import com.server.hispath.student.presentation.request.StudentCURequest; @@ -13,18 +14,13 @@ import com.server.hispath.student.presentation.response.StudentResponse; import com.server.hispath.util.ExcelManager; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; - import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; - -import lombok.RequiredArgsConstructor; - import org.springframework.web.multipart.MultipartFile; -import java.util.List; -import java.util.stream.Collectors; +import io.swagger.annotations.ApiOperation; + +import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor @@ -66,7 +62,7 @@ public ResponseEntity> findAll() { return ResponseEntity.ok(responses); } - @PatchMapping("/student/{id}") + @PutMapping("/student/{id}") @ApiOperation(value = ApiDoc.STUDENT_UPDATE) public ResponseEntity update(@PathVariable Long id, @RequestBody StudentCURequest request) { StudentDto dto = studentService.update(id, request.getDepartmentId(), request.getMajor1Id(), request.getMajor2Id(), StudentCUDto.of(request)); From ed712854a0b9ac3cb936ce49382938668eb40268 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sat, 29 Oct 2022 17:34:12 +0900 Subject: [PATCH 060/148] =?UTF-8?q?fix[#48]=20:=20Dashboard=20api=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#49)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/hispath/notice/application/NoticeService.java | 2 +- .../hispath/notice/domain/repository/NoticeRepository.java | 2 +- .../student/presentation/response/DashboardResponse.java | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/server/hispath/notice/application/NoticeService.java b/src/main/java/com/server/hispath/notice/application/NoticeService.java index f9a6b12..7f30a10 100644 --- a/src/main/java/com/server/hispath/notice/application/NoticeService.java +++ b/src/main/java/com/server/hispath/notice/application/NoticeService.java @@ -66,7 +66,7 @@ public void delete(Long id) { @Transactional(readOnly = true) public List findRecentNotice() { - List notices = noticeRepository.findTop5ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate.now(), LocalDate.now()); + List notices = noticeRepository.findTop6ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate.now(), LocalDate.now()); return notices.stream() .map(DashboardNoticeDto::of) diff --git a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java index 4f37684..e7269ee 100644 --- a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java +++ b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java @@ -13,5 +13,5 @@ @Repository public interface NoticeRepository extends JpaRepository { - List findTop5ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate pubDate, LocalDate expDate); + List findTop6ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate pubDate, LocalDate expDate); } diff --git a/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java b/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java index 6ea3227..87f63b1 100644 --- a/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java +++ b/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java @@ -3,10 +3,10 @@ import java.util.List; import java.util.stream.Collectors; +import com.server.hispath.department.presentation.response.DepartmentResponse; import com.server.hispath.major.presentation.response.MajorResponse; import com.server.hispath.notice.application.dto.DashboardNoticeDto; import com.server.hispath.notice.presentation.response.NoticeDashboardResponse; -import com.server.hispath.student.application.dto.DashboardDto; import com.server.hispath.student.application.dto.StudentDto; import lombok.AllArgsConstructor; @@ -23,6 +23,7 @@ public class DashboardResponse { private String studentNum; private MajorResponse major1; private MajorResponse major2; + private DepartmentResponse department; private int semester; private String email; private String phone; @@ -33,8 +34,8 @@ public class DashboardResponse { public static DashboardResponse from(StudentDto studentDto, List noticeDtos) { return new DashboardResponse(studentDto.getId(), studentDto.getProfile(), studentDto.getName(), studentDto.getStudentNum(), - MajorResponse.from(studentDto.getMajor1()), MajorResponse.from(studentDto.getMajor2()), studentDto.getSemester(), - studentDto.getEmail(), studentDto.getPhone(), studentDto.getGithubId(), studentDto.getBlog(), studentDto.getReadme(), + MajorResponse.from(studentDto.getMajor1()), MajorResponse.from(studentDto.getMajor2()), DepartmentResponse.from(studentDto.getDepartmentDto()), + studentDto.getSemester(), studentDto.getEmail(), studentDto.getPhone(), studentDto.getGithubId(), studentDto.getBlog(), studentDto.getReadme(), noticeDtos.stream().map(NoticeDashboardResponse::of).collect(Collectors.toList())); } } From e25c3bada3ff235ce345ec654a3c48308baba6f9 Mon Sep 17 00:00:00 2001 From: gomster Date: Sat, 29 Oct 2022 17:46:24 +0900 Subject: [PATCH 061/148] hotfix : changeResponse --- .../hispath/student/presentation/response/StudentResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java b/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java index d65b4fc..f6b7121 100644 --- a/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java +++ b/src/main/java/com/server/hispath/student/presentation/response/StudentResponse.java @@ -20,7 +20,7 @@ public class StudentResponse { private String departmentName; private Long major1Id; private String major1Name; - private Long major2; + private Long major2Id; private String major2Name; private long loginCnt; private String blog; From 8e3b0b6a53f75c9e5ede6f9bd708ce6ce3690494 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sat, 29 Oct 2022 18:02:22 +0900 Subject: [PATCH 062/148] =?UTF-8?q?fix[#50]=20:=20Section=20=EB=B3=84=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=20=EC=A1=B0=ED=9A=8C=EA=B9=8C=EC=A7=80=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20(#51)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/ActivityService.java | 3 ++- .../server/hispath/activity/domain/Activity.java | 1 + .../activity/presentation/ActivityController.java | 4 ++-- .../resume/presentation/ResumeController.java | 2 +- .../hispath/student/domain/Participant.java | 15 +++++++++++---- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index 72c00c9..c9f531c 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -111,11 +111,12 @@ public ActivityParticipantDto updateStudentActivity(Long activityId, Long studen } @Transactional(readOnly = true) - public List findAllParticipantActivites(Long id, String semester) { + public List findAllParticipantActivites(Long id, String semester, String section) { Student student = studentRepository.findStudentWithActivities(id).orElseThrow(StudentNotFoundException::new); return student.getParticipants() .stream() .filter(participant -> participant.isSameSemester(semester)) + .filter(participant -> participant.isSameSection(section)) .map(ActivityParticipantDto::of) .collect(Collectors.toList()); } diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 994239f..452760e 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -154,4 +154,5 @@ public void updateStudentRegister() { public boolean isSameSemester(String semester) { return Objects.equals(this.semester, semester); } + } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index 2e07986..e59b481 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -113,8 +113,8 @@ public ResponseEntity updateStudentActivity(@PathVa @GetMapping("/student-activities/{id}") @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_READ_SEMESTER) - public ResponseEntity> findParticipatedActivities(@PathVariable Long id, @RequestParam String semester) { - List responses = activityService.findAllParticipantActivites(id, semester) + public ResponseEntity> findParticipatedActivities(@PathVariable Long id, @RequestParam String semester, @RequestParam String section) { + List responses = activityService.findAllParticipantActivites(id, semester, section) .stream() .map(ActivityParticipantResponse::of) .collect(Collectors.toList()); diff --git a/src/main/java/com/server/hispath/resume/presentation/ResumeController.java b/src/main/java/com/server/hispath/resume/presentation/ResumeController.java index 4a76f5f..7c9c473 100644 --- a/src/main/java/com/server/hispath/resume/presentation/ResumeController.java +++ b/src/main/java/com/server/hispath/resume/presentation/ResumeController.java @@ -77,7 +77,7 @@ public ResponseEntity findStudentActivityInfo() { // Todo @Login 을 통해 API 를 호출 할 수 있도록 하기 // Todo 현재는 그냥 단순 테스트를 위해 1번에 넣기 StudentDto studentDto = studentService.find(1L); - List activities = activityService.findAllParticipantActivites(studentDto.getId(), "All"); + List activities = activityService.findAllParticipantActivites(studentDto.getId(), "ALL", "ALL"); return ResponseEntity.ok(new ResumeStudentInfo(studentDto, activities)); } } diff --git a/src/main/java/com/server/hispath/student/domain/Participant.java b/src/main/java/com/server/hispath/student/domain/Participant.java index 7bcffa7..d9ef66a 100644 --- a/src/main/java/com/server/hispath/student/domain/Participant.java +++ b/src/main/java/com/server/hispath/student/domain/Participant.java @@ -48,16 +48,23 @@ public Participant(Student student, Activity activity, ParticipantContentDto dto this.data = dto.getData(); } - public boolean isSameSemester(String semester){ - if(Objects.equals(semester, "All")) return true; + public boolean isSameSemester(String semester) { + if (Objects.equals(semester, "ALL")) + return true; return activity.isSameSemester(semester); } - public boolean isSameStudent(Student student){ + public boolean isSameSection(String section) { + if (Objects.equals(section, "ALL")) + return true; + return Objects.equals(this.section.getName(), section); + } + + public boolean isSameStudent(Student student) { return Objects.equals(this.student, student); } - public void update(ParticipantContentDto participantContentDto){ + public void update(ParticipantContentDto participantContentDto) { this.section = participantContentDto.getSection(); this.data = participantContentDto.getData(); } From 91759fd613b735b66798b0c720cc3f3e2aad21c4 Mon Sep 17 00:00:00 2001 From: gomster Date: Sat, 29 Oct 2022 20:32:37 +0900 Subject: [PATCH 063/148] hotfix:add transcation --- .../server/hispath/manager/application/ManagerService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/server/hispath/manager/application/ManagerService.java b/src/main/java/com/server/hispath/manager/application/ManagerService.java index 8669169..ed9e15c 100644 --- a/src/main/java/com/server/hispath/manager/application/ManagerService.java +++ b/src/main/java/com/server/hispath/manager/application/ManagerService.java @@ -12,6 +12,7 @@ import com.server.hispath.manager.domain.repository.ManagerRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; @@ -21,15 +22,18 @@ public class ManagerService { private final ManagerRepository managerRepository; + @Transactional public Long create(ManagerCUDto dto) { Manager savedManager = managerRepository.save(Manager.of(dto)); return savedManager.getId(); } + @Transactional(readOnly = true) public ManagerDto findManager(Long id) { return ManagerDto.of(this.findById(id)); } + @Transactional(readOnly = true) public List findManagers() { return managerRepository.findAll() .stream() @@ -37,12 +41,14 @@ public List findManagers() { .collect(Collectors.toList()); } + @Transactional public ManagerDto update(Long id, ManagerCUDto dto){ Manager manager = this.findById(id); manager.update(dto); return ManagerDto.of(manager); } + @Transactional public Long delete(Long id){ managerRepository.deleteById(id); return id; From af5b3c2cc1aac27d5761784f563922a798a324cd Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sat, 29 Oct 2022 22:17:50 +0900 Subject: [PATCH 064/148] =?UTF-8?q?fix[#53]=20:=20approve=20with=20update?= =?UTF-8?q?=20level=20api=20=EA=B5=AC=ED=98=84=20(#54)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/application/ManagerService.java | 14 +++++++------- .../server/hispath/manager/domain/Manager.java | 6 ++++-- .../manager/presentation/ManagerController.java | 5 +++-- .../request/ManagerApproveRequest.java | 15 +++++++++++++++ 4 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/server/hispath/manager/presentation/request/ManagerApproveRequest.java diff --git a/src/main/java/com/server/hispath/manager/application/ManagerService.java b/src/main/java/com/server/hispath/manager/application/ManagerService.java index ed9e15c..52dd9af 100644 --- a/src/main/java/com/server/hispath/manager/application/ManagerService.java +++ b/src/main/java/com/server/hispath/manager/application/ManagerService.java @@ -3,8 +3,6 @@ import java.util.List; import java.util.stream.Collectors; -import com.server.hispath.category.domain.Category; -import com.server.hispath.exception.category.CategoryNotFoundException; import com.server.hispath.exception.manager.ManagerNotFoundException; import com.server.hispath.manager.application.dto.ManagerCUDto; import com.server.hispath.manager.application.dto.ManagerDto; @@ -42,21 +40,23 @@ public List findManagers() { } @Transactional - public ManagerDto update(Long id, ManagerCUDto dto){ + public ManagerDto update(Long id, ManagerCUDto dto) { Manager manager = this.findById(id); manager.update(dto); return ManagerDto.of(manager); } @Transactional - public Long delete(Long id){ + public Long delete(Long id) { managerRepository.deleteById(id); return id; } - public Long approve(Long id){ - this.findById(id).approve(); - return id; + public Long approve(Long managerId, int level) { + Manager manager = this.findById(managerId); + manager.approve(); + manager.updateLevel(level); + return managerId; } public Manager findById(Long id) { diff --git a/src/main/java/com/server/hispath/manager/domain/Manager.java b/src/main/java/com/server/hispath/manager/domain/Manager.java index 9c222a1..af3280c 100644 --- a/src/main/java/com/server/hispath/manager/domain/Manager.java +++ b/src/main/java/com/server/hispath/manager/domain/Manager.java @@ -44,7 +44,7 @@ public static Manager of(ManagerCUDto dto) { .build(); } - public void update(ManagerCUDto dto){ + public void update(ManagerCUDto dto) { this.email = dto.getEmail(); this.name = dto.getName(); this.department = dto.getDepartment(); @@ -55,7 +55,9 @@ public void approve() { this.approved = true; } - public boolean isSuperManager(){ + public void updateLevel(int level) {this.power = level;} + + public boolean isSuperManager() { return this.power > 1; } } diff --git a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java index f57e0d0..d4fbf9c 100644 --- a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java +++ b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java @@ -6,6 +6,7 @@ import com.server.hispath.docs.ApiDoc; import com.server.hispath.manager.application.ManagerService; import com.server.hispath.manager.application.dto.ManagerCUDto; +import com.server.hispath.manager.presentation.request.ManagerApproveRequest; import com.server.hispath.manager.presentation.request.ManagerCURequest; import com.server.hispath.manager.presentation.response.ManagerResponse; @@ -56,8 +57,8 @@ public ResponseEntity update(@PathVariable Long id, @RequestBod @PutMapping("/manager/approve/{id}") @ApiOperation(value = ApiDoc.MANAGER_APPROVE) - public ResponseEntity approve(@PathVariable Long id) { - Long response = managerService.approve(id); + public ResponseEntity approve(@RequestBody ManagerApproveRequest request) { + Long response = managerService.approve(request.getManagerId(), request.getLevel()); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/server/hispath/manager/presentation/request/ManagerApproveRequest.java b/src/main/java/com/server/hispath/manager/presentation/request/ManagerApproveRequest.java new file mode 100644 index 0000000..ff4f801 --- /dev/null +++ b/src/main/java/com/server/hispath/manager/presentation/request/ManagerApproveRequest.java @@ -0,0 +1,15 @@ +package com.server.hispath.manager.presentation.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ManagerApproveRequest { + private Long managerId; + private int level; +} From 335ec828957f3e302bccb2bff38eb22517013657 Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Sat, 29 Oct 2022 22:57:57 +0900 Subject: [PATCH 065/148] hotfix: manager approve (#56) --- .../com/server/hispath/manager/application/ManagerService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/server/hispath/manager/application/ManagerService.java b/src/main/java/com/server/hispath/manager/application/ManagerService.java index 52dd9af..b7d2264 100644 --- a/src/main/java/com/server/hispath/manager/application/ManagerService.java +++ b/src/main/java/com/server/hispath/manager/application/ManagerService.java @@ -52,6 +52,7 @@ public Long delete(Long id) { return id; } + @Transactional public Long approve(Long managerId, int level) { Manager manager = this.findById(managerId); manager.approve(); From 01c1f4de120fae0d926ae51550e8480f83ace354 Mon Sep 17 00:00:00 2001 From: gomster Date: Sat, 29 Oct 2022 23:23:49 +0900 Subject: [PATCH 066/148] hotfix : revice path of api --- .../server/hispath/manager/presentation/ManagerController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java index d4fbf9c..729aec5 100644 --- a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java +++ b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java @@ -55,7 +55,7 @@ public ResponseEntity update(@PathVariable Long id, @RequestBod return ResponseEntity.ok(response); } - @PutMapping("/manager/approve/{id}") + @PutMapping("/manager/approve") @ApiOperation(value = ApiDoc.MANAGER_APPROVE) public ResponseEntity approve(@RequestBody ManagerApproveRequest request) { Long response = managerService.approve(request.getManagerId(), request.getLevel()); From ab60504cb4cc436704351ef4427c38a6a7684aa1 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sun, 30 Oct 2022 01:22:35 +0900 Subject: [PATCH 067/148] =?UTF-8?q?[#52]=20:=20Scholarship=20create,=20Rea?= =?UTF-8?q?d=20API=20=EA=B5=AC=ED=98=84=20(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#52] : Scholarship create API 구현 * feat[#52] : Scholarship get Weight 함수 분리 * feat[#52] : 장학금 수혜자들 (학기별, 승인별 )명단 조회 API 구현 * fix[#52] : 테스트 컨트롤러 잘못된거 변경 * feat[#52] : scholarship test data 넣는 api 개발 --- .../domain/repository/ActivityRepository.java | 1 - .../server/hispath/common/TestController.java | 62 +++++++++++------- .../java/com/server/hispath/docs/ApiDoc.java | 7 ++- .../application/ScholarshipService.java | 63 +++++++++++++++---- .../application/dto/ScholarshipCUDto.java | 16 ----- .../application/dto/ScholarshipDto.java | 31 +++++++++ .../scholarship/domain/Scholarship.java | 31 +++++---- .../repository/ScholarshipRepository.java | 14 +++++ .../presentation/ScholarshipController.java | 44 ++++++++----- .../response/ScholarshipResponse.java | 30 +++++++++ .../hispath/student/domain/Student.java | 4 ++ 11 files changed, 223 insertions(+), 80 deletions(-) delete mode 100644 src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipCUDto.java create mode 100644 src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java create mode 100644 src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java index 5b90075..d62808f 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -25,5 +25,4 @@ public interface ActivityRepository extends JpaRepository { List findAllBySemesterAndRequestStatus(String semester, int requestStatus); List findAllByRequestStatus(int requestStatus); - } diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 006f854..1238317 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -24,6 +24,8 @@ import com.server.hispath.resume.application.ResumeService; import com.server.hispath.resume.domain.Resume; import com.server.hispath.resume.domain.repository.ResumeRepository; +import com.server.hispath.scholarship.application.ScholarshipService; +import com.server.hispath.scholarship.domain.repository.ScholarshipRepository; import com.server.hispath.student.application.StudentService; import com.server.hispath.student.application.dto.StudentSimpleRefDto; import com.server.hispath.student.domain.Student; @@ -54,6 +56,8 @@ public class TestController { private final StudentService studentService; private final ResumeRepository resumeRepository; private final ResumeService resumeService; + private final ScholarshipRepository scholarshipRepository; + private final ScholarshipService scholarshipService; @GetMapping("/init/all") public ResponseEntity initAll() { @@ -141,6 +145,23 @@ public ResponseEntity initResume() { return ResponseEntity.ok(null); } + @GetMapping("init/scholarship") + public ResponseEntity initScholarship() { + + scholarshipService.create(1L, "2022-2"); + scholarshipService.create(2L, "2022-2"); + scholarshipService.create(3L, "2022-2"); + scholarshipService.create(4L, "2022-2"); + scholarshipService.create(5L, "2022-2"); + scholarshipService.create(6L, "2022-2"); + scholarshipService.create(7L, "2022-2"); + scholarshipService.create(8L, "2022-2"); + scholarshipService.create(9L, "2022-2"); + scholarshipService.create(9L, "2022-2"); + + return ResponseEntity.ok(null); + } + private void saveResumes() { Student student = studentService.findById(1L); resumeRepository.save(Resume.builder() @@ -342,7 +363,7 @@ private void saveStudent() { .studentNum("22200000") .semester(5) .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("생명과학전공")) .phone("010-1234-1234") .email("kim@handong.ac.kr") .profile("profile.url") @@ -353,10 +374,10 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("박한동") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("국제어문")) .studentNum("22200001") .semester(3) - .major1(majorRepository.findByName("컴퓨터공학전공")) + .major1(majorRepository.findByName("국제지역학전공")) .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-1234-5678") .email("park@handong.ac.kr") @@ -368,10 +389,10 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("이한동") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("경영경제")) .studentNum("22200002") .semester(5) - .major1(majorRepository.findByName("컴퓨터공학전공")) + .major1(majorRepository.findByName("경영학전공")) .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-5678-1234") .email("lee@handong.ac.kr") @@ -383,10 +404,10 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("정한동") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("법학부")) .studentNum("22200003") .semester(6) - .major1(majorRepository.findByName("컴퓨터공학전공")) + .major1(majorRepository.findByName("한국법전공")) .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-1111-1111") .email("jeong@handong.ac.kr") @@ -398,10 +419,10 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("우한동") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("커뮤니케이션")) .studentNum("22200004") .semester(6) - .major1(majorRepository.findByName("컴퓨터공학전공")) + .major1(majorRepository.findByName("공연영상학전공")) .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-2222-3333") .email("woo@handong.ac.kr") @@ -413,10 +434,10 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("위한동") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("상담복지")) .studentNum("22200005") .semester(6) - .major1(majorRepository.findByName("컴퓨터공학전공")) + .major1(majorRepository.findByName("사회복지학전공")) .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4444-1234") .email("wi@handong.ac.kr") @@ -428,10 +449,10 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("하한동") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("공간환경시스템")) .studentNum("22200006") .semester(8) - .major1(majorRepository.findByName("컴퓨터공학전공")) + .major1(majorRepository.findByName("도시환경공학전공")) .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-9999-1111") .email("ha@handong.ac.kr") @@ -443,7 +464,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("마한동") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("제품디자인전공")) .studentNum("22200007") .semester(4) .major1(majorRepository.findByName("컴퓨터공학전공")) @@ -458,10 +479,10 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("유한동") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("기계제어")) .studentNum("22200008") .semester(6) - .major1(majorRepository.findByName("컴퓨터공학전공")) + .major1(majorRepository.findByName("기계공학전공")) .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-3434-2323") .email("yu@handong.ac.kr") @@ -473,10 +494,10 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("진한동") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("ICT창업학부")) .studentNum("22200009") .semester(7) - .major1(majorRepository.findByName("컴퓨터공학전공")) + .major1(majorRepository.findByName("ICT 융합전공")) .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-8787-8787") .email("jin@handong.ac.kr") @@ -530,10 +551,7 @@ private void saveDepartment() { .name("커뮤니케이션") .build()); departementRepository.save(Department.builder() - .name("상당복지") - .build()); - departementRepository.save(Department.builder() - .name("상당복지") + .name("상담복지") .build()); departementRepository.save(Department.builder() .name("공간환경시스템") diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 69472e1..756a3b0 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -35,7 +35,6 @@ public class ApiDoc { public static final String CATEGORY_UPDATE = "카테고리 수정"; public static final String CATEGORY_DELETE = "카테고리 삭제"; - public static final String SCHOLARSHIP_CREATE = "장학금 신청 등록"; public static final String ACTIVITY_READ_SEMESTER = "활동 학기 조회"; public static final String MAJOR_CREATE = "전공 생성"; public static final String MAJOR_READ = "단일 전공 조회"; @@ -82,4 +81,10 @@ public class ApiDoc { public static final String RESUME_UPDATE = "이력서 수정"; public static final String RESUME_DELETE = "이력서 삭제"; public static final String RESUME_INFO = "학생의 모든 정보 및 활동정보 조회"; + + /* Scholarship 관련 API 명세 */ + public static final String SCHOLARSHIP_CREATE = "장학금 신청 등록"; + public static final String SCHOLARSHIP_READ_ALL = "장학금 수혜자들 명단 조회"; + public static final String SCHOLARSHIP_ACTIVITIES = "장학금 수혜자 정보와 그 활동들 조회"; + public static final String APPROVE_SCHOLARSHIPS = "현학기 장학금 승인 명단 엑셀 업로드"; } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index bd7282a..25ab9f4 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -1,34 +1,73 @@ package com.server.hispath.scholarship.application; -import com.server.hispath.category.application.dto.CategoryContentDto; -import com.server.hispath.category.domain.Category; -import com.server.hispath.scholarship.application.dto.ScholarshipCUDto; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.scholarship.application.dto.ScholarshipContentDto; +import com.server.hispath.scholarship.application.dto.ScholarshipDto; import com.server.hispath.scholarship.domain.Scholarship; import com.server.hispath.scholarship.domain.repository.ScholarshipRepository; -import lombok.RequiredArgsConstructor; +import com.server.hispath.student.application.StudentService; +import com.server.hispath.student.domain.Student; + import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import javax.transaction.Transactional; -import java.util.List; -import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor public class ScholarshipService { private final ScholarshipRepository scholarshipRepository; + private final StudentService studentService; + private final ActivityRepository activityRepository; @Transactional - public Long apply(ScholarshipCUDto dto){ - Scholarship savedScholarship = scholarshipRepository.save(Scholarship.from(dto)); + public Long create(Long studentId, String semester) { + Student student = studentService.findById(studentId); + + Scholarship existScholarship = scholarshipRepository.findFirstByStudentAndSemester(student, semester); + if (Objects.nonNull(existScholarship)) + scholarshipRepository.delete(existScholarship); + + int totalWeight = getTotalWeight(studentId); + + Scholarship scholarship = Scholarship.builder() + .student(student) + .semester(semester) + .totalMileage(totalWeight) + .sMajor1(student.getMajor1()) + .sMajor2(student.getMajor2()) + .sDepartment(student.getDepartment()) + .build(); + + Scholarship savedScholarship = scholarshipRepository.save(scholarship); return savedScholarship.getId(); } - @Transactional + private int getTotalWeight(Long studentId) { + return activityRepository.findActivityWithStudents(studentId) + .stream() + .map(Activity::getWeight) + .reduce(0, Integer::sum); + } + + @Transactional(readOnly = true) public List findAll() { List scholarships = scholarshipRepository.findAll(); return scholarships.stream() - .map(ScholarshipContentDto::from) - .collect(Collectors.toList()); + .map(ScholarshipContentDto::from) + .collect(Collectors.toList()); + } + + @Transactional(readOnly = true) + public List findAllScholarshipStudent(boolean approved, String semester) { + List scholarships = scholarshipRepository.findAllByApprovedAndSemester(approved, semester); + return scholarships.stream() + .map(ScholarshipDto::of) + .collect(Collectors.toList()); } } diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipCUDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipCUDto.java deleted file mode 100644 index fa0d4de..0000000 --- a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipCUDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.server.hispath.scholarship.application.dto; - - -import com.server.hispath.scholarship.presentation.request.ScholarshipCURequest; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class ScholarshipCUDto { - private String semester; - - public static ScholarshipCUDto of(ScholarshipCURequest request) { return new ScholarshipCUDto(request.getSemester());} -} diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java new file mode 100644 index 0000000..0b234fa --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java @@ -0,0 +1,31 @@ +package com.server.hispath.scholarship.application.dto; + +import com.server.hispath.scholarship.domain.Scholarship; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ScholarshipDto { + private String name; + private String studentNum; + private String semester; + private String departmentName; + private String major1Name; + private String major2Name; + private String email; + private String phone; + private int totalWeight; + + public static ScholarshipDto of(Scholarship scholarship) { + return new ScholarshipDto(scholarship.getStudent().getName(), scholarship.getStudent().getStudentNum(), + scholarship.getSemester(), scholarship.getSDepartment().getName(), scholarship.getSMajor1().getName(), + scholarship.getSMajor2().getName(), scholarship.getStudent().getEmail(), + scholarship.getStudent().getPhone(), scholarship.getTotalMileage()); + } +} diff --git a/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java b/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java index c5a3b90..d59fc4b 100644 --- a/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java +++ b/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java @@ -3,10 +3,11 @@ import javax.persistence.*; import com.server.hispath.common.BaseEntity; -import com.server.hispath.scholarship.application.dto.ScholarshipCUDto; +import com.server.hispath.department.domain.Department; +import com.server.hispath.major.domain.Major; import com.server.hispath.student.domain.Student; - import com.sun.istack.NotNull; + import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -14,34 +15,38 @@ import org.hibernate.annotations.SQLDelete; import org.hibernate.annotations.Where; -import java.util.ArrayList; -import java.util.List; - @Entity @Getter @Builder @NoArgsConstructor @AllArgsConstructor @Where(clause = "deleted = false") -@SQLDelete(sql = "UPDATE scholarShip SET deleted = true Where id = ?") +@SQLDelete(sql = "UPDATE scholarship SET deleted = true Where id = ?") public class Scholarship extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; -// @OneToMany(mappedBy = "student") -// private List students = new ArrayList<>(); + @ManyToOne(fetch = FetchType.LAZY) + private Student student; @NotNull private String semester; private int totalMileage; - private boolean approved; + @ManyToOne(fetch = FetchType.LAZY) + private Major sMajor1; + + @ManyToOne(fetch = FetchType.LAZY) + private Major sMajor2; + + @ManyToOne(fetch = FetchType.LAZY) + private Department sDepartment; + + private String result; + + private boolean approved = false; - public static Scholarship from(ScholarshipCUDto dto){ - return Scholarship.builder().semester(dto.getSemester()).build(); - } - //ToDO : 나중 구현 예정 } diff --git a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java index 9b7a2fa..77ded49 100644 --- a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java +++ b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java @@ -1,9 +1,23 @@ package com.server.hispath.scholarship.domain.repository; +import java.util.List; + import com.server.hispath.scholarship.domain.Scholarship; +import com.server.hispath.student.domain.Student; + import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; public interface ScholarshipRepository extends JpaRepository { + Scholarship findFirstByStudentAndSemester(Student student, String semester); + @Query("select s from Scholarship s " + + "join fetch s.student " + + "join fetch s.sDepartment " + + "join fetch s.sMajor1 " + + "join fetch s.sMajor2 " + + "where s.approved = :approved " + + "and s.semester = :semester ") + List findAllByApprovedAndSemester(boolean approved, String semester); } diff --git a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java index 880bb8f..b72c251 100644 --- a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java +++ b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java @@ -1,30 +1,44 @@ package com.server.hispath.scholarship.presentation; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.docs.ApiDoc; import com.server.hispath.scholarship.application.ScholarshipService; -import com.server.hispath.scholarship.application.dto.ScholarshipCUDto; -import com.server.hispath.scholarship.domain.Scholarship; import com.server.hispath.scholarship.presentation.request.ScholarshipCURequest; +import com.server.hispath.scholarship.presentation.response.ScholarshipResponse; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + import io.swagger.annotations.ApiOperation; + import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor @RequestMapping("/api") public class ScholarshipController { - private final ScholarshipService scholarshipService; - // 장학금 신청 - @PostMapping("/scholarship") - @ApiOperation(value = ApiDoc.SCHOLARSHIP_CREATE) - public ResponseEntity apply(@RequestBody ScholarshipCURequest request) { - Long appliedId = scholarshipService.apply(ScholarshipCUDto.of(request)); - return ResponseEntity.ok(appliedId); - } + private final ScholarshipService scholarshipService; + + @PostMapping("/scholarship") + @ApiOperation(value = ApiDoc.SCHOLARSHIP_CREATE) + public ResponseEntity create(@RequestBody ScholarshipCURequest request) { + // Todo @Login 을 통해 API 를 호출 할 수 있도록 하기 + // Todo 현재는 그냥 단순 테스트를 위해 1번에 넣기 + Long response = scholarshipService.create(1L, request.getSemester()); + + return ResponseEntity.ok(response); + } + @GetMapping("/scholarships") + @ApiOperation(value = ApiDoc.SCHOLARSHIP_READ_ALL) + public ResponseEntity> getScholarshipStudents(@RequestParam boolean approved, @RequestParam String semester) { + List responses = scholarshipService.findAllScholarshipStudent(approved, semester) + .stream() + .map(ScholarshipResponse::of) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } } diff --git a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java new file mode 100644 index 0000000..dad164f --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java @@ -0,0 +1,30 @@ +package com.server.hispath.scholarship.presentation.response; + +import com.server.hispath.scholarship.application.dto.ScholarshipDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ScholarshipResponse { + private String name; + private String studentNum; + private String semester; + private String departmentName; + private String major1Name; + private String major2Name; + private String email; + private String phone; + private int totalWeight; + + public static ScholarshipResponse of(ScholarshipDto dto){ + return new ScholarshipResponse(dto.getName(), dto.getStudentNum(), + dto.getSemester(), dto.getDepartmentName(), dto.getMajor1Name(), + dto.getMajor2Name(), dto.getEmail(), dto.getPhone(), dto.getTotalWeight()); + } +} diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index 888c268..18ff873 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -10,6 +10,7 @@ import com.server.hispath.department.domain.Department; import com.server.hispath.major.domain.Major; import com.server.hispath.resume.domain.Resume; +import com.server.hispath.scholarship.domain.Scholarship; import com.server.hispath.student.application.dto.StudentCUDto; import com.server.hispath.student.application.dto.StudentDto; import com.server.hispath.student.application.dto.StudentRefDto; @@ -71,6 +72,9 @@ public class Student extends BaseEntity { @OneToMany(mappedBy = "student") private List resumes = new ArrayList<>(); + @OneToMany(mappedBy = "student") + private List scholarships = new ArrayList<>(); + public void update(Department department, Major major1, Major major2, StudentCUDto dto) { this.name = dto.getName(); this.studentNum = dto.getStudentNum(); From f966d40f525fbe17328645f104704b773d230693 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Mon, 31 Oct 2022 14:07:59 +0900 Subject: [PATCH 068/148] =?UTF-8?q?[#52]=20:=20=EC=9E=A5=ED=95=99=EA=B8=88?= =?UTF-8?q?=20=EC=88=98=ED=98=9C=EC=9E=90=20=EB=AA=85=EB=8B=A8=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API,=20=EC=9E=A5=ED=95=99=EA=B8=88=20=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=EC=8A=B9=EC=9D=B8=20API=20=EA=B5=AC=ED=98=84=20(#5?= =?UTF-8?q?8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#52] : Scholarship create API 구현 * feat[#52] : Scholarship get Weight 함수 분리 * feat[#52] : 장학금 수혜자들 (학기별, 승인별 )명단 조회 API 구현 * fix[#52] : 테스트 컨트롤러 잘못된거 변경 * feat[#52] : scholarship test data 넣는 api 개발 * feat[#52] : 학기별로 장학금 수혜자 정보 및 해당 학생 활동 조회 API 구현 * feat[#52] : 장학금 내역 엑셀 승인 API 구현 --- .../activity/application/ActivityService.java | 10 ++- .../hispath/activity/domain/Activity.java | 1 + .../domain/repository/ActivityRepository.java | 9 ++- .../ScholarshipDuplicateException.java | 9 +++ .../scholarship/ScholarshipException.java | 11 +++ .../ScholarshipNotFoundException.java | 11 +++ .../ScholarshipNotMatchException.java | 9 +++ .../application/ScholarshipService.java | 81 +++++++++++++++++-- .../dto/ScholarshipApprovalDto.java | 24 ++++++ .../application/dto/ScholarshipDto.java | 3 +- .../scholarship/domain/Scholarship.java | 3 + .../repository/ScholarshipRepository.java | 12 ++- .../presentation/ScholarshipController.java | 31 +++++++ .../response/ScholarshipActivityResponse.java | 27 +++++++ .../response/ScholarshipDetailResponse.java | 34 ++++++++ .../domain/repository/StudentRepository.java | 13 ++- .../com/server/hispath/util/ExcelManager.java | 18 +++++ 17 files changed, 292 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/server/hispath/exception/scholarship/ScholarshipDuplicateException.java create mode 100644 src/main/java/com/server/hispath/exception/scholarship/ScholarshipException.java create mode 100644 src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotFoundException.java create mode 100644 src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotMatchException.java create mode 100644 src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipApprovalDto.java create mode 100644 src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipActivityResponse.java create mode 100644 src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipDetailResponse.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index c9f531c..9c30348 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -1,7 +1,6 @@ package com.server.hispath.activity.application; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; import com.server.hispath.activity.application.dto.*; @@ -121,4 +120,13 @@ public List findAllParticipantActivites(Long id, String .collect(Collectors.toList()); } + @Transactional(readOnly = true) + public List findAllByStudentAndSemster(Long id, String semester) { + Student student = studentRepository.findStudentWithIdAndSemester(id, semester) + .orElseThrow(StudentNotFoundException::new); + return student.getParticipants() + .stream() + .map(participant -> ActivityDto.from(participant.getActivity())) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 452760e..0fb93c3 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -48,6 +48,7 @@ public class Activity extends BaseEntity { private String remark; + // 1 일떄 마일리지 처리, 0이면 마일리지 아님 private int requestStatus; private String name; diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java index d62808f..8d0a9df 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -4,6 +4,7 @@ import java.util.Optional; import com.server.hispath.activity.domain.Activity; +import com.server.hispath.student.domain.Student; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -14,10 +15,14 @@ public interface ActivityRepository extends JpaRepository { @Query("select a from Activity a " + "left join fetch a.participants as p " + "left join fetch p.student " + - "where a.id = :id") + "where a.id = :id ") Optional findActivityWithStudents(Long id); - + @Query("select a from Activity a " + + "left join fetch a.participants as p " + + "where p.student = :student " + + "and a.semester = :semester") + List findActivitiesByStudentAndSemester(Student student, String semester); @Query("select distinct semester from Activity") List bringSemester(); diff --git a/src/main/java/com/server/hispath/exception/scholarship/ScholarshipDuplicateException.java b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipDuplicateException.java new file mode 100644 index 0000000..bfccd1d --- /dev/null +++ b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipDuplicateException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.scholarship; + +import org.springframework.http.HttpStatus; + +public class ScholarshipDuplicateException extends ScholarshipException { + public ScholarshipDuplicateException() { + super("중복되는 학생의 정보가 존재합니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/exception/scholarship/ScholarshipException.java b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipException.java new file mode 100644 index 0000000..711f3e2 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipException.java @@ -0,0 +1,11 @@ +package com.server.hispath.exception.scholarship; + +import com.server.hispath.exception.HisPathException; + +import org.springframework.http.HttpStatus; + +public class ScholarshipException extends HisPathException { + protected ScholarshipException(String message, HttpStatus httpStatus) { + super(message, httpStatus); + } +} diff --git a/src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotFoundException.java b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotFoundException.java new file mode 100644 index 0000000..9ad2a11 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotFoundException.java @@ -0,0 +1,11 @@ +package com.server.hispath.exception.scholarship; + +import com.server.hispath.exception.resume.ResumeException; + +import org.springframework.http.HttpStatus; + +public class ScholarshipNotFoundException extends ScholarshipException { + public ScholarshipNotFoundException() { + super("존재하지 않는 장학금 수혜 내역입니다.", HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotMatchException.java b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotMatchException.java new file mode 100644 index 0000000..0cd8181 --- /dev/null +++ b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotMatchException.java @@ -0,0 +1,9 @@ +package com.server.hispath.exception.scholarship; + +import org.springframework.http.HttpStatus; + +public class ScholarshipNotMatchException extends ScholarshipException { + public ScholarshipNotMatchException(String msg) { + super("입력 맞지 않는 내역입니다.\n" + msg, HttpStatus.BAD_REQUEST); + } +} diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index 25ab9f4..b9451f8 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -1,17 +1,25 @@ package com.server.hispath.scholarship.application; +import java.util.HashSet; import java.util.List; -import java.util.Objects; +import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; +import com.server.hispath.exception.scholarship.ScholarshipDuplicateException; +import com.server.hispath.exception.scholarship.ScholarshipNotFoundException; +import com.server.hispath.exception.scholarship.ScholarshipNotMatchException; +import com.server.hispath.exception.student.StudentNotFoundException; +import com.server.hispath.scholarship.application.dto.ScholarshipApprovalDto; import com.server.hispath.scholarship.application.dto.ScholarshipContentDto; import com.server.hispath.scholarship.application.dto.ScholarshipDto; import com.server.hispath.scholarship.domain.Scholarship; import com.server.hispath.scholarship.domain.repository.ScholarshipRepository; import com.server.hispath.student.application.StudentService; import com.server.hispath.student.domain.Student; +import com.server.hispath.student.domain.repository.StudentRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,16 +32,16 @@ public class ScholarshipService { private final ScholarshipRepository scholarshipRepository; private final StudentService studentService; private final ActivityRepository activityRepository; + private final StudentRepository studentRepository; @Transactional public Long create(Long studentId, String semester) { Student student = studentService.findById(studentId); - Scholarship existScholarship = scholarshipRepository.findFirstByStudentAndSemester(student, semester); - if (Objects.nonNull(existScholarship)) - scholarshipRepository.delete(existScholarship); + Optional existScholarship = scholarshipRepository.findFirstByStudentAndSemester(student, semester); + existScholarship.ifPresent(scholarshipRepository::delete); - int totalWeight = getTotalWeight(studentId); + int totalWeight = getTotalWeight(student, semester); Scholarship scholarship = Scholarship.builder() .student(student) @@ -48,8 +56,8 @@ public Long create(Long studentId, String semester) { return savedScholarship.getId(); } - private int getTotalWeight(Long studentId) { - return activityRepository.findActivityWithStudents(studentId) + private int getTotalWeight(Student student, String semester) { + return activityRepository.findActivitiesByStudentAndSemester(student, semester) .stream() .map(Activity::getWeight) .reduce(0, Integer::sum); @@ -70,4 +78,63 @@ public List findAllScholarshipStudent(boolean approved, String s .map(ScholarshipDto::of) .collect(Collectors.toList()); } + + @Transactional(readOnly = true) + public ScholarshipDto findScholarshipStudent(Long studentId, String semester) { + Scholarship scholarship = scholarshipRepository.findStudentIdAndSemester(studentId, semester) + .orElseThrow(ScholarshipNotFoundException::new); + return ScholarshipDto.of(scholarship); + } + + @Transactional + public void approveAll(List scholarshipApprovalDtos, String semester) { + validateScholarshipDatas(scholarshipApprovalDtos, semester); + checkDuplicate(scholarshipApprovalDtos); + + scholarshipApprovalDtos.forEach(dto -> { + Student student = studentRepository.findByStudentNum(dto.getStudentNum()) + .orElseThrow(StudentNotFoundException::new); + Scholarship scholarship = scholarshipRepository.findFirstByStudentAndSemester(student, semester) + .orElseThrow(ScholarshipNotFoundException::new); + scholarship.approve(); + }); + + + } + + private void checkDuplicate(List scholarshipApprovalDtos) { + Set set = scholarshipApprovalDtos.stream() + .map(ScholarshipApprovalDto::StudentInfo) + .collect(Collectors.toSet()); + + if (set.size() < scholarshipApprovalDtos.size()) { + throw new ScholarshipDuplicateException(); + } + } + + private boolean validateError(ScholarshipApprovalDto dto, String semester) { + Optional optionalStudent = studentRepository.findByStudentNum(dto.getStudentNum()); + if (optionalStudent.isEmpty()) + return true; + Student student = optionalStudent.get(); + if (!student.isNameMatch(dto.getName())) + return true; + Optional optionalScholarship = scholarshipRepository.findFirstByStudentAndSemester(student, semester); + if (optionalScholarship.isEmpty()) + return true; + Scholarship scholarship = optionalScholarship.get(); + return scholarship.getTotalMileage() != dto.getWeight(); + } + + private void validateScholarshipDatas(List scholarshipApprovalDtos, String semester) { + List errors = scholarshipApprovalDtos.stream() + .filter(dto -> validateError(dto, semester)) + .collect(Collectors.toList()); + if (errors.size() != 0) { + String errorMsg = errors.stream() + .map(ScholarshipApprovalDto::toString) + .collect(Collectors.joining("\n")); + throw new ScholarshipNotMatchException(errorMsg); + } + } } diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipApprovalDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipApprovalDto.java new file mode 100644 index 0000000..d9a56a7 --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipApprovalDto.java @@ -0,0 +1,24 @@ +package com.server.hispath.scholarship.application.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ScholarshipApprovalDto { + private String name; + private String studentNum; + private int weight; + private String result; + + @Override + public String toString() { + return "학생명: " + name + " 학번: " + studentNum + " 전체 가중치: " + weight + " 결과: " + result; + } + + public String StudentInfo(){ + return studentNum + " " + name; + } +} diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java index 0b234fa..7498be3 100644 --- a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java +++ b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java @@ -20,12 +20,13 @@ public class ScholarshipDto { private String major2Name; private String email; private String phone; + private String result; private int totalWeight; public static ScholarshipDto of(Scholarship scholarship) { return new ScholarshipDto(scholarship.getStudent().getName(), scholarship.getStudent().getStudentNum(), scholarship.getSemester(), scholarship.getSDepartment().getName(), scholarship.getSMajor1().getName(), scholarship.getSMajor2().getName(), scholarship.getStudent().getEmail(), - scholarship.getStudent().getPhone(), scholarship.getTotalMileage()); + scholarship.getStudent().getPhone(), scholarship.getResult(), scholarship.getTotalMileage()); } } diff --git a/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java b/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java index d59fc4b..1c11e52 100644 --- a/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java +++ b/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java @@ -49,4 +49,7 @@ public class Scholarship extends BaseEntity { private boolean approved = false; + public void approve(){ + approved = true; + } } diff --git a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java index 77ded49..581d83e 100644 --- a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java +++ b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java @@ -1,6 +1,7 @@ package com.server.hispath.scholarship.domain.repository; import java.util.List; +import java.util.Optional; import com.server.hispath.scholarship.domain.Scholarship; import com.server.hispath.student.domain.Student; @@ -9,7 +10,7 @@ import org.springframework.data.jpa.repository.Query; public interface ScholarshipRepository extends JpaRepository { - Scholarship findFirstByStudentAndSemester(Student student, String semester); + Optional findFirstByStudentAndSemester(Student student, String semester); @Query("select s from Scholarship s " + "join fetch s.student " + @@ -19,5 +20,14 @@ public interface ScholarshipRepository extends JpaRepository "where s.approved = :approved " + "and s.semester = :semester ") List findAllByApprovedAndSemester(boolean approved, String semester); + + @Query("select s from Scholarship s " + + "join fetch s.student " + + "join fetch s.sDepartment " + + "join fetch s.sMajor1 " + + "join fetch s.sMajor2 " + + "where s.student.id = :id " + + "and s.semester = :semester ") + Optional findStudentIdAndSemester(Long id, String semester); } diff --git a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java index b72c251..90e40cb 100644 --- a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java +++ b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java @@ -3,13 +3,23 @@ import java.util.List; import java.util.stream.Collectors; +import com.server.hispath.activity.application.ActivityService; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.docs.ApiDoc; import com.server.hispath.scholarship.application.ScholarshipService; +import com.server.hispath.scholarship.application.dto.ScholarshipDto; import com.server.hispath.scholarship.presentation.request.ScholarshipCURequest; +import com.server.hispath.scholarship.presentation.response.ScholarshipActivityResponse; +import com.server.hispath.scholarship.presentation.response.ScholarshipDetailResponse; import com.server.hispath.scholarship.presentation.response.ScholarshipResponse; +import com.server.hispath.util.ExcelManager; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + import io.swagger.annotations.ApiOperation; @@ -21,6 +31,7 @@ public class ScholarshipController { private final ScholarshipService scholarshipService; + private final ActivityService activityService; @PostMapping("/scholarship") @ApiOperation(value = ApiDoc.SCHOLARSHIP_CREATE) @@ -41,4 +52,24 @@ public ResponseEntity> getScholarshipStudents(@Request .collect(Collectors.toList()); return ResponseEntity.ok(responses); } + + @GetMapping("/scholarship/activities") + @ApiOperation(value = ApiDoc.SCHOLARSHIP_ACTIVITIES) + public ResponseEntity getScholarshipDetailInfo(@RequestParam Long studentId, @RequestParam String semester) { + List scholarshipActivityResponses = activityService.findAllByStudentAndSemster(studentId, semester) + .stream() + .map(ScholarshipActivityResponse::of) + .collect(Collectors.toList()); + ScholarshipDto scholarshipDto = scholarshipService.findScholarshipStudent(studentId, semester); + ScholarshipDetailResponse response = ScholarshipDetailResponse.from(scholarshipDto, scholarshipActivityResponses); + return ResponseEntity.ok(response); + } + + @PutMapping("/scholarship/approval") + @ApiOperation(value = ApiDoc.APPROVE_SCHOLARSHIPS) + public ResponseEntity approveAll(@RequestPart(value = "file", required = false) MultipartFile file, + @RequestPart(value = "semester") String semester) throws Exception { + scholarshipService.approveAll(ExcelManager.getScholarshipApproveDatas(ExcelManager.extract(file)), semester); + return ResponseEntity.ok(null); + } } diff --git a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipActivityResponse.java b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipActivityResponse.java new file mode 100644 index 0000000..9be8357 --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipActivityResponse.java @@ -0,0 +1,27 @@ +package com.server.hispath.scholarship.presentation.response; + +import com.server.hispath.activity.application.dto.ActivityDto; +import com.server.hispath.scholarship.application.dto.ScholarshipDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ScholarshipActivityResponse { + private Long id; + private String categoryName; + private String name; + private String remark; + private String semester; + private int weight; + + public static ScholarshipActivityResponse of(ActivityDto dto){ + return new ScholarshipActivityResponse(dto.getId(), dto.getCategoryDto().getName(), dto.getName(), + dto.getRemark(), dto.getSemester(), dto.getWeight()); + } +} diff --git a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipDetailResponse.java b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipDetailResponse.java new file mode 100644 index 0000000..6ec5f38 --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipDetailResponse.java @@ -0,0 +1,34 @@ +package com.server.hispath.scholarship.presentation.response; + +import java.util.ArrayList; +import java.util.List; + +import com.server.hispath.scholarship.application.dto.ScholarshipDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ScholarshipDetailResponse { + private String name; + private String studentNum; + private String semester; + private String departmentName; + private String major1Name; + private String major2Name; + private String email; + private String phone; + private int totalWeight; + private String result; + private List activities = new ArrayList<>(); + public static ScholarshipDetailResponse from(ScholarshipDto dto, List activities){ + return new ScholarshipDetailResponse(dto.getName(), dto.getStudentNum(), dto.getSemester(), + dto.getDepartmentName(), dto.getMajor1Name(), dto.getMajor2Name(), dto.getEmail(), + dto.getPhone(), dto.getTotalWeight(), dto.getResult(), activities); + } +} diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java index 99deaf9..a6c1115 100644 --- a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java @@ -14,13 +14,22 @@ public interface StudentRepository extends JpaRepository { @Query("select a from Student a " + "left join fetch a.participants as p " + "left join fetch p.activity " + - "where a.id = :id" ) + "where a.id = :id") Optional findActivitiesByStudent(Long id); + Optional findByEmail(String email); @Query("select s from Student s " + "left join fetch s.participants as p " + - "left join fetch p.activity as a " + + "left join fetch p.activity as a " + "where s.id = :id ") Optional findStudentWithActivities(Long id); + + @Query("select s from Student s " + + "left join fetch s.participants as p " + + "left join fetch p.activity as a " + + "left join fetch a.category " + + "where s.id = :id " + + "and a.semester = :semester") + Optional findStudentWithIdAndSemester(Long id, String semester); } diff --git a/src/main/java/com/server/hispath/util/ExcelManager.java b/src/main/java/com/server/hispath/util/ExcelManager.java index e5caf63..abed426 100644 --- a/src/main/java/com/server/hispath/util/ExcelManager.java +++ b/src/main/java/com/server/hispath/util/ExcelManager.java @@ -10,6 +10,7 @@ import com.server.hispath.exception.common.ExcelDataFormatException; import com.server.hispath.exception.common.ExcelFormatException; import com.server.hispath.exception.common.NotExcelExtensionException; +import com.server.hispath.scholarship.application.dto.ScholarshipApprovalDto; import com.server.hispath.student.application.dto.StudentRefDto; import com.server.hispath.student.application.dto.StudentSimpleRefDto; @@ -107,4 +108,21 @@ public static List getStudentDatas(Sheet worksheet) { } return studentRefDtos; } + + public static List getScholarshipApproveDatas(Sheet worksheet){ + List scholarshipDtos = new ArrayList<>(); + for(int i=1; i Date: Mon, 31 Oct 2022 15:37:52 +0900 Subject: [PATCH 069/148] =?UTF-8?q?fix[#60]=20:=20scholarship=20info=20?= =?UTF-8?q?=EC=97=90=20student=20semester=20=EC=B6=94=EA=B0=80=20(#61)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scholarship/application/ScholarshipService.java | 4 +++- .../application/dto/ScholarshipApprovalDto.java | 5 +++-- .../application/dto/ScholarshipContentDto.java | 5 ++++- .../scholarship/application/dto/ScholarshipDto.java | 6 ++++-- .../hispath/scholarship/domain/Scholarship.java | 8 +++++++- .../response/ScholarshipDetailResponse.java | 6 ++++-- .../presentation/response/ScholarshipResponse.java | 3 ++- .../java/com/server/hispath/util/ExcelManager.java | 13 +++++++------ 8 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index b9451f8..ca94889 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -1,6 +1,5 @@ package com.server.hispath.scholarship.application; -import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; @@ -46,6 +45,7 @@ public Long create(Long studentId, String semester) { Scholarship scholarship = Scholarship.builder() .student(student) .semester(semester) + .studentSemester(student.getSemester()) .totalMileage(totalWeight) .sMajor1(student.getMajor1()) .sMajor2(student.getMajor2()) @@ -123,6 +123,8 @@ private boolean validateError(ScholarshipApprovalDto dto, String semester) { if (optionalScholarship.isEmpty()) return true; Scholarship scholarship = optionalScholarship.get(); + if (!scholarship.isStudentSemesterMatch(dto.getStudentSemester())) + return true; return scholarship.getTotalMileage() != dto.getWeight(); } diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipApprovalDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipApprovalDto.java index d9a56a7..4f835e1 100644 --- a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipApprovalDto.java +++ b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipApprovalDto.java @@ -10,15 +10,16 @@ public class ScholarshipApprovalDto { private String name; private String studentNum; + private int studentSemester; private int weight; private String result; @Override public String toString() { - return "학생명: " + name + " 학번: " + studentNum + " 전체 가중치: " + weight + " 결과: " + result; + return "학생명: " + name + " 학번: " + studentNum + " 학생 학기수: " + studentSemester + " 전체 가중치: " + weight + " 결과: " + result; } - public String StudentInfo(){ + public String StudentInfo() { return studentNum + " " + name; } } diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipContentDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipContentDto.java index b228cb3..4fa4846 100644 --- a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipContentDto.java +++ b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipContentDto.java @@ -1,6 +1,7 @@ package com.server.hispath.scholarship.application.dto; import com.server.hispath.scholarship.domain.Scholarship; + import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -11,11 +12,13 @@ public class ScholarshipContentDto { private Long id; private String semester; + private int studentSemester; private int totalMileage; private boolean approved; public static ScholarshipContentDto from(Scholarship scholarship) { - return new ScholarshipContentDto(scholarship.getId(), scholarship.getSemester(), scholarship.getTotalMileage(), scholarship.isApproved()); + return new ScholarshipContentDto(scholarship.getId(), scholarship.getSemester(), + scholarship.getStudentSemester(), scholarship.getTotalMileage(), scholarship.isApproved()); } } diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java index 7498be3..9391629 100644 --- a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java +++ b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java @@ -15,6 +15,7 @@ public class ScholarshipDto { private String name; private String studentNum; private String semester; + private int studentSemester; private String departmentName; private String major1Name; private String major2Name; @@ -25,8 +26,9 @@ public class ScholarshipDto { public static ScholarshipDto of(Scholarship scholarship) { return new ScholarshipDto(scholarship.getStudent().getName(), scholarship.getStudent().getStudentNum(), - scholarship.getSemester(), scholarship.getSDepartment().getName(), scholarship.getSMajor1().getName(), - scholarship.getSMajor2().getName(), scholarship.getStudent().getEmail(), + scholarship.getSemester(), scholarship.getStudentSemester(), scholarship.getSDepartment().getName(), + scholarship.getSMajor1().getName(), scholarship.getSMajor2().getName(), scholarship.getStudent() + .getEmail(), scholarship.getStudent().getPhone(), scholarship.getResult(), scholarship.getTotalMileage()); } } diff --git a/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java b/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java index 1c11e52..b79eb69 100644 --- a/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java +++ b/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java @@ -34,6 +34,8 @@ public class Scholarship extends BaseEntity { @NotNull private String semester; + int studentSemester; + private int totalMileage; @ManyToOne(fetch = FetchType.LAZY) @@ -49,7 +51,11 @@ public class Scholarship extends BaseEntity { private boolean approved = false; - public void approve(){ + public void approve() { approved = true; } + + public boolean isStudentSemesterMatch(int studentSemester) { + return this.studentSemester == studentSemester; + } } diff --git a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipDetailResponse.java b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipDetailResponse.java index 6ec5f38..1b37f0e 100644 --- a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipDetailResponse.java +++ b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipDetailResponse.java @@ -18,6 +18,7 @@ public class ScholarshipDetailResponse { private String name; private String studentNum; private String semester; + private int studentSemester; private String departmentName; private String major1Name; private String major2Name; @@ -26,8 +27,9 @@ public class ScholarshipDetailResponse { private int totalWeight; private String result; private List activities = new ArrayList<>(); - public static ScholarshipDetailResponse from(ScholarshipDto dto, List activities){ - return new ScholarshipDetailResponse(dto.getName(), dto.getStudentNum(), dto.getSemester(), + + public static ScholarshipDetailResponse from(ScholarshipDto dto, List activities) { + return new ScholarshipDetailResponse(dto.getName(), dto.getStudentNum(), dto.getSemester(), dto.getStudentSemester(), dto.getDepartmentName(), dto.getMajor1Name(), dto.getMajor2Name(), dto.getEmail(), dto.getPhone(), dto.getTotalWeight(), dto.getResult(), activities); } diff --git a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java index dad164f..9724ed0 100644 --- a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java +++ b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java @@ -15,6 +15,7 @@ public class ScholarshipResponse { private String name; private String studentNum; private String semester; + private int studentSemester; private String departmentName; private String major1Name; private String major2Name; @@ -24,7 +25,7 @@ public class ScholarshipResponse { public static ScholarshipResponse of(ScholarshipDto dto){ return new ScholarshipResponse(dto.getName(), dto.getStudentNum(), - dto.getSemester(), dto.getDepartmentName(), dto.getMajor1Name(), + dto.getSemester(), dto.getStudentSemester(), dto.getDepartmentName(), dto.getMajor1Name(), dto.getMajor2Name(), dto.getEmail(), dto.getPhone(), dto.getTotalWeight()); } } diff --git a/src/main/java/com/server/hispath/util/ExcelManager.java b/src/main/java/com/server/hispath/util/ExcelManager.java index abed426..d29bd72 100644 --- a/src/main/java/com/server/hispath/util/ExcelManager.java +++ b/src/main/java/com/server/hispath/util/ExcelManager.java @@ -65,7 +65,7 @@ public static List getMActivities(Sheet worksheet) { return mActivityContentDtos; } - public static List getStudentSimpleDatas(Sheet worksheet){ + public static List getStudentSimpleDatas(Sheet worksheet) { List studentRefDtos = new ArrayList<>(); for (int i = 1; i < worksheet.getPhysicalNumberOfRows(); i++) { @@ -109,16 +109,17 @@ public static List getStudentDatas(Sheet worksheet) { return studentRefDtos; } - public static List getScholarshipApproveDatas(Sheet worksheet){ + public static List getScholarshipApproveDatas(Sheet worksheet) { List scholarshipDtos = new ArrayList<>(); - for(int i=1; i Date: Wed, 2 Nov 2022 02:45:25 +0900 Subject: [PATCH 070/148] =?UTF-8?q?[#59]=20:=20=EC=9E=A5=ED=95=99=EA=B8=88?= =?UTF-8?q?=20=EC=88=98=ED=98=9C=20=ED=95=99=EC=83=9D=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20Search=20API=20=EA=B5=AC=ED=98=84=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#59] : Query DSL import * feat[#59] : QueryDSL Config 구현 * feat[#59] : 조건에 따른 장학금 수혜학생 검색 조회 API 구현 --- build.gradle | 9 +++ .../server/hispath/config/QuerydslConfig.java | 20 +++++++ .../java/com/server/hispath/docs/ApiDoc.java | 1 + .../application/ScholarshipService.java | 11 ++++ .../application/dto/SearchRequestDto.java | 16 +++++ .../ScholarshipRepositoryCustom.java | 59 +++++++++++++++++++ .../presentation/ScholarshipController.java | 19 ++++++ 7 files changed, 135 insertions(+) create mode 100644 src/main/java/com/server/hispath/config/QuerydslConfig.java create mode 100644 src/main/java/com/server/hispath/scholarship/application/dto/SearchRequestDto.java create mode 100644 src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java diff --git a/build.gradle b/build.gradle index d4e21ec..91f71fc 100644 --- a/build.gradle +++ b/build.gradle @@ -36,6 +36,15 @@ dependencies { runtimeOnly 'mysql:mysql-connector-java' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' + + implementation 'com.querydsl:querydsl-jpa:5.0.0' + annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jpa" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + implementation "com.querydsl:querydsl-core:5.0.0" + clean { + delete file('src/main/generated') + } } tasks.named('test') { diff --git a/src/main/java/com/server/hispath/config/QuerydslConfig.java b/src/main/java/com/server/hispath/config/QuerydslConfig.java new file mode 100644 index 0000000..53e7f44 --- /dev/null +++ b/src/main/java/com/server/hispath/config/QuerydslConfig.java @@ -0,0 +1,20 @@ +package com.server.hispath.config; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import com.querydsl.jpa.impl.JPAQueryFactory; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QuerydslConfig { + @PersistenceContext + private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory(){ + return new JPAQueryFactory(entityManager); + } +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 756a3b0..9d9f8a5 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -87,4 +87,5 @@ public class ApiDoc { public static final String SCHOLARSHIP_READ_ALL = "장학금 수혜자들 명단 조회"; public static final String SCHOLARSHIP_ACTIVITIES = "장학금 수혜자 정보와 그 활동들 조회"; public static final String APPROVE_SCHOLARSHIPS = "현학기 장학금 승인 명단 엑셀 업로드"; + public static final String SCHOLARSHIP_SEARCH_STUDENT = "장학금 수혜 학생 필터 검색"; } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index ca94889..cbe9359 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -14,8 +14,10 @@ import com.server.hispath.scholarship.application.dto.ScholarshipApprovalDto; import com.server.hispath.scholarship.application.dto.ScholarshipContentDto; import com.server.hispath.scholarship.application.dto.ScholarshipDto; +import com.server.hispath.scholarship.application.dto.SearchRequestDto; import com.server.hispath.scholarship.domain.Scholarship; import com.server.hispath.scholarship.domain.repository.ScholarshipRepository; +import com.server.hispath.scholarship.domain.repository.ScholarshipRepositoryCustom; import com.server.hispath.student.application.StudentService; import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; @@ -29,6 +31,7 @@ @RequiredArgsConstructor public class ScholarshipService { private final ScholarshipRepository scholarshipRepository; + private final ScholarshipRepositoryCustom scholarshipRepositoryCustom; private final StudentService studentService; private final ActivityRepository activityRepository; private final StudentRepository studentRepository; @@ -139,4 +142,12 @@ private void validateScholarshipDatas(List scholarshipAp throw new ScholarshipNotMatchException(errorMsg); } } + + @Transactional(readOnly = true) + public List searchScholarshipStudent(SearchRequestDto dto) { + return scholarshipRepositoryCustom.searchScholarshipStudent(dto) + .stream() + .map(ScholarshipDto::of) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/SearchRequestDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/SearchRequestDto.java new file mode 100644 index 0000000..245902b --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/application/dto/SearchRequestDto.java @@ -0,0 +1,16 @@ +package com.server.hispath.scholarship.application.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class SearchRequestDto { + private String semester; + private String studentSemester; + String department; + String major1; + String major2; +} diff --git a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java new file mode 100644 index 0000000..76c6de6 --- /dev/null +++ b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java @@ -0,0 +1,59 @@ +package com.server.hispath.scholarship.domain.repository; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.server.hispath.scholarship.application.dto.SearchRequestDto; +import com.server.hispath.scholarship.domain.Scholarship; + +import org.springframework.stereotype.Repository; + +import lombok.RequiredArgsConstructor; + +import static com.server.hispath.scholarship.domain.QScholarship.scholarship; + +@Repository +@RequiredArgsConstructor +public class ScholarshipRepositoryCustom { + private final JPAQueryFactory queryFactory; + + public List searchScholarshipStudent(SearchRequestDto dto) { + return queryFactory.select(scholarship) + .distinct() + .from(scholarship) + .leftJoin(scholarship.student) + .leftJoin(scholarship.sDepartment) + .leftJoin(scholarship.sMajor1) + .leftJoin(scholarship.sMajor2) + .where(scholarshipStudentCondition(dto)) + .fetch(); + + } + + public BooleanBuilder scholarshipStudentCondition(SearchRequestDto dto) { + BooleanBuilder booleanBuilder = new BooleanBuilder(); + + if (!Objects.isNull(dto.getSemester())) { + booleanBuilder.and(scholarship.semester.in(dto.getSemester().split(","))); + } + if (!Objects.isNull(dto.getStudentSemester())) { + booleanBuilder.and(scholarship.studentSemester.in(Arrays.stream(dto.getStudentSemester().split(",")) + .map(Integer::parseInt) + .collect(Collectors.toList()))); + } + if (!Objects.isNull(dto.getDepartment())) { + booleanBuilder.and(scholarship.sDepartment.name.in(dto.getDepartment().split(","))); + } + if (!Objects.isNull(dto.getMajor1())) { + booleanBuilder.and(scholarship.sMajor1.name.in(dto.getMajor1().split(","))); + } + if (!Objects.isNull(dto.getMajor2())) { + booleanBuilder.and(scholarship.sMajor2.name.in(dto.getMajor2().split(","))); + } + return booleanBuilder; + } +} diff --git a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java index 90e40cb..2d45c51 100644 --- a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java +++ b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java @@ -4,12 +4,14 @@ import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; + import java.util.List; import java.util.stream.Collectors; import com.server.hispath.docs.ApiDoc; import com.server.hispath.scholarship.application.ScholarshipService; import com.server.hispath.scholarship.application.dto.ScholarshipDto; +import com.server.hispath.scholarship.application.dto.SearchRequestDto; import com.server.hispath.scholarship.presentation.request.ScholarshipCURequest; import com.server.hispath.scholarship.presentation.response.ScholarshipActivityResponse; import com.server.hispath.scholarship.presentation.response.ScholarshipDetailResponse; @@ -72,4 +74,21 @@ public ResponseEntity approveAll(@RequestPart(value = "file", required = f scholarshipService.approveAll(ExcelManager.getScholarshipApproveDatas(ExcelManager.extract(file)), semester); return ResponseEntity.ok(null); } + + @GetMapping("/scholarship/students") + @ApiOperation(value = ApiDoc.SCHOLARSHIP_SEARCH_STUDENT) + public ResponseEntity> searchScholarshipStudents( + @RequestParam(required = false) String semester , + @RequestParam(required = false) String studentSemester, + @RequestParam(required = false) String department, + @RequestParam(required = false) String major1, + @RequestParam(required = false) String major2 + ) { + SearchRequestDto searchRequestDto = new SearchRequestDto(semester, studentSemester, department, major1, major2); + List responses = scholarshipService.searchScholarshipStudent(searchRequestDto) + .stream() + .map(ScholarshipResponse::of) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } } From dd58a3d18d0da32a8cc0367119202882c654a4b5 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Wed, 2 Nov 2022 03:10:47 +0900 Subject: [PATCH 071/148] =?UTF-8?q?[#63]=20:=20=ED=95=99=EC=83=9D=ED=99=9C?= =?UTF-8?q?=EB=8F=99=20=EB=A7=88=EC=9D=BC=EB=A6=AC=EC=A7=80=20=EC=8B=A0?= =?UTF-8?q?=EC=B2=AD,=20=EC=8A=B9=EC=9D=B8,=20=EB=B0=98=EB=A0=A4=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#64)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix[#63] : RequestStatus 변경 - 학생이 등록할 시에 3 (신청안함) - Manager가 마일리지 활동 등록할 시에 1 (승인) - 활동에 대해 마일리지 등록 신청 0 - 이후 관리자가 승인 (with 가중치) , 반려하는 API 구현 예정 * feat[#63] : 학생 활동 마일리지 신청 API 구현 * feat[#63] : activity approve api 구현 * feat[#63] : Activity Reject API 구현 * feat[#63] : activity 승인 시 weight 추가 --- .../activity/application/ActivityService.java | 15 ++++++++++++ .../hispath/activity/domain/Activity.java | 14 ++++++++++- .../presentation/ActivityController.java | 23 +++++++++++++++++++ .../request/ActivityApproveRequest.java | 14 +++++++++++ .../java/com/server/hispath/docs/ApiDoc.java | 5 ++++ 5 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/server/hispath/activity/presentation/request/ActivityApproveRequest.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index 9c30348..4d56c43 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -129,4 +129,19 @@ public List findAllByStudentAndSemster(Long id, String semester) { .map(participant -> ActivityDto.from(participant.getActivity())) .collect(Collectors.toList()); } + + @Transactional + public void apply(Long activityId){ + this.findById(activityId).apply(); + } + + @Transactional + public void approve(Long activityId, int weight){ + this.findById(activityId).approve(); + } + + @Transactional + public void reject(Long activityId){ + this.findById(activityId).reject(); + } } diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 0fb93c3..4e8546d 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -91,7 +91,7 @@ public static Activity from(StudentActivityContentDto dto, Category category) { .semester(dto.getSemester()) .remark(dto.getRemark()) .personal(true) - .requestStatus(0) + .requestStatus(3) .name(dto.getName()) .weight(0) .build(); @@ -156,4 +156,16 @@ public boolean isSameSemester(String semester) { return Objects.equals(this.semester, semester); } + public void apply(){ + this.requestStatus = 0; + } + + public void approve(int weight){ + this.requestStatus = 1; + this.weight = weight; + } + + public void reject(){ + this.requestStatus = 2; + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index e59b481..b7aa2e1 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -11,6 +11,7 @@ import com.server.hispath.activity.application.dto.ActivityDto; import com.server.hispath.activity.application.dto.MStudentActivityDetailDto; import com.server.hispath.activity.application.dto.SemesterDto; +import com.server.hispath.activity.presentation.request.ActivityApproveRequest; import com.server.hispath.activity.presentation.request.ActivityCURequest; import com.server.hispath.activity.presentation.request.StudentActivityCURequest; import com.server.hispath.activity.presentation.response.ActivityParticipantResponse; @@ -25,6 +26,7 @@ import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; +import org.apache.poi.ss.formula.EvaluationName; @RestController @RequiredArgsConstructor @@ -126,4 +128,25 @@ public ResponseEntity> findParticipatedActivit public ResponseEntity findActivtyByStudentId(@PathVariable Long id) { return ResponseEntity.ok(mActivityService.findActivitiesByStudent(id)); } + + @PutMapping("/activity/apply/{id}") + @ApiOperation(value = ApiDoc.ACTIVITY_APPLY) + public ResponseEntity applyActivity(@PathVariable Long id){ + activityService.apply(id); + return ResponseEntity.ok(null); + } + + @PutMapping("/activity/approve/{id}") + @ApiOperation(value = ApiDoc.ACTIVITY_APPROVE) + public ResponseEntity approveActivity(@PathVariable Long id, @RequestBody ActivityApproveRequest request){ + activityService.approve(id, request.getWeight()); + return ResponseEntity.ok(null); + } + + @PutMapping("/activity/reject/{id}") + @ApiOperation(value = ApiDoc.ACTIVITY_REJECT) + public ResponseEntity rejectActivity(@PathVariable Long id){ + activityService.reject(id); + return ResponseEntity.ok(null); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/request/ActivityApproveRequest.java b/src/main/java/com/server/hispath/activity/presentation/request/ActivityApproveRequest.java new file mode 100644 index 0000000..a1a8462 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/request/ActivityApproveRequest.java @@ -0,0 +1,14 @@ +package com.server.hispath.activity.presentation.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ActivityApproveRequest { + private int weight; +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 9d9f8a5..8f0c312 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -28,6 +28,11 @@ public class ApiDoc { public static final String STUDENT_ACTIVITY_READ_SEMESTER = "학생의 참여 활동 학기별 조회"; public static final String SECTION_READ_ALL = "모든 섹션 조회"; public static final String PARTICIPANT_DELETE = "학생 참여 데이터 삭제"; + public static final String ACTIVITY_APPLY = "학생 활동 마일리지 신청"; + public static final String ACTIVITY_APPROVE = "학생 활동 마일리지 승인"; + public static final String ACTIVITY_REJECT = "학생 활동 마일리지 반려"; + + /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; From 77bdcb7ec49e3ecb04927f60235a0e57e67a0f4f Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 2 Nov 2022 03:13:25 +0900 Subject: [PATCH 072/148] hotfix : add weight --- .../server/hispath/activity/application/ActivityService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index 4d56c43..e729ee9 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -137,7 +137,7 @@ public void apply(Long activityId){ @Transactional public void approve(Long activityId, int weight){ - this.findById(activityId).approve(); + this.findById(activityId).approve(weight); } @Transactional From f6cd1fa0501ed75ee771007ef72ff8fb383cd31f Mon Sep 17 00:00:00 2001 From: shinel98 <75024473+shinel98@users.noreply.github.com> Date: Sun, 6 Nov 2022 16:43:22 +0900 Subject: [PATCH 073/148] =?UTF-8?q?test[#]=20:=20git=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EB=8F=99=EC=9E=91=20=ED=99=95=EC=9D=B8=20(#69)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * plz plz plz * branch 하는법 잘하자 인혁아 --- src/main/java/com/server/hispath/docs/ApiDoc.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 8f0c312..fc98b6e 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -93,4 +93,5 @@ public class ApiDoc { public static final String SCHOLARSHIP_ACTIVITIES = "장학금 수혜자 정보와 그 활동들 조회"; public static final String APPROVE_SCHOLARSHIPS = "현학기 장학금 승인 명단 엑셀 업로드"; public static final String SCHOLARSHIP_SEARCH_STUDENT = "장학금 수혜 학생 필터 검색"; -} \ No newline at end of file + public static final String InHyeok = "제발 하라는 대로 하자 dev branch에서 dev 풀 받고, 다시 너의 브렌치로 이동해서 git merge dev 후 git push origin 너브랜체 그리고 pull request 만들기 " +} From 084cfe254d5c3304841ad4aa94ddeb988b0c3bbb Mon Sep 17 00:00:00 2001 From: shinel98 <75024473+shinel98@users.noreply.github.com> Date: Sun, 6 Nov 2022 16:44:07 +0900 Subject: [PATCH 074/148] =?UTF-8?q?Revert=20"test[#]=20:=20git=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=8F=99=EC=9E=91=20=ED=99=95=EC=9D=B8=20(#69)"=20?= =?UTF-8?q?(#70)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f6cd1fa0501ed75ee771007ef72ff8fb383cd31f. --- src/main/java/com/server/hispath/docs/ApiDoc.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index fc98b6e..8f0c312 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -93,5 +93,4 @@ public class ApiDoc { public static final String SCHOLARSHIP_ACTIVITIES = "장학금 수혜자 정보와 그 활동들 조회"; public static final String APPROVE_SCHOLARSHIPS = "현학기 장학금 승인 명단 엑셀 업로드"; public static final String SCHOLARSHIP_SEARCH_STUDENT = "장학금 수혜 학생 필터 검색"; - public static final String InHyeok = "제발 하라는 대로 하자 dev branch에서 dev 풀 받고, 다시 너의 브렌치로 이동해서 git merge dev 후 git push origin 너브랜체 그리고 pull request 만들기 " -} +} \ No newline at end of file From cca06c5d40008860e6287a646c55c397a718788f Mon Sep 17 00:00:00 2001 From: shinel98 <75024473+shinel98@users.noreply.github.com> Date: Sun, 6 Nov 2022 16:45:45 +0900 Subject: [PATCH 075/148] =?UTF-8?q?test[#]=20:=20github=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=20(#71)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * plz plz plz --- src/main/java/com/server/hispath/docs/ApiDoc.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 8f0c312..fc98b6e 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -93,4 +93,5 @@ public class ApiDoc { public static final String SCHOLARSHIP_ACTIVITIES = "장학금 수혜자 정보와 그 활동들 조회"; public static final String APPROVE_SCHOLARSHIPS = "현학기 장학금 승인 명단 엑셀 업로드"; public static final String SCHOLARSHIP_SEARCH_STUDENT = "장학금 수혜 학생 필터 검색"; -} \ No newline at end of file + public static final String InHyeok = "제발 하라는 대로 하자 dev branch에서 dev 풀 받고, 다시 너의 브렌치로 이동해서 git merge dev 후 git push origin 너브랜체 그리고 pull request 만들기 " +} From 3b3f4f91f94d36deafa5aecb3e9910336402fbbd Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sun, 6 Nov 2022 17:51:40 +0900 Subject: [PATCH 076/148] =?UTF-8?q?[#72]=20:=20=ED=99=9C=EB=8F=99=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#72] : 활동 상세조회 API 구현 * feat[#72] : Activity 단일 상세조회 API 구현 --- .../activity/application/ActivityService.java | 22 ++++++++++++++++--- .../domain/repository/ActivityRepository.java | 1 + .../presentation/ActivityController.java | 18 ++++++++++----- .../java/com/server/hispath/docs/ApiDoc.java | 3 ++- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index e729ee9..f87daa8 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -1,6 +1,7 @@ package com.server.hispath.activity.application; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import com.server.hispath.activity.application.dto.*; @@ -120,6 +121,21 @@ public List findAllParticipantActivites(Long id, String .collect(Collectors.toList()); } + @Transactional(readOnly = true) + public ActivityParticipantDto findParticipantActivityById(Long studentId, Long activityId) { + Activity activity = activityRepository.findActivityWithStudents(activityId) + .orElseThrow(ActivityNotFoundException::new); + Student student = studentRepository.findById(studentId) + .orElseThrow(StudentNotFoundException::new); + Participant participant = activity.getParticipants() + .stream() + .filter(p -> p.isSameStudent(student)) + .findFirst() + .orElseThrow(ParticipantNotFoundException::new); + return ActivityParticipantDto.of(participant); + + } + @Transactional(readOnly = true) public List findAllByStudentAndSemster(Long id, String semester) { Student student = studentRepository.findStudentWithIdAndSemester(id, semester) @@ -131,17 +147,17 @@ public List findAllByStudentAndSemster(Long id, String semester) { } @Transactional - public void apply(Long activityId){ + public void apply(Long activityId) { this.findById(activityId).apply(); } @Transactional - public void approve(Long activityId, int weight){ + public void approve(Long activityId, int weight) { this.findById(activityId).approve(weight); } @Transactional - public void reject(Long activityId){ + public void reject(Long activityId) { this.findById(activityId).reject(); } } diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java index 8d0a9df..e5e62a9 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -30,4 +30,5 @@ public interface ActivityRepository extends JpaRepository { List findAllBySemesterAndRequestStatus(String semester, int requestStatus); List findAllByRequestStatus(int requestStatus); + } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index b7aa2e1..074b155 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -85,8 +85,8 @@ public ResponseEntity delete(@PathVariable Long id) { public ResponseEntity> findAllBySemester() { List semesterDtos = activityService.bringSemester(); List responses = semesterDtos.stream() - .map(SemesterResponse::from) - .collect(Collectors.toList()); + .map(SemesterResponse::from) + .collect(Collectors.toList()); return ResponseEntity.ok(responses); } @@ -116,6 +116,7 @@ public ResponseEntity updateStudentActivity(@PathVa @GetMapping("/student-activities/{id}") @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_READ_SEMESTER) public ResponseEntity> findParticipatedActivities(@PathVariable Long id, @RequestParam String semester, @RequestParam String section) { + // ToDo Student ID 관련해서는 나중에 Login 처리하기 List responses = activityService.findAllParticipantActivites(id, semester, section) .stream() .map(ActivityParticipantResponse::of) @@ -131,22 +132,29 @@ public ResponseEntity findActivtyByStudentId(@PathVar @PutMapping("/activity/apply/{id}") @ApiOperation(value = ApiDoc.ACTIVITY_APPLY) - public ResponseEntity applyActivity(@PathVariable Long id){ + public ResponseEntity applyActivity(@PathVariable Long id) { activityService.apply(id); return ResponseEntity.ok(null); } @PutMapping("/activity/approve/{id}") @ApiOperation(value = ApiDoc.ACTIVITY_APPROVE) - public ResponseEntity approveActivity(@PathVariable Long id, @RequestBody ActivityApproveRequest request){ + public ResponseEntity approveActivity(@PathVariable Long id, @RequestBody ActivityApproveRequest request) { activityService.approve(id, request.getWeight()); return ResponseEntity.ok(null); } @PutMapping("/activity/reject/{id}") @ApiOperation(value = ApiDoc.ACTIVITY_REJECT) - public ResponseEntity rejectActivity(@PathVariable Long id){ + public ResponseEntity rejectActivity(@PathVariable Long id) { activityService.reject(id); return ResponseEntity.ok(null); } + + @GetMapping("/activity-detail/{activityId}") + @ApiOperation(value = ApiDoc.ACTIVITY_STUDENT_DETAIL) + public ResponseEntity findParticipantActivityById(@PathVariable Long activityId) { + // ToDo StudentId 는 나중에 로그인으로 바꿈 + return ResponseEntity.ok(ActivityParticipantResponse.of(activityService.findParticipantActivityById(1L, activityId))); + } } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index fc98b6e..8e6cf7b 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -31,6 +31,7 @@ public class ApiDoc { public static final String ACTIVITY_APPLY = "학생 활동 마일리지 신청"; public static final String ACTIVITY_APPROVE = "학생 활동 마일리지 승인"; public static final String ACTIVITY_REJECT = "학생 활동 마일리지 반려"; + public static final String ACTIVITY_STUDENT_DETAIL = "학생 개인 활동 상세 조회"; /* Category 관련 API 명세 */ @@ -93,5 +94,5 @@ public class ApiDoc { public static final String SCHOLARSHIP_ACTIVITIES = "장학금 수혜자 정보와 그 활동들 조회"; public static final String APPROVE_SCHOLARSHIPS = "현학기 장학금 승인 명단 엑셀 업로드"; public static final String SCHOLARSHIP_SEARCH_STUDENT = "장학금 수혜 학생 필터 검색"; - public static final String InHyeok = "제발 하라는 대로 하자 dev branch에서 dev 풀 받고, 다시 너의 브렌치로 이동해서 git merge dev 후 git push origin 너브랜체 그리고 pull request 만들기 " + public static final String InHyeok = "제발 하라는 대로 하자 dev branch에서 dev 풀 받고, 다시 너의 브렌치로 이동해서 git merge dev 후 git push origin 너브랜체 그리고 pull request 만들기 "; } From d0bea0e803b27cc83c6724de30dd4473766ef1c5 Mon Sep 17 00:00:00 2001 From: shinel98 <75024473+shinel98@users.noreply.github.com> Date: Sun, 6 Nov 2022 17:54:41 +0900 Subject: [PATCH 077/148] =?UTF-8?q?git=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=20(#75)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/MActivityService.java | 13 +++++++++---- .../presentation/ActivityController.java | 7 +++++++ .../presentation/MActivityController.java | 18 ++++++++++++++---- .../java/com/server/hispath/docs/ApiDoc.java | 4 +++- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index 9bb8011..41fa947 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -3,10 +3,7 @@ import java.util.List; import java.util.stream.Collectors; -import com.server.hispath.activity.application.dto.ActivityDto; -import com.server.hispath.activity.application.dto.MActivityContentDto; -import com.server.hispath.activity.application.dto.MActivityDetailDto; -import com.server.hispath.activity.application.dto.MStudentActivityDetailDto; +import com.server.hispath.activity.application.dto.*; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.category.application.CategoryService; @@ -117,4 +114,12 @@ public void deleteParticipant(Long studentId, Long activityId) { .orElseThrow(ParticipantNotFoundException::new) .deleteContent(); } + + @Transactional + public List findSemestersById(Long studentId) { + Student student = studentRepository.findActivitiesByStudent(studentId).orElseThrow(StudentNotFoundException::new); + List semesters = student.getParticipants() + .stream().map(participant -> {return SemesterDto.from(participant.getActivity().getSemester());}).distinct().collect(Collectors.toList()); + return semesters; + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index 074b155..1e14f09 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -151,10 +151,17 @@ public ResponseEntity rejectActivity(@PathVariable Long id) { return ResponseEntity.ok(null); } + + @GetMapping("/studentactivity/{id}") + @ApiOperation(value = ApiDoc.STUDENT_MILEAGE_READ) + public ResponseEntity findActivityByStudentId(@PathVariable Long id) { + return ResponseEntity.ok(mActivityService.findActivitiesByStudent(id)); + } @GetMapping("/activity-detail/{activityId}") @ApiOperation(value = ApiDoc.ACTIVITY_STUDENT_DETAIL) public ResponseEntity findParticipantActivityById(@PathVariable Long activityId) { // ToDo StudentId 는 나중에 로그인으로 바꿈 return ResponseEntity.ok(ActivityParticipantResponse.of(activityService.findParticipantActivityById(1L, activityId))); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 8cc8983..2fc5ae0 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -5,14 +5,12 @@ import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.MActivityService; -import com.server.hispath.activity.application.dto.ActivityDto; -import com.server.hispath.activity.application.dto.MActivityContentDto; -import com.server.hispath.activity.application.dto.MActivityDetailDto; -import com.server.hispath.activity.application.dto.MStudentActivityDetailDto; +import com.server.hispath.activity.application.dto.*; import com.server.hispath.activity.presentation.request.MActivityCURequest; import com.server.hispath.activity.presentation.request.MParticipantRequest; import com.server.hispath.activity.presentation.request.MStudentRegisterRequest; import com.server.hispath.activity.presentation.response.ActivityResponse; +import com.server.hispath.activity.presentation.response.SemesterResponse; import com.server.hispath.docs.ApiDoc; import com.server.hispath.student.application.StudentService; import com.server.hispath.student.application.dto.StudentSimpleRefDto; @@ -121,4 +119,16 @@ public ResponseEntity findMileageActivityById(@PathVariable public ResponseEntity findActivtyByStudentId(@PathVariable Long id) { return ResponseEntity.ok(mActivityService.findActivitiesByStudent(id)); } + + @GetMapping("/semester/{id}") + @ApiOperation(value = ApiDoc.STUDENT_READ_SEMESTER) + public ResponseEntity> findSemestersById(@PathVariable Long id) { + List semesters = mActivityService.findSemestersById(id); + List responses = semesters.stream() + .map(SemesterResponse::from) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } + + } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 8e6cf7b..a1e40e3 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -23,6 +23,7 @@ public class ApiDoc { public static final String ACTIVITY_STUDENT_DELETE = "마일리지 활동 학생 참가 정보 삭제"; public static final String MILEAGE_READ = "단일 마일리지 활동 조회"; public static final String STUDENT_MILEAGE_READ = "학생별 마일리지 활동 조회"; + public static final String STUDENT_READ_SEMESTER = "학생별 활동 학기 조회"; public static final String STUDENT_ACTIVITY_CREATE = "학생의 개인 활동 생성"; public static final String STUDENT_ACTIVITY_UPDATE = "학생의 참여 활동 수정"; public static final String STUDENT_ACTIVITY_READ_SEMESTER = "학생의 참여 활동 학기별 조회"; @@ -94,5 +95,6 @@ public class ApiDoc { public static final String SCHOLARSHIP_ACTIVITIES = "장학금 수혜자 정보와 그 활동들 조회"; public static final String APPROVE_SCHOLARSHIPS = "현학기 장학금 승인 명단 엑셀 업로드"; public static final String SCHOLARSHIP_SEARCH_STUDENT = "장학금 수혜 학생 필터 검색"; - public static final String InHyeok = "제발 하라는 대로 하자 dev branch에서 dev 풀 받고, 다시 너의 브렌치로 이동해서 git merge dev 후 git push origin 너브랜체 그리고 pull request 만들기 "; + public static final String InHyeok = "제발 하라는 대로 하자 dev branch에서 dev 풀 받고, 다시 너의 브렌치로 이동해서 git merge dev 후 git push origin 너브랜체 그리고 pull request 만들기 "; + } From 95231c36a2ae8df82776c6a53b2856bf75d0a143 Mon Sep 17 00:00:00 2001 From: Songdabin Date: Sun, 6 Nov 2022 20:56:07 +0900 Subject: [PATCH 078/148] =?UTF-8?q?=EC=84=9C=EB=B2=84=20=EC=A4=91=EC=B2=A9?= =?UTF-8?q?=20API=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/activity/presentation/ActivityController.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index 1e14f09..e5454ea 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -152,11 +152,7 @@ public ResponseEntity rejectActivity(@PathVariable Long id) { } - @GetMapping("/studentactivity/{id}") - @ApiOperation(value = ApiDoc.STUDENT_MILEAGE_READ) - public ResponseEntity findActivityByStudentId(@PathVariable Long id) { - return ResponseEntity.ok(mActivityService.findActivitiesByStudent(id)); - } + @GetMapping("/activity-detail/{activityId}") @ApiOperation(value = ApiDoc.ACTIVITY_STUDENT_DETAIL) public ResponseEntity findParticipantActivityById(@PathVariable Long activityId) { From d465d70420fbf6b88cce28df939abfbef8335440 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Mon, 7 Nov 2022 21:51:27 +0900 Subject: [PATCH 079/148] =?UTF-8?q?Controller=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=84=A3=EA=B8=B0=20=EA=B5=AC=ED=98=84=20(#77)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/hispath/common/TestController.java | 981 ++++++++++++++++-- 1 file changed, 879 insertions(+), 102 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 1238317..7692427 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -3,6 +3,7 @@ import java.time.LocalDate; import java.time.Month; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -66,10 +67,11 @@ public ResponseEntity initAll() { saveDepartment(); saveStudent(); saveManager(); - saveNotice(); - saveActivities(); - saveParticipant(); - saveResumes(); + // saveNotice(); +// saveActivities(); +// saveParticipant(); +// saveScholarship(); + // saveResumes(); return ResponseEntity.ok(null); } @@ -148,20 +150,48 @@ public ResponseEntity initResume() { @GetMapping("init/scholarship") public ResponseEntity initScholarship() { - scholarshipService.create(1L, "2022-2"); - scholarshipService.create(2L, "2022-2"); - scholarshipService.create(3L, "2022-2"); - scholarshipService.create(4L, "2022-2"); - scholarshipService.create(5L, "2022-2"); - scholarshipService.create(6L, "2022-2"); - scholarshipService.create(7L, "2022-2"); - scholarshipService.create(8L, "2022-2"); - scholarshipService.create(9L, "2022-2"); - scholarshipService.create(9L, "2022-2"); + saveScholarship(); return ResponseEntity.ok(null); } + private void saveScholarship() { + List students = studentRepository.findAll(); + + List studentIds2022_2 = students.stream() + .map(Student::getId) + .collect(Collectors.toList()); + Collections.shuffle(studentIds2022_2); + int num2022_2 = getRandomNum(students.size() - 10, students.size()); + studentIds2022_2.subList(0, num2022_2) + .forEach(id -> { + scholarshipService.create(id, "2022-2"); + }); + + + List studentIds2022_1 = students.stream() + .map(Student::getId) + .collect(Collectors.toList()); + Collections.shuffle(studentIds2022_1); + int num2022_1 = getRandomNum(students.size() - 10, students.size()); + studentIds2022_1.subList(0, num2022_1) + .forEach(id -> { + scholarshipService.create(id, "2022-1"); + }); + + + List studentIds2021_2 = students.stream() + .map(Student::getId) + .collect(Collectors.toList()); + Collections.shuffle(studentIds2021_2); + int num2021_2 = getRandomNum(students.size() - 10, students.size()); + studentIds2021_2.subList(0, num2021_2) + .forEach(id -> { + scholarshipService.create(id, "2021-2"); + }); + + } + private void saveResumes() { Student student = studentService.findById(1L); resumeRepository.save(Resume.builder() @@ -197,18 +227,27 @@ private void saveResumes() { } + public int getRandomNum(int start, int end) { + // Start 에서 End까지의 랜덤 수 출력 + return (int) (Math.random() * end - start) + start; + } + + public void saveParticipant() { List activities = activityRepository.findAll(); List students = studentRepository.findAll(); - activities.forEach(activity -> { - studentService.registerParticipants(activity.getId(), - students.stream().map(student -> { - return new StudentSimpleRefDto(student.getStudentNum(), student.getName()); - }) - .collect(Collectors.toList())); + int num = getRandomNum(15, students.size()); + List refStudent = students.stream() + .map(student -> { + return new StudentSimpleRefDto(student.getStudentNum(), student.getName()); + }) + .collect(Collectors.toList()); + + Collections.shuffle(refStudent); + studentService.registerParticipants(activity.getId(), refStudent.subList(0, num)); activity.updateStudentRegister(); }); @@ -216,45 +255,86 @@ public void saveParticipant() { private void saveManager() { managerRepository.save(Manager.builder() - .name("Adam") - .email("Adams@handong.ac.kr") + .name("김광 교수님") + .email("kkim@handong.ac.kr") .department("CSEE") .approved(true).build()); managerRepository.save(Manager.builder() - .name("Boyci") - .email("BCI@handong.ac.kr") - .department("GLS") + .name("장소연 교수님") + .email("jerry1004@handong.ac.kr") + .department("CSEE") .approved(true).build()); managerRepository.save(Manager.builder() - .name("Charlie") - .email("Chars@handong.ac.kr") - .department("ME") + .name("장기려 박사님") + .email("janggiryeo@handong.ac.kr") + .department("JGR") .approved(true).build()); managerRepository.save(Manager.builder() - .name("David") - .email("Dvd@handong.ac.kr") - .department("CSEE") + .name("최도성 총장님") + .email("cds@handong.ac.kr") + .department("HGU") .approved(true).build()); managerRepository.save(Manager.builder() - .name("Ethen") - .email("Eth@handong.ac.kr") - .department("GLS") + .name("최경현 선생님") + .email("cgh@handong.ac.kr") + .department("SW") .approved(false).build()); managerRepository.save(Manager.builder() - .name("Jenny") - .email("jenny@handong.ac.kr") - .department("CUD") + .name("이윤정 선생님") + .email("lyj@handong.ac.kr") + .department("SW") .approved(false).build()); managerRepository.save(Manager.builder() - .name("Lucy") - .email("lucc@handong.ac.kr") - .department("CSEE") + .name("이미나 선생님") + .email("lmn@handong.ac.kr") + .department("SW") + .approved(true).build()); + managerRepository.save(Manager.builder() + .name("안병웅") + .email("BW_Ahn@handong.ac.kr") + .department("전산전자공학부") + .approved(true).build()); + + managerRepository.save(Manager.builder() + .name("박성진") + .email("JakePark@handong.ac.kr") + .department("글로벌리더쉽학부") + .approved(true).build()); + + managerRepository.save(Manager.builder() + .name("홍성헌") + .email("lukehongg@handong.ac.kr") + .department("전산전자공학부") + .approved(true).build()); + + managerRepository.save(Manager.builder() + .name("이인혁") + .email("Bruse@handong.ac.kr") + .department("ICT융합학부") + .approved(true).build()); + + managerRepository.save(Manager.builder() + .name("정수산나") + .email("Sanna@handong.ac.kr") + .department("경영경제학부") + .approved(false).build()); + + managerRepository.save(Manager.builder() + .name("정석민") + .email("PeterJung@handong.ac.kr") + .department("글로벌리더쉽학부") + .approved(false).build()); + + managerRepository.save(Manager.builder() + .name("송다빈") + .email("Emerson@handong.ac.kr") + .department("전산전자공학부") .approved(true).build()); } @@ -357,6 +437,97 @@ private void saveNotice() { private void saveStudent() { + + studentRepository.save(Student.builder() + .name("박성진") + .department(departementRepository.findByName("전산전자")) + .studentNum("21700266") + .semester(8) + .major1(majorRepository.findByName("컴퓨터공학심화전공")) + .major2(majorRepository.findByName("-")) + .phone("010-9484-4321") + .email("david@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@davidpiao.github") + .loginCnt(0L) + .readme("david's readme") + .build()); + studentRepository.save(Student.builder() + .name("안병웅") + .department(departementRepository.findByName("생명과학")) + .studentNum("21600000") + .semester(6) + .major1(majorRepository.findByName("생명과학전공")) + .major2(majorRepository.findByName("-")) + .phone("010-1623-1512") + .email("mh03@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wooong.github") + .loginCnt(0L) + .readme("an's readme") + .build()); + studentRepository.save(Student.builder() + .name("홍성헌") + .department(departementRepository.findByName("커뮤니케이션")) + .studentNum("21800929") + .semester(8) + .major1(majorRepository.findByName("공연영상학전공")) + .major2(majorRepository.findByName("언로정보학전공")) + .phone("010-1623-3322") + .email("hong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@hong.github") + .loginCnt(0L) + .readme("hong's readme") + .build()); + studentRepository.save(Student.builder() + .name("이인혁") + .department(departementRepository.findByName("기계제어")) + .studentNum("21700032") + .semester(5) + .major1(majorRepository.findByName("전자제어공학전공")) + .major2(majorRepository.findByName("기계공학전공")) + .phone("010-4983-6555") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); + studentRepository.save(Student.builder() + .name("정석민") + .department(departementRepository.findByName("콘텐츠융합디자인")) + .studentNum("22000432") + .semester(3) + .major1(majorRepository.findByName("시각디자인전공")) + .major2(majorRepository.findByName("-")) + .phone("010-4983-6555") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); + studentRepository.save(Student.builder() + .name("송다빈") + .department(departementRepository.findByName("법학부")) + .studentNum("22000332") + .semester(3) + .major1(majorRepository.findByName("US & International Law")) + .major2(majorRepository.findByName("한국법전공")) + .phone("010-7788-0142") + .email("song@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@song.github") + .loginCnt(0L) + .readme("song's readme") + .build()); studentRepository.save(Student.builder() .name("김한동") .department(departementRepository.findByName("전산전자")) @@ -464,7 +635,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("마한동") - .department(departementRepository.findByName("제품디자인전공")) + .department(departementRepository.findByName("콘텐츠융합디자인")) .studentNum("22200007") .semester(4) .major1(majorRepository.findByName("컴퓨터공학전공")) @@ -507,67 +678,673 @@ private void saveStudent() { .loginCnt(0L) .readme("jin's readme") .build()); - } - - private void saveCategory() { - categoryRepository.save(Category.builder() - .name("전공마일리지") - .build()); - categoryRepository.save(Category.builder() - .name("산학마일리지") - .build()); - categoryRepository.save(Category.builder() - .name("비교과-연구활동") - .build()); - categoryRepository.save(Category.builder() - .name("비교과-특강참여") - .build()); - categoryRepository.save(Category.builder() - .name("비교과-행사참여") - .build()); - categoryRepository.save(Category.builder() - .name("비교과-학회할동") - .build()); - categoryRepository.save(Category.builder() - .name("기타") - .build()); - } - - - private void saveDepartment() { - departementRepository.save(Department.builder() - .name("전산전자") - .build()); - departementRepository.save(Department.builder() - .name("국제어문") - .build()); - departementRepository.save(Department.builder() - .name("경영경제") - .build()); - departementRepository.save(Department.builder() - .name("법학부") - .build()); - departementRepository.save(Department.builder() - .name("커뮤니케이션") - .build()); - departementRepository.save(Department.builder() - .name("상담복지") - .build()); - departementRepository.save(Department.builder() - .name("공간환경시스템") - .build()); - departementRepository.save(Department.builder() - .name("콘텐츠융합디자인") - .build()); - departementRepository.save(Department.builder() - .name("기계제어") - .build()); - departementRepository.save(Department.builder() - .name("ICT창업학부") - .build()); - departementRepository.save(Department.builder() - .name("기계제어") - .build()); + studentRepository.save(Student.builder() + .name("김건휘") + .department(departementRepository.findByName("전산전자")) + .studentNum("21700234") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("생명과학전공")) + .phone("010-1234-1234") + .email("kim@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@kim.github") + .loginCnt(0L) + .readme("kim's readme") + .build()); + studentRepository.save(Student.builder() + .name("이도경") + .department(departementRepository.findByName("국제어문")) + .studentNum("21200012") + .semester(9) + .major1(majorRepository.findByName("국제지역학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1234-5678") + .email("park@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@park.github") + .loginCnt(0L) + .readme("park's readme") + .build()); + studentRepository.save(Student.builder() + .name("정민수") + .department(departementRepository.findByName("경영경제")) + .studentNum("22200032") + .semester(5) + .major1(majorRepository.findByName("경영학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-6655-4232") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@lee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); + studentRepository.save(Student.builder() + .name("조수아") + .department(departementRepository.findByName("법학부")) + .studentNum("21600223") + .semester(5) + .major1(majorRepository.findByName("한국법전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-9292-9292") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); + studentRepository.save(Student.builder() + .name("김빛나리") + .department(departementRepository.findByName("커뮤니케이션")) + .studentNum("22200023") + .semester(3) + .major1(majorRepository.findByName("공연영상학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2332-4333") + .email("woo@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@woo.github") + .loginCnt(0L) + .readme("woo's readme") + .build()); + studentRepository.save(Student.builder() + .name("김혜린") + .department(departementRepository.findByName("상담복지")) + .studentNum("21900021") + .semester(4) + .major1(majorRepository.findByName("사회복지학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4444-1234") + .email("wi@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wi.github") + .loginCnt(0L) + .readme("wi's readme") + .build()); + studentRepository.save(Student.builder() + .name("이소희") + .department(departementRepository.findByName("공간환경시스템")) + .studentNum("21800002") + .semester(9) + .major1(majorRepository.findByName("도시환경공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-3221-6665") + .email("ha@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ha.github") + .loginCnt(0L) + .readme("ha's readme") + .build()); + studentRepository.save(Student.builder() + .name("이소연") + .department(departementRepository.findByName("콘텐츠융합디자인")) + .studentNum("21400025") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4211-1123") + .email("ma@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ma.github") + .loginCnt(0L) + .readme("ma's readme") + .build()); + studentRepository.save(Student.builder() + .name("이동영") + .department(departementRepository.findByName("기계제어")) + .studentNum("21100234") + .semester(10) + .major1(majorRepository.findByName("기계공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2311-9992") + .email("yu@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@yu.github") + .loginCnt(0L) + .readme("yu's readme") + .build()); + studentRepository.save(Student.builder() + .name("이연진") + .department(departementRepository.findByName("ICT창업학부")) + .studentNum("21800012") + .semester(9) + .major1(majorRepository.findByName("ICT 융합전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1234-0494") + .email("jin@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jin.github") + .loginCnt(0L) + .readme("jin's readme") + .build()); + studentRepository.save(Student.builder() + .name("김시온") + .department(departementRepository.findByName("전산전자")) + .studentNum("22100032") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("생명과학전공")) + .phone("010-3232-6767") + .email("kim@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@kim.github") + .loginCnt(0L) + .readme("kim's readme") + .build()); + studentRepository.save(Student.builder() + .name("황유민") + .department(departementRepository.findByName("국제어문")) + .studentNum("21600432") + .semester(1) + .major1(majorRepository.findByName("국제지역학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4322-9009") + .email("park@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@park.github") + .loginCnt(0L) + .readme("park's readme") + .build()); + studentRepository.save(Student.builder() + .name("엄서영") + .department(departementRepository.findByName("경영경제")) + .studentNum("22000231") + .semester(5) + .major1(majorRepository.findByName("경영학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-6653-4231") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@lee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); + studentRepository.save(Student.builder() + .name("이찬유") + .department(departementRepository.findByName("법학부")) + .studentNum("21600423") + .semester(5) + .major1(majorRepository.findByName("한국법전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-9292-9232") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); + studentRepository.save(Student.builder() + .name("천그루") + .department(departementRepository.findByName("커뮤니케이션")) + .studentNum("22200026") + .semester(3) + .major1(majorRepository.findByName("공연영상학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2312-4343") + .email("woo@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@woo.github") + .loginCnt(0L) + .readme("woo's readme") + .build()); + studentRepository.save(Student.builder() + .name("이하민") + .department(departementRepository.findByName("상담복지")) + .studentNum("21900032") + .semester(4) + .major1(majorRepository.findByName("사회복지학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4444-4234") + .email("wi@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wi.github") + .loginCnt(0L) + .readme("wi's readme") + .build()); + studentRepository.save(Student.builder() + .name("박관희") + .department(departementRepository.findByName("공간환경시스템")) + .studentNum("21800232") + .semester(9) + .major1(majorRepository.findByName("도시환경공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-3221-6365") + .email("ha@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ha.github") + .loginCnt(0L) + .readme("ha's readme") + .build()); + studentRepository.save(Student.builder() + .name("현요섭") + .department(departementRepository.findByName("콘텐츠융합디자인")) + .studentNum("21400325") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4211-1673") + .email("ma@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ma.github") + .loginCnt(0L) + .readme("ma's readme") + .build()); + studentRepository.save(Student.builder() + .name("이찬호") + .department(departementRepository.findByName("기계제어")) + .studentNum("21100734") + .semester(10) + .major1(majorRepository.findByName("기계공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2911-9192") + .email("yu@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@yu.github") + .loginCnt(0L) + .readme("yu's readme") + .build()); + studentRepository.save(Student.builder() + .name("아무개") + .department(departementRepository.findByName("ICT창업학부")) + .studentNum("22200012") + .semester(9) + .major1(majorRepository.findByName("ICT 융합전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4321-1275") + .email("jin@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jin.github") + .loginCnt(0L) + .readme("jin's readme") + .build()); + studentRepository.save(Student.builder() + .name("김요나") + .department(departementRepository.findByName("전산전자")) + .studentNum("21100032") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("생명과학전공")) + .phone("010-6731-1423") + .email("kim@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@kim.github") + .loginCnt(0L) + .readme("kim's readme") + .build()); + studentRepository.save(Student.builder() + .name("박도마") + .department(departementRepository.findByName("국제어문")) + .studentNum("21900432") + .semester(1) + .major1(majorRepository.findByName("국제지역학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4222-3009") + .email("park@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@park.github") + .loginCnt(0L) + .readme("park's readme") + .build()); + studentRepository.save(Student.builder() + .name("이배드로") + .department(departementRepository.findByName("경영경제")) + .studentNum("22000331") + .semester(5) + .major1(majorRepository.findByName("경영학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-6653-9991") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@lee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); + studentRepository.save(Student.builder() + .name("곽마태") + .department(departementRepository.findByName("법학부")) + .studentNum("21200423") + .semester(5) + .major1(majorRepository.findByName("한국법전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1292-9132") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); + studentRepository.save(Student.builder() + .name("기운찬") + .department(departementRepository.findByName("커뮤니케이션")) + .studentNum("22100027") + .semester(3) + .major1(majorRepository.findByName("공연영상학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2112-4243") + .email("woo@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@woo.github") + .loginCnt(0L) + .readme("woo's readme") + .build()); + studentRepository.save(Student.builder() + .name("곤잘레스") + .department(departementRepository.findByName("상담복지")) + .studentNum("21900112") + .semester(4) + .major1(majorRepository.findByName("사회복지학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1144-4214") + .email("wi@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wi.github") + .loginCnt(0L) + .readme("wi's readme") + .build()); + studentRepository.save(Student.builder() + .name("다비드") + .department(departementRepository.findByName("공간환경시스템")) + .studentNum("21800332") + .semester(9) + .major1(majorRepository.findByName("도시환경공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-3331-6365") + .email("ha@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ha.github") + .loginCnt(0L) + .readme("ha's readme") + .build()); + studentRepository.save(Student.builder() + .name("도베르만") + .department(departementRepository.findByName("콘텐츠융합디자인")) + .studentNum("21400425") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4211-2673") + .email("ma@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ma.github") + .loginCnt(0L) + .readme("ma's readme") + .build()); + studentRepository.save(Student.builder() + .name("진시황") + .department(departementRepository.findByName("기계제어")) + .studentNum("21100714") + .semester(10) + .major1(majorRepository.findByName("기계공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2931-9192") + .email("yu@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@yu.github") + .loginCnt(0L) + .readme("yu's readme") + .build()); + studentRepository.save(Student.builder() + .name("황유비") + .department(departementRepository.findByName("ICT창업학부")) + .studentNum("21900012") + .semester(9) + .major1(majorRepository.findByName("ICT 융합전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4891-1275") + .email("jin@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jin.github") + .loginCnt(0L) + .readme("jin's readme") + .build()); + + studentRepository.save(Student.builder() + .name("우요셉") + .department(departementRepository.findByName("전산전자")) + .studentNum("21900032") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("생명과학전공")) + .phone("010-9191-1423") + .email("kim@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@kim.github") + .loginCnt(0L) + .readme("kim's readme") + .build()); + studentRepository.save(Student.builder() + .name("홍아담") + .department(departementRepository.findByName("국제어문")) + .studentNum("21901132") + .semester(1) + .major1(majorRepository.findByName("국제지역학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-9991-3009") + .email("park@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@park.github") + .loginCnt(0L) + .readme("park's readme") + .build()); + studentRepository.save(Student.builder() + .name("김이브") + .department(departementRepository.findByName("경영경제")) + .studentNum("22000131") + .semester(5) + .major1(majorRepository.findByName("경영학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-6653-9881") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@lee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); + studentRepository.save(Student.builder() + .name("송삼손") + .department(departementRepository.findByName("법학부")) + .studentNum("21900423") + .semester(5) + .major1(majorRepository.findByName("한국법전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1293-9832") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); + studentRepository.save(Student.builder() + .name("기윤호") + .department(departementRepository.findByName("커뮤니케이션")) + .studentNum("22100088") + .semester(3) + .major1(majorRepository.findByName("공연영상학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2188-4243") + .email("woo@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@woo.github") + .loginCnt(0L) + .readme("woo's readme") + .build()); + studentRepository.save(Student.builder() + .name("김영찬") + .department(departementRepository.findByName("상담복지")) + .studentNum("21900232") + .semester(4) + .major1(majorRepository.findByName("사회복지학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-6644-4214") + .email("wi@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wi.github") + .loginCnt(0L) + .readme("wi's readme") + .build()); + studentRepository.save(Student.builder() + .name("김영헌") + .department(departementRepository.findByName("공간환경시스템")) + .studentNum("21800232") + .semester(9) + .major1(majorRepository.findByName("도시환경공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-3431-6365") + .email("ha@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ha.github") + .loginCnt(0L) + .readme("ha's readme") + .build()); + studentRepository.save(Student.builder() + .name("김하은") + .department(departementRepository.findByName("콘텐츠융합디자인")) + .studentNum("21400825") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4111-2673") + .email("ma@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ma.github") + .loginCnt(0L) + .readme("ma's readme") + .build()); + studentRepository.save(Student.builder() + .name("장유진") + .department(departementRepository.findByName("기계제어")) + .studentNum("21100114") + .semester(10) + .major1(majorRepository.findByName("기계공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2931-9192") + .email("yu@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@yu.github") + .loginCnt(0L) + .readme("yu's readme") + .build()); + studentRepository.save(Student.builder() + .name("정수산나") + .department(departementRepository.findByName("ICT창업학부")) + .studentNum("21900312") + .semester(9) + .major1(majorRepository.findByName("ICT 융합전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4821-1175") + .email("jin@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jin.github") + .loginCnt(0L) + .readme("jin's readme") + .build()); + + } + + private void saveCategory() { + categoryRepository.save(Category.builder() + .name("전공마일리지") + .build()); + categoryRepository.save(Category.builder() + .name("산학마일리지") + .build()); + categoryRepository.save(Category.builder() + .name("비교과-연구활동") + .build()); + categoryRepository.save(Category.builder() + .name("비교과-특강참여") + .build()); + categoryRepository.save(Category.builder() + .name("비교과-행사참여") + .build()); + categoryRepository.save(Category.builder() + .name("비교과-학회할동") + .build()); + categoryRepository.save(Category.builder() + .name("기타") + .build()); + } + + + private void saveDepartment() { + departementRepository.save(Department.builder() + .name("전산전자") + .build()); + departementRepository.save(Department.builder() + .name("국제어문") + .build()); + departementRepository.save(Department.builder() + .name("경영경제") + .build()); + departementRepository.save(Department.builder() + .name("법학부") + .build()); + departementRepository.save(Department.builder() + .name("커뮤니케이션") + .build()); + departementRepository.save(Department.builder() + .name("상담복지") + .build()); + departementRepository.save(Department.builder() + .name("공간환경시스템") + .build()); + departementRepository.save(Department.builder() + .name("콘텐츠융합디자인") + .build()); + departementRepository.save(Department.builder() + .name("기계제어") + .build()); + departementRepository.save(Department.builder() + .name("ICT창업학부") + .build()); + departementRepository.save(Department.builder() + .name("ICT융합학부") + .build()); + departementRepository.save(Department.builder() + .name("생명과학") + .build()); + } From f5e5de40c283fad0d6a36cf689957eec30c60a86 Mon Sep 17 00:00:00 2001 From: lukehongg <79990740+lukehongg@users.noreply.github.com> Date: Mon, 7 Nov 2022 23:45:45 +0900 Subject: [PATCH 080/148] Feat/notice/#66 (#78) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [#66]:공지 조회수 API구현 * [#66]:공지API수정 --- .../server/hispath/common/TestController.java | 178 +++++++++++++----- .../notice/application/NoticeService.java | 12 +- .../server/hispath/notice/domain/Notice.java | 6 +- .../domain/repository/NoticeRepository.java | 12 ++ .../notice/presentation/NoticeController.java | 2 + .../presentation/request/NoticeRequest.java | 1 + 6 files changed, 156 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 7692427..713566f 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -255,6 +255,7 @@ public void saveParticipant() { private void saveManager() { managerRepository.save(Manager.builder() + .name("김광 교수님") .email("kkim@handong.ac.kr") .department("CSEE") @@ -342,97 +343,172 @@ private void saveManager() { private void saveNotice() { List l = new ArrayList(); for (Long i = Long.valueOf(1); i < 8; i++) { - Manager temp = managerRepository.findById(i).orElseThrow(ManagerNotFoundException::new); - l.add(temp); + if(i != 5 && i != 6){ + Manager temp = managerRepository.findById(i).orElseThrow(ManagerNotFoundException::new); + l.add(temp); + } } noticeRepository.save(Notice.builder() .manager(l.get(1)) - .title("Welcome to notice") - .content("This is the first notice") - .viewCnt(100) + .title("원클릭 컴공 전공 상담신청 서비스 안내") + .content("

상담 받기 좋은 계절입니다.

 

질문거리, 고민거리는 있지만 어느 교수님께 물어야 할 지 모르겠다면...

교수님께 상담 요청 이메일, 어떻게 써야 할지 몰라 망설여지신다면...

편하게 이것저것 여쭤보고 싶은데 안면 있는 교수님이 없어 막막하시다면...

 

원클릭 컴공 전공상담신청을 이용해보시기 바랍니다!

 

 https://forms.gle/n8mvzfJ51Ahzaujz8

 

접수한 내용을 바탕으로 가능한 빨리 적절한 교수님을 찾아 매칭해드립니다. 

 

학생 이메일 도메인 변경에 따라 Google Form 주소도 업데이트 했으니

참고하시기 바랍니다.

 

- 홍신

") + .viewCnt(0) .importance(true) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 5)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 12)) + .pubDate(LocalDate.of(2022, Month.APRIL, 19)) + .expDate(LocalDate.of(2022, Month.APRIL, 26)) .build()); noticeRepository.save(Notice.builder() .manager(l.get(2)) - .title("Second notice") - .content("This is the second notice") - .viewCnt(90) - .importance(false) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 6)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 18)) + .title("2022 BizFlow M Pre-Contest (신청기간연장 ~6.7(화))") + .content("


                                                                                         

 

 ■  접수기간 : 2022년 5월 25일 (수) ~ 6월 7일 (화)

 

 ■  접수링크 : https://docs.google.com/forms/d/1BR9IKalGSdDPKR4Hi6dvW8dpL57dKhvfz0oliJatRno/edit

         

 ■  참가자격

      한동대학교 재학생으로서 다음 사항 중 1개라도 해당되는 팀 (휴학생 팀원 참여 가능)

      1) 팀원 중 BizFlow Camp 수료자가 있는 경우

      2) 팀원 중 이전 BizFlow AppDev Contest 수상자(참가상 포함)가 있는 경우

      3) 팀원 중 BizFlow AppDev 사용 경험자가 있는 경우

      4) 팀원 모두 BizFlow AppDev 사용 경험은 없지만, 웹사이트 제작 경험이 있는 경우 

 

 ■ 컨테스트 내용   

     。사전 제시된 미션을 BizFlow M을 사용하여 구현한 후, 기한 내에 제출함 

     。미션 링크 : https://www.notion.so/HGU-X-AppDev-2022-Precontest-473e3aed71554cf2899238fd49ca3d6b

     。컨테스트 미션에 대한 설명 영상https://youtu.be/od_lQFIrj7g

     。이번 컨테스트 진행 중 질문답변을 위해 다음 링크를 사용하기 바랍니다.    

       클라썸 입장 링크: www.classum.com/EXSTQA 

 

 ■ 팀 구성 : 1~3인으로 팀 구성 (개인 참가 가능)



 ■ 수상팀에게는 여름방학 중에 진행되는 본 컨테스트 출전 자격이 주어집니다.

    1) 최우수상 : 1팀 60만원

     2) 우수상 : 5팀 내외 40만원

     3) 장려상 : 10팀 내외 20만원

     4) 참가상 : 기념품 지급

 

                    * 지적재산권 동의서 양식 첨부파일 확인 


") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.MAY, 24)) + .expDate(LocalDate.of(2022, Month.MAY, 30)) .build()); noticeRepository.save(Notice.builder() .manager(l.get(3)) - .title("SW festival") - .content("This is the third notice") - .viewCnt(50) + .title("2022-2 사전 학점인정 안내(타대학 교환·학점교류)") + .content("

22-2학기 타대학 교환·학점교류를 통해 전산전자공학부의 컴퓨터공학(심화), 전자공학(심화) 전공 학점으로 인정받고자 하는 학생은, 아래의 내용을 확인하시고 사전학점인정원 제출하시기 바랍니다.



1. 신청기간: ~2022.8.14.

     * 각 대학마다 수강신청기간이 다르므로, 본인 대학 수강신청기간 전에 신청 바람



2. 제출서류: 사전학점인정원, 해당 과목 강의계획서



3. 제출방법: csee@handong.edu로 온라인 제출



4. 사전학점인정 절차

  가. 학생이 학부사무실로 사전학점인정원 제출

  나. 해당 전공의 프로그램위원회에서 제출된 자료 검토하여 학점인정 여부 판단

  다. 검토완료 된 사전학점인정원을 학부사무실에서 학생 메일로 송부



5. 유의사항

  가. 각 대학마다 수강신청기간이 다르므로, 사전학점인정 승인 받은 후 수강신청 할 수 있도록 시간 여유를 두고 미리 신청 바람

  나. 본인서명 필수 /  담당교수 확인란은 비워 제출

  다. '해당전공'란은 컴퓨터공학 or 전자공학을 기입

  라. 이전 학기에 학점교류를 통해 전공 인정받은 학생의 경우 아래 내용 함께 제출

    1) 이전 교류대학명: 

    2) 인정 과목명:

    3) 총 인정학점:

  마. 사전학점인정원 승인을 받았더라도, 다른 수강 교과목과 내용이 중복되는 경우 추후 학점인정을 받지 못할 수 있음





문의 : 260-1414 / csee@handong.edu

") + .viewCnt(0) .importance(false) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 9)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 20)) + .pubDate(LocalDate.of(2022, Month.JUNE, 2)) + .expDate(LocalDate.of(2022, Month.JUNE, 15)) .build()); noticeRepository.save(Notice.builder() .manager(l.get(4)) - .title("Capstone festival") - .content("Capstone festival in November") - .viewCnt(80) + .title("2022년 8월 졸업생 학위증 및 상장 교부 안내") + .content("

9/2(금) 15시까지 신청 건 우편 발송되었습니다. 

 

---------------------------------------------------------------------------

 

안녕하세요?

전산전자공학부입니다.



졸업을 진심으로 축하드립니다.\uD83C\uDF89



학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.



우편(착불 4500원 정도)으로 받고자 하는 학생은 

9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.



이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.



<유의사항>

1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.

2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.



감사합니다:D



문의) 전산전자공학부사무실 260-1414

") + .viewCnt(0) .importance(true) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 5)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 30)) + .pubDate(LocalDate.of(2022, Month.JUNE, 7)) + .expDate(LocalDate.of(2022, Month.JUNE, 29)) .build()); noticeRepository.save(Notice.builder() - .manager(l.get(5)) - .title("GongPgi festival") - .content("GongPgi festival in October") - .viewCnt(100) + .manager(l.get(4)) + .title("2022년 8월 졸업생 학위증 및 상장 교부 안내") + .content("

9/2(금) 15시까지 신청 건 우편 발송되었습니다. 

 

---------------------------------------------------------------------------

 

안녕하세요?

전산전자공학부입니다.



졸업을 진심으로 축하드립니다.\uD83C\uDF89



학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.



우편(착불 4500원 정도)으로 받고자 하는 학생은 

9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.



이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.



<유의사항>

1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.

2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.



감사합니다:D



문의) 전산전자공학부사무실 260-1414

") + .viewCnt(0) .importance(true) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 20)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 27)) + .pubDate(LocalDate.of(2022, Month.JUNE, 21)) + .expDate(LocalDate.of(2022, Month.JUNE, 27)) .build()); noticeRepository.save(Notice.builder() - .manager(l.get(2)) - .title("CSEE lecture") - .content("At october 17 in NTH 313") - .viewCnt(56) + .manager(l.get(3)) + .title("[BK21 인공지능 교육연구단] 2022-2 참여대학원생 등록서류 제출 및 연구장학금 신청 안내") + .content("

한동대학교 BK21 인공지능 사업단

2022학년도 2학기 참여대학원생 등록서류 제출 및 연구장학금 신청 안내

 

 

한동대학교 전산전자공학과 4단계 BK21 ‘산업혁신을 위한 AI 고급 인재교육연구단’ (BK21 인공지능사업단)에서 다음과 같이 등록 서류를 제출하여주시기 바랍니다.

 


1. 4단계 BK21 참여대학원생 기준 (다음의 조건을 모두 충족한 자)

BK21 참여교수의 지도학생 중 전일제(4대보험에 가입되어 있지 않은 학생)로 등록(연구생 등록 포함)한 석·박사과정 대학원생으로 다음 각 호에 해당하는 자

-입학한 지 2년이 지나지 않은 석사과정생

-입학한 지 4년이 지나지 않은 박사과정생 및 박사 수료생

-입학한 지 6년이 지나지 않은 석박통합과정생 및 석박통합과정 수료생

(위의 기간 기산 시 휴학 및 군복무 기간은 제외함).

 

위의 자격을 충족한 경우 ‘참여대학원생’으로 등록되어 ‘지원대학원생’ 선발 기회 등 BK21 사업의 지원을 받을 수 있음.

 

2. 지원대학원생 선발 및 연구장학금 지급

1) 참여대학원생으로 등록된 학생 중 70% 이내의 대학원생을 ‘지원대학원생’으로 선발해 연구장학금을 지급함.

2) 지원기간: 2022.09.01.~2023.02.28. (6개월 단위로 선발)

3) 선발기준: 지도교수 추천을 받은 참여대학원생 중 연구/프로젝트 성과 평가에 의해 선발

4) 역할 및 임무

- BK21 참여교수 연구실에서 논문 연구 및 산학 프로젝트를 성실히 수행 (주 40시간 이상)

- 사업단이 주관하는 각종 세미나, 포럼 등의 학술 활동에 참여

- 사업단이 요구하는 성과 자료 보고

 


3. 참여대학원생 등록서류 제출안내(등록서류는 단순참여, 장학금 지원 받는 학생 모두 제출해주세요.)

1) 첨부된 제출서류 다운 및 작성 후 BK21 사업단 사무실로 서류 제출.

2) 지도교수로부터 지원대학원생(장학금 받는 학생)으로 추천받은 대학원생은 5.제출서류 함께 제출

 

4. 서류 제출 기간: 2022년 8월 29일(월) 13:00 - 9월 7일(수) 17:00 (제출기한 엄수)




5. 제출서류

- 연구자등록번호 발급 방법

: KRI(한국연구업적통합정보시스템 http://www.kri.go.kr)에 접속 회원가입→연구자등록번호 발급 

  (가입 시 소속을 반드시 ‘한동대학교’로 가입) 



1) 재학증명서 1부. 연구생등록자의 경우 연구생등록증 1부(2022년 9월 1일자 기준으로 제출)

2) 개인정보 수집 이용 제공 동의서 1부. (BK사업에 처음 참여하는 학생만 제출)

3) 참여인력 서약서 1부. 

4) 참여대학원생 확약서 1부.

5) BK21 연구장학금 신청서 1부. (지원대학원생-BK장학금 받는 학생만 제출)

6) 전산전자공학과 학기 보고서 1부.

7) 재학증명서 1부.(9월 1일 기준)

 

8) 연구재단 필수 제출 서류 '4대 보험 가입 증명서' 1부. (22.10.1일 기준일로하여 메일로 회신)

(**10월1일 기준으로 출력 후 제출 바랍니다. 9월에는 제출하지 않아도 됩니다!)

- 출력 방법: 4대 사회보험 포털서비스(http://www.4insure.or.kr) 로그인(회원가입, 공인인증서 필요) → 상단 메뉴 증명서발급(가입내역확인) 클릭 후 출력

 

9) 대학원 성적표 1부. (신입생은 제출X)

 

<한국연구재단 필수 수강!!-참여기간 중 1회 수강 후 수료증 제출해야함, 교육 미이수자 및  22-2학기 신입생만 수강하면 됩니다.>

10) 온라인 교육 수료증 (http://alpha-campus.kr/) 에 접속하여 로그인 후 상단 메뉴의 '탐색'->'온라인교육' -> '건강한 연구환경 조성을 위한 인권침해예방교육'클릭 ->'수강신청' 클릭 후 팝업창에서 수강신청 정보 확인 및 '신청완료'-> '학습'-> '학습중과정'-> '건강한 연구환경 조성을 위한 인권침해예방교육' 순서대로 클릭 후 '학습하기'

컨텐츠 수강 후 ‘MY'-> '학습이력'클릭 후 수료증 발급 및 보관) 

*수료증은 메일로 회신부탁합니다. 

 

11) 통장사본 및 신분증 사본 각 1부.

 

※ 외국인 참여대학원생의 경우 외국인 등록증 앞, 뒤 사본(D-2비자 여부 및 만료기한 확인) 제출.

※ 기존 참여대학원생이 지원할 경우: 2)개인정보 수집 이용 제공 동의서, 10)온라인 교육 수료증 제출 생략.

 

6. 서류 제출 및 문의처

1) BK21사업단 사무실: 뉴턴홀 309호 전산전자공학부 사무실 담당자 고라경(Tel: 260-3150)

2) 신청 시 모든 서류는 위 제출서류 순서대로 정리하여 원본 제출 바랍니다.

 

7. 유의사항: 제출된 서류는 반환하지 않으며, 허위사실 기재 시 선발을 취소함.

") + .viewCnt(0) .importance(false) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 18)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 25)) + .pubDate(LocalDate.of(2022, Month.JULY, 1)) + .expDate(LocalDate.of(2022, Month.JULY, 14)) .build()); noticeRepository.save(Notice.builder() - .manager(l.get(5)) - .title("SW news for October") - .content("Is coming soon!") - .viewCnt(1004) - .importance(true) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 7)) - .expDate(LocalDate.of(2022, Month.OCTOBER, 12)) + .manager(l.get(2)) + .title("2022 한동 SW페스티벌 수상자 안내 및 서류 제출 요청(10월 19일(수)까지)") + .content("

2022 한동 SW페스티벌 수상자 안내 및 서류 제출 요청(10월 19일(수)까지)

  

'2022 한동 SW페스티벌'에 참여한 모든 참가자들에게 감사드리며 수상팀을 안내드립니다. 

자세한 수상팀 명단은 첨부파일에서 확인 가능합니다.

수상한 모든 팀들 축하드립니다. 



[상금]

수상팀 제출 서류는 아래 설문지를 통해 팀대표 1명만 제출바랍니다.(팀장이 대표로 수령)

서류 제출 마감일은 10월 19일(수)입니다. 빠른 상금 수령을 위해 마감 기한을 꼭 지켜주세요!!

설문지로 바로이동



[상장]

배부기간: 10.20(목) ~ 21(금). 팀별 1부 발급

배  부  처: SW중심대학지원사업단, 뉴턴홀 218호

   * 상장 수령 시 개인정보 이용 동의서 서명도 함께 해주세요.

 

 

문의 : SW중심대학 지원사업단 이윤정(260-1478 / lyj1515@handong.edu)

") + .viewCnt(0) + .importance(false) + .pubDate(LocalDate.of(2022, Month.JULY, 7)) + .expDate(LocalDate.of(2022, Month.JULY, 12)) .build()); noticeRepository.save(Notice.builder() .manager(l.get(1)) - .title("SW news for Novem") - .content("Is going to be FUNNN") + .title("[전산전자공학부] 2022 CSEE Lab Week에 초대합니다.") + .content("

안녕하세요? \"\uD83D\uDCBB\"

전산전자공학부, 일반대학원 전산전자공학과가 9주차 10/24(월)~10/28(금)에 각 연구실에 대해 알아가고 다양한 연구의 내용을 공유하는 시간을 가지려고 합니다. 



저희 전산전자공학부, 일반대학원 전산전자공학과에서 어떤 주제의 연구들을 진행하고 있는지 Lab설명회, 포스터세션을 통해 이야기를 듣고 싶은 학생들의 많은 참여 바랍니다. 



행사에 참석하면 입시관련된 정보 또한 얻을 수 있으니 AI를 포함한 ICT관련 분야 진학에 관심있는 모든 학부생들의 참여를 환영합니다. 



\"d24;\"온라인 Lab 멘토링 실시 (기간: 10/24(월)~10/28(금))

(아래 링크접속 후 각 Lab의 오픈카톡방을 통한 자유로운 상담 가능)


https://docs.google.com/document/d/1vPNIac3vfuBxzr3-IsqVqEAFwJtA-6dXiE_RvKhXJHo/edit#

 

 

\"d24;\" Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성

제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.

https://forms.gle/a8XWyqXcTec8vdwq5

 

 

\"d24;\" CSEE Lab Week 행사 참석 희망자(만찬 참여 포함)는 아래 설문지 필수 작성


https://docs.google.com/forms/d/1wkUWbYgcPFFTfrI-M3aOonQYRd_Oq6VHugJx6rVkuRE/edit?pli=1



**10/28(금)** 포스터세션이 종료되고 만찬(오후 5시 예정)이 있을 예정입니다.

만찬은 인원수 제한으로 선착순으로 신청을 받습니다.






\"\uD83C\uDF81\"event\"\uD83C\uDF81\" CSEE Lab Week 참가자 커피쿠폰 증정 

 

 

* 문의: 전산전자공학과 고라경 선생님 (전화: 054-260-3150)

") .viewCnt(0) .importance(true) - .pubDate(LocalDate.of(2022, Month.OCTOBER, 21)) - .expDate(LocalDate.of(2022, Month.OCTOBER, 30)) + .pubDate(LocalDate.of(2022, Month.AUGUST, 5)) + .expDate(LocalDate.of(2022, Month.AUGUST, 25)) .build()); noticeRepository.save(Notice.builder() - .manager(l.get(6)) - .title("SW Festival ends") - .content("See you next year!") + .manager(l.get(0)) + .title("2022-2 비교과 졸업요건 서류 제출 안내(~12/16)") + .content("

안녕하세요?

17학번이후인 1전공 컴퓨터공학/AI·컴퓨터공학심화 학생 중 캡스톤디자인 교과목 수강생 및 2023.2월 졸업예정자에게 안내드립니다.

비교과 졸업요건 만족 여부 확인을 위해 첨부 된 양식 작성하여 구글폼으로 제출해주시기 바랍니다.

   * 비교과 졸업요건은 히즈넷-학생 졸업심사화면의 '학부추가졸업요건'에 해당합니다.

   * 해당 학생들에게는 문자로 안내하였습니다.

<17학번부터 적용되는 비교과 졸업요건>

- 산학프로젝트 1개 이상 수행 (산학R&D프로젝트, 또는 산학연계 교과목프로젝트 (예: 캡스톤디자인))

- 캡스톤프로젝트 결과물 등을 특허, 논문, SW시제품 중 한 가지 형태로 1건 이상 제출하여야 함 (공동 출원자/저자 모두 인정).

- 비교과 졸업요건은 캡스톤디자인 과목을 산학 주제로 수행한 결과를 논문 발표, 특허출원, 또는 SW등록함으로써 자연스럽게 충족 가능함.

1. 제출기한: 16주차 금요일(12/16)까지

2. 제출방법: 구글폼(https://forms.gle/Q7X1VfJL176h2TJ38) 제출

  - 23.2월에 졸업하는 경우, 12/16(금)까지 제출하셔야 졸업 가능합니다.(다음학기 ‘학사학위취득유예’ 학생 포함)

  - 23.2월에 졸업하지 않는 경우, 다음 학기에 제출하실 수 있습니다.(구글폼에 '졸업안함' 제출)

3. 참고사항

  가. 이전에 증빙서류로 제출하였던 사례

    1) 논문: 정식 게재된 목차 및 논문 스캔본, 발표 포스터 스캔본

    2) 특허: 특허청의 공식 문서로 출원번호 또는 등록번호와 발명자 정보(주소지 포함)가 기재되어 있는 서류

                 (특허출원서, 특허증, 공개특허공보, 등록특허공보 중 1개 선택)

    3) 시제품제작 (아래 3개 항목 중 1가지 선택)

      가) SW등록: SW등록증, 프로그램등록신청명세서, 저작권 등록증 등

      나) 앱 출시: 출시 된 앱의 스토어 게시 화면 캡쳐 이미지, 앱 출시 확인서 사본 등

      다) 상용서비스 수준 확인 : 산학프로젝트 참여 기업체의 담당자 또는 기업체 멘토가 작성한 시제품 확인서(첨부 양식)

  나. 자주묻는질문

    1) 비교과 졸업요건을 충족하기 위한 결과물은 꼭 캡스톤디자인의 결과물이어야 하나요?

          - 반드시 캡스톤 결과물이어야 할 필요는 없습니다.

    2) 저작권 등록을 한 학생이 대표로 하게되어 등록증에 한명의 이름만 기재되는데 어떻게 하나요?

          - 등록증에 들어있는 제목과 캡스톤 제목이 일치하면 같은 팀원에게 동일하게 적용됩니다.                                            다만, 서류는 개인별로 제출하셔야 합니다.



문의) csee@handong.edu

") .viewCnt(0) .importance(true) - .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2)) - .expDate(LocalDate.of(2022, Month.NOVEMBER, 9)) + .pubDate(LocalDate.of(2022, Month.AUGUST, 8)) + .expDate(LocalDate.of(2022, Month.DECEMBER, 16)) .build()); + noticeRepository.save(Notice.builder() + .manager(l.get(0)) + .title("[이랜드이노플] 채용설명회 안내 및 수요조사") + .content("

안녕하세요:) 반갑습니다.

이랜드이노플 인사팀입니다.



금번 [이랜드이노플X한동대학교] 채용설명회에 참여해주시는 분들께 감사의 의미로 간식 및 기념품을 제공해드리고자 수요조사를 진행하게 되었습니다. 일정은 아래와 같이 진행되며, 참석을 원하시는 분들께서는 본 설문에 응답해주시기를 부탁드립니다:)

 

1. 채용설명회

  가. 일시: 2022.11.16(수) 12:00~12:50

  나. 장소: 뉴턴홀 310호

  다. 참석 혜택

    - 채용설명회에 발걸음 해주시는 학생분들께 아래와 같은 혜택을 드리고자 합니다.

      1) 서류전형 시 가산점 부여

      2) 기념품 제공

      3) Q&A 시간에 학생분들이 궁금해하시는 포인트들을 최대한 답변해드리고자 합니다.

    + (한동대 Only) 간식 제공> [한동대] 이랜드이노플 채용설명회 참여 신청서: https://forms.gle/s9B5JbDPsviRBEoq5

 

2. 채용 안내

  가. 채용일정: 2022.11.4(금)~11.21(월)

  나. 이랜드이노플 채용 관련 링크

    - 채용사이트: https://careers.eland.co.kr/announce/recruit/hxKeGGXNip4urmc1ZmHDz7PJVJ2-

    - Notion 이노플 공채 블로그: https://elandinnople.oopy.io/38d9b929-de4f-46eb-8234-d5b231973e74

    - 네이버블로그: https://blog.naver.com/elandinnople

 

") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 6)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 26)) + .build()); + noticeRepository.save(Notice.builder() + .manager(l.get(1)) + .title("[대학원] 세미나(11월 11일, 손현우 교수)-아날로그 연산기 기반의 학습가능한 신경망 시스템") + .content("

정보통신대학원 세미나를 소개합니다.

 

이번 세미나는 온.오프라인(한국어 강의)으로 진행 되며, 학부생, 대학원생, 교직원 누구나 참여 가능합니다. 

 

*특강에 참여한 전전 학부생들에게는(대학원생 제외) 소중대 마일리지를 적립해드리니, 관심있는 학생들의 많은 참여 바랍니다. (ZOOM 접속 후 닉네임을 학번, 이름으로 변경 필수!)

 

 

 

 

▶▶세미나5-정보통신대학원 세미나 2022년 2학기

 

 

 

 아날로그 연산기 기반의 학습가능한 신경망

 

손현우 교수

 

경상국립대학교

 

 

 초록



AI 알고리즘의 발전과 함께 IoT를 위한 에너지 효율적인 AI 하드웨어의 필요성이 증가하고 있다. 최근 BinaryNet 알고리즘을 이용하여 추론 과정에서 더 높은 효율을 위한 아날로그 연산기 기반의 하드웨어 가속기 [1] 가 제안되었지만, 학습과 추론이 가능한 AI 하드웨어는 여전히 상대적으로 높은 정확도의 곱셈과 함께 복잡한 학습 과정을 필요로 한다. 또한 인 메모리 하드웨어 구조는 적은 데이터 이동 및 대규모 병렬 동작으로 인하여 높은 에너지 효율과 낮은 지연 시간을 달성할 수 있지만, 아날로그 연산 특성 때문에 PVT 변화에 취약하여 오프라인으로 학습된 가중치를 사용시 상당한 성능저하를 유발할 수 있다. 최근 보고된 온칩 학습 가능한 오토인코더 [2] 와 서포트 벡터 머신 (SVM) [3] 은 소프트웨어로 입증된 AI 알고리즘의 아날로그 연산이 온칩 학습에 성공적으로 사용될 수 있음을 보여주었지만, 단일 오토인코더 유닛 또는 단일 레이어의 SVM으로 응용이 제한되었다. 본 논문 [4] 은 다층 신경망의 학습을 위해 널리 사용되는 오류 역전파 알고리즘을 수행하는 신경망 시스템을 제안한다 (그림. 1). 제안된 시스템의 한 구성 단위로서, 전류형 곱셈누적 연산 (MAC) 프로세서는 병렬 MAC연산으로 순전파 및 역전파를 모두 수행한다. 지도 학습을 위해, 제안된 시스템은 28nm CMOS 기술로 제작된 두 개의 프로세서 칩과 FPGA를 사용하여 두 레이어의 신경망에서 검증되었다. 제안된 시스템은 아날로그 기반 MAC을 위한 보정 회로 없이 동일한 아날로그 기반 MAC을 통해 학습 데이터를 학습함으로써 칩 대 칩 변화 및 아날로그 동작의 불완전성을 보상하였다. 제안된 시스템은 1-b (+1, 0, -1) 배치 업데이트를 사용하여 22×22의 사이즈로 조정된 MNIST 데이터 셋의 분류에서 약 97%의 인식률을 달성하였다.


 

*일시 11월 11일 (금), 16시~


* 장소 NTH412호

*ZOOM https://handong.zoom.us/j/86244954271

*회의ID 862 4495 4271

*문의 4단계 BK21 AI사업단 (260-3150)



") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 9)) + .expDate(LocalDate.of(2022, Month.SEPTEMBER, 15)) + .build()); + noticeRepository.save(Notice.builder() + .manager(l.get(2)) + .title("[SW중심대] 11월 2일(수) 류석문 쏘카 CTO 특강 안내") + .content("

[SW중심대] 11월 2일(수) 류석문  쏘카 CTO 특강 안내






 

1. 강사 : 류석문 쏘카 CTO


2. 주제 :  프로그래머로 산다는 것

 

3. 일시 : 2022년 11월 2일 (수) 오후 1시 

 

4. 장소 : 오석관 405호, 401호,

 

5. 소감문 제출 방법 : 링크 접속 후 제출 (https://forms.gle/gRtNgqWtFnxYmMXVA)


    * 공프기 및 캡스톤 수강생 외 학생들은 강의 시청 후 반드시 소감문을 제출하셔야 합니다. (11. 4(금) 밤12시까지)







   ☎ 문의 : SW중심대학 지원사업단 김선영 (T.260-1492, E-Mail : pooh8276@handong.edu)

") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.OCTOBER, 7)) + .expDate(LocalDate.of(2022, Month.OCTOBER, 28)) + .build()); + + noticeRepository.save(Notice.builder() + .manager(l.get(3)) + .title("\"일본 IT 강독\" 2022년 2학기 첫번쨰 모임이 이번주 수요일 11월 09일 저녁 8시에 열립니다.") + .content("

 \"일본 IT 강독\"   2022년 2학기 첫번? 모임이 이번주  수요일 11월 09일 저녁 8시에 열립니다.



2022년2학기 일본IT학회 주관 \"일본 IT 강독\"



일본의  IT시스템 개발문서, IT 트렌드 관련 일본어 기사 등을 같이 읽어 나가는 시간입니다. 일본은 IT시스템 개발과정에서 Documentation을 아주 철저히 하고 있습니다. 따라서 일본 IT 취업시 일본어를 읽고 쓰는 능력은 회화능력 이상으로 중요합니다. IT관련 일본어 문서를 읽어나가며 일본어를 더 공부하고 싶게 하고자 합니다.



본 시간은 22년이상 일본에서 IT개발자로서 일본인들과 함께 일해오신 일본 도레이쿠 김종환 대표님이 직접 강의합니다.



참여자격 : 일본어 초급 수준(한동대학교 일본어  I 수강 수준)



일정

제 1 차 모임. 11월 09일(수 저녁 8시) 11주차 

제 2 차 모임. 11월 23일(수 저녁 8시) 13주차 

 

줌 접속 주소

https://handong.zoom.us/j/82808657679



- 참석자에게는 마일리지가 부여됩니다.

- 문의 : 김기석 교수(peterkim@handong.edu) ,박훈성(01043417017 / 21800333@handong.ac.kr) 

") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.NOVEMBER, 1)) + .expDate(LocalDate.of(2022, Month.NOVEMBER, 7)) + .build()); + noticeRepository.save(Notice.builder() + .manager(l.get(2)) + .title("23-1학기 공학프로젝트기획(공프기) 사전신청 안내") + .content("

2023년 봄학기 공학프로젝트기획(공프기)을 수강하기 원하는 학생은

11월 6일까지 아래 링크의 웹사이트에서 사전 신청을 접수하시기 바랍니다.

http://walab.handong.edu/csc/

사전 신청은 공학프로젝트기획 주제 제안과 팀 구성 과정을 효율적으로 하기 위한 작업이니, 

수강 의사가 조금이라도 있다면 반드시 사전 신청을 접수하기 바랍니다.

사전신청에 접수한 학생에 한하여 관련 공지사항과 공프기 주제 제안 내용을 공개할 예정입니다.


  • 2023-1학기 공프기를 위한 일정 계획

    • 2022-2학기 9주차

      • CSEE Lab week (연구실 소개)

    • 2022-2학기 10주차

      • 2023-1학기를 위한 사전신청

      • 수강 예정 학생 수 파악 및 예상 프로젝트 팀 수 확정

    • 2022-2학기 12주차 ~

      • 주제 공개

      • 관심이 있는 주제/교수님께 개별 연락하여 팀 구성

") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.OCTOBER, 25)) + .expDate(LocalDate.of(2022, Month.OCTOBER, 31)) + .build()); + noticeRepository.save(Notice.builder() + .manager(l.get(3)) + .title("SW Festival ends") + .content("See you next year!") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2)) + .expDate(LocalDate.of(2022, Month.NOVEMBER, 9)) + .build()); + noticeRepository.save(Notice.builder() + .manager(l.get(2)) + .title("[지역선도대학] 2022 대경권 대학생 AI프로그래밍 경진대회 개최") + .content("

2022 대경권 대학생 AI프로그래밍 경진대회 개최 









지역선도대학육성사업에서는 재학생들의 인공지능(AI) 컴퓨팅 사고역량, 프로그래밍 역량 문제해결 역량 강화 등을 위하여 2022 대경권 대학생 AI프로그래밍 경진대회를 개최합니다.





■ 접수기간: 2022. 10. 26.(수) ~ 11. 9.(수) 까지 

■ 접수방법: 대회 홈페이지에서 직접 신청(참가비 무료)



대회 홈페이지 주소 및 자세한 내용은 지역선도대학육성사업 홈페이지 → 온라인신청 → 진행프로그램에서 가능

(https://spoke.knu.ac.kr/03_sub/01_sub.html)



■ 문의 : 안영은 연구원(054-260-3124, aye3384@handong.edu)

") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.OCTOBER, 21)) + .expDate(LocalDate.of(2022, Month.OCTOBER, 27)) + .build()); + noticeRepository.save(Notice.builder() + .manager(l.get(0)) + .title("[CSEE Lab Week] Lab 토크쇼 관련 사전 질문") + .content("

안녕하세요. 컴퓨터 공학 전공 주임 안민규 교수입니다.

 

이전 글에 공지된 것처럼 다음 주 9주차에는 전산전자공학부/전산전자공학과가 CSEE Lab Week가 진행됩니다.

관련 글> https://hisnet.handong.edu/myboard/read.php?id=35135&Board=B0029

 

연구실에 관심이 있거나, 2023-1학기 공학프로젝트 기획 수강을 계획하는 학생들에게는 큰 도움이 될 것 같습니다.

 

 

각 연구실에 대하여 궁금한 점은 9주차 동안 진행되는 Lab 멘토링을 통해 문의하고 답변을 받기 바랍니다.

또한, 목요일 18:30에는 CSEE 연구실, 연구실 생활, 졸업 프로젝트, 진로 등에 관하여 이야기를 교수님들과 나눌 수 있는 자리를 마련하였으니 많은 학생들이 참여하여 정보를 얻는 시간이 되길 빕니다.

 

 

관련하여 현재 사전 질문을 받고 있습니다. 아래의 링크를 통하여 묻고 싶은 사항을 남겨주시기 바랍니다.

 

 

\"d24;\" Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성

제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.

https://forms.gle/a8XWyqXcTec8vdwq5

 

 

 

 

안민규 교수.

") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2)) + .expDate(LocalDate.of(2022, Month.NOVEMBER, 9)) + .build()); } diff --git a/src/main/java/com/server/hispath/notice/application/NoticeService.java b/src/main/java/com/server/hispath/notice/application/NoticeService.java index 7f30a10..940469d 100644 --- a/src/main/java/com/server/hispath/notice/application/NoticeService.java +++ b/src/main/java/com/server/hispath/notice/application/NoticeService.java @@ -9,6 +9,7 @@ import com.server.hispath.notice.domain.Notice; import com.server.hispath.notice.domain.repository.NoticeRepository; +import com.server.hispath.notice.presentation.request.NoticeRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,7 +28,12 @@ public class NoticeService { private final ManagerService managerService; private Notice findById(Long id) { - return noticeRepository.findById(id).orElseThrow(NoticeNotFoundException::new); + Notice ret = noticeRepository.findById(id).orElseThrow(NoticeNotFoundException::new); + return ret; + } + @Transactional + public void increaseViewCnt(Long id){ + noticeRepository.increaseViewCntByOne(id); } @Transactional @@ -44,9 +50,10 @@ public List findAll() { return notices.stream().map(NoticeDto::from).collect(Collectors.toList()); } - @Transactional(readOnly = true) + @Transactional public NoticeDto find(Long id) { Notice notice = this.findById(id); + notice.viewCount(); return NoticeDto.from(notice); } @@ -55,7 +62,6 @@ public NoticeDto update(Long id, Long managerId, NoticeContentDto dto) { Notice notice = this.findById(id); Manager manager = managerService.findById(managerId); notice.update(manager, dto); - return NoticeDto.from(notice); } diff --git a/src/main/java/com/server/hispath/notice/domain/Notice.java b/src/main/java/com/server/hispath/notice/domain/Notice.java index 3621592..d9f8394 100644 --- a/src/main/java/com/server/hispath/notice/domain/Notice.java +++ b/src/main/java/com/server/hispath/notice/domain/Notice.java @@ -35,7 +35,7 @@ public class Notice extends BaseEntity { private String title; - @Column(length = 5555) + @Column(columnDefinition = "TEXT") private String content; private int viewCnt; @@ -70,5 +70,9 @@ public void update(Manager manager, NoticeContentDto dto) { this.pubDate = dto.getPubDate(); this.expDate = dto.getExpDate(); } + public void viewCount(){ + this.viewCnt++; + } + } diff --git a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java index e7269ee..b8bb8ed 100644 --- a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java +++ b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java @@ -3,7 +3,9 @@ import com.server.hispath.notice.domain.Notice; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.time.LocalDate; @@ -13,5 +15,15 @@ @Repository public interface NoticeRepository extends JpaRepository { +<<<<<<< HEAD + List findTop5ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate pubDate, LocalDate expDate); + + @Modifying + @Query("update Notice n set n.viewCnt = n.viewCnt + 1 where n.id = :id") + void increaseViewCntByOne(Long id); + + +======= List findTop6ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate pubDate, LocalDate expDate); +>>>>>>> dev } diff --git a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java index b13cbfa..a664a30 100644 --- a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java +++ b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java @@ -5,6 +5,7 @@ import com.server.hispath.notice.application.dto.NoticeDto; import com.server.hispath.notice.application.NoticeService; +import com.server.hispath.notice.domain.Notice; import com.server.hispath.notice.presentation.request.NoticeRequest; import com.server.hispath.notice.presentation.response.NoticeResponse; import io.swagger.annotations.ApiOperation; @@ -45,6 +46,7 @@ public ResponseEntity> findAll() { @GetMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_READ) public ResponseEntity find(@PathVariable Long id){ +// noticeService.increaseViewCnt(id); NoticeResponse response = NoticeResponse.from(noticeService.find(id)); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java b/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java index 9375b1b..3fbb87f 100644 --- a/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java +++ b/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java @@ -24,4 +24,5 @@ public class NoticeRequest{ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") private LocalDate expDate; + } From 9a7a73ae3d8b69c35de14a21a5a65d10ca706d0a Mon Sep 17 00:00:00 2001 From: lukehongg Date: Mon, 7 Nov 2022 23:48:04 +0900 Subject: [PATCH 081/148] =?UTF-8?q?[#66]:=EA=B3=B5=EC=A7=80=20API=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notice/domain/repository/NoticeRepository.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java index b8bb8ed..87a7b04 100644 --- a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java +++ b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java @@ -14,16 +14,5 @@ @Repository public interface NoticeRepository extends JpaRepository { - -<<<<<<< HEAD - List findTop5ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate pubDate, LocalDate expDate); - - @Modifying - @Query("update Notice n set n.viewCnt = n.viewCnt + 1 where n.id = :id") - void increaseViewCntByOne(Long id); - - -======= List findTop6ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate pubDate, LocalDate expDate); ->>>>>>> dev } From 3e01ddfe4718e2d185446c98b6c270f1d74ccc92 Mon Sep 17 00:00:00 2001 From: lukehongg Date: Mon, 7 Nov 2022 23:50:03 +0900 Subject: [PATCH 082/148] =?UTF-8?q?[#66]:=EA=B3=B5=EC=A7=80=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EC=88=98=20API=20=EC=B5=9C=EC=A2=85=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/server/hispath/notice/application/NoticeService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/server/hispath/notice/application/NoticeService.java b/src/main/java/com/server/hispath/notice/application/NoticeService.java index 940469d..8bf304f 100644 --- a/src/main/java/com/server/hispath/notice/application/NoticeService.java +++ b/src/main/java/com/server/hispath/notice/application/NoticeService.java @@ -31,10 +31,6 @@ private Notice findById(Long id) { Notice ret = noticeRepository.findById(id).orElseThrow(NoticeNotFoundException::new); return ret; } - @Transactional - public void increaseViewCnt(Long id){ - noticeRepository.increaseViewCntByOne(id); - } @Transactional public Long create(Long managerId, NoticeContentDto dto) { From 762a55f13d382a1fdfd385312e3a1dcf28e911d6 Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Tue, 8 Nov 2022 00:48:24 +0900 Subject: [PATCH 083/148] =?UTF-8?q?[feat#79]=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?(#80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/hispath/common/TestController.java | 2607 ++++++++++------- 1 file changed, 1528 insertions(+), 1079 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 713566f..5c83c26 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -67,10 +67,10 @@ public ResponseEntity initAll() { saveDepartment(); saveStudent(); saveManager(); - // saveNotice(); -// saveActivities(); -// saveParticipant(); -// saveScholarship(); + saveNotice(); + saveActivities(); + saveScholarship(); +// saveParticipant(); init all에 포함 금지! 따로 실행 // saveResumes(); return ResponseEntity.ok(null); } @@ -159,71 +159,71 @@ private void saveScholarship() { List students = studentRepository.findAll(); List studentIds2022_2 = students.stream() - .map(Student::getId) - .collect(Collectors.toList()); + .map(Student::getId) + .collect(Collectors.toList()); Collections.shuffle(studentIds2022_2); int num2022_2 = getRandomNum(students.size() - 10, students.size()); studentIds2022_2.subList(0, num2022_2) - .forEach(id -> { - scholarshipService.create(id, "2022-2"); - }); + .forEach(id -> { + scholarshipService.create(id, "2022-2"); + }); List studentIds2022_1 = students.stream() - .map(Student::getId) - .collect(Collectors.toList()); + .map(Student::getId) + .collect(Collectors.toList()); Collections.shuffle(studentIds2022_1); int num2022_1 = getRandomNum(students.size() - 10, students.size()); studentIds2022_1.subList(0, num2022_1) - .forEach(id -> { - scholarshipService.create(id, "2022-1"); - }); + .forEach(id -> { + scholarshipService.create(id, "2022-1"); + }); List studentIds2021_2 = students.stream() - .map(Student::getId) - .collect(Collectors.toList()); + .map(Student::getId) + .collect(Collectors.toList()); Collections.shuffle(studentIds2021_2); int num2021_2 = getRandomNum(students.size() - 10, students.size()); studentIds2021_2.subList(0, num2021_2) - .forEach(id -> { - scholarshipService.create(id, "2021-2"); - }); + .forEach(id -> { + scholarshipService.create(id, "2021-2"); + }); } private void saveResumes() { Student student = studentService.findById(1L); resumeRepository.save(Resume.builder() - .student(student) - .title("첫번째 이력서") - .content("jsonData가 들어가야해") - .build()); + .student(student) + .title("첫번째 이력서") + .content("jsonData가 들어가야해") + .build()); resumeRepository.save(Resume.builder() - .student(student) - .title("두번째 이력서") - .content("jsonData가 들어가야해") - .build()); + .student(student) + .title("두번째 이력서") + .content("jsonData가 들어가야해") + .build()); resumeRepository.save(Resume.builder() - .student(student) - .title("세번째 이력서") - .content("jsonData가 들어가야해") - .build()); + .student(student) + .title("세번째 이력서") + .content("jsonData가 들어가야해") + .build()); resumeRepository.save(Resume.builder() - .student(student) - .title("네번째 이력서") - .content("jsonData가 들어가야해") - .build()); + .student(student) + .title("네번째 이력서") + .content("jsonData가 들어가야해") + .build()); resumeRepository.save(Resume.builder() - .student(student) - .title("다섯번째 이력서") - .content("jsonData가 들어가야해") - .build()); + .student(student) + .title("다섯번째 이력서") + .content("jsonData가 들어가야해") + .build()); resumeRepository.save(Resume.builder() - .student(student) - .title("여섯번째 이력서") - .content("jsonData가 들어가야해") - .build()); + .student(student) + .title("여섯번째 이력서") + .content("jsonData가 들어가야해") + .build()); } @@ -241,10 +241,10 @@ public void saveParticipant() { int num = getRandomNum(15, students.size()); List refStudent = students.stream() - .map(student -> { - return new StudentSimpleRefDto(student.getStudentNum(), student.getName()); - }) - .collect(Collectors.toList()); + .map(student -> { + return new StudentSimpleRefDto(student.getStudentNum(), student.getName()); + }) + .collect(Collectors.toList()); Collections.shuffle(refStudent); studentService.registerParticipants(activity.getId(), refStudent.subList(0, num)); @@ -255,88 +255,87 @@ public void saveParticipant() { private void saveManager() { managerRepository.save(Manager.builder() - - .name("김광 교수님") - .email("kkim@handong.ac.kr") - .department("CSEE") - .approved(true).build()); + .name("김광 교수님") + .email("kkim@handong.ac.kr") + .department("CSEE") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("장소연 교수님") - .email("jerry1004@handong.ac.kr") - .department("CSEE") - .approved(true).build()); + .name("장소연 교수님") + .email("jerry1004@handong.ac.kr") + .department("CSEE") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("장기려 박사님") - .email("janggiryeo@handong.ac.kr") - .department("JGR") - .approved(true).build()); + .name("장기려 박사님") + .email("janggiryeo@handong.ac.kr") + .department("JGR") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("최도성 총장님") - .email("cds@handong.ac.kr") - .department("HGU") - .approved(true).build()); + .name("최도성 총장님") + .email("cds@handong.ac.kr") + .department("HGU") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("최경현 선생님") - .email("cgh@handong.ac.kr") - .department("SW") - .approved(false).build()); + .name("최경현 선생님") + .email("cgh@handong.ac.kr") + .department("SW") + .approved(false).build()); managerRepository.save(Manager.builder() - .name("이윤정 선생님") - .email("lyj@handong.ac.kr") - .department("SW") - .approved(false).build()); + .name("이윤정 선생님") + .email("lyj@handong.ac.kr") + .department("SW") + .approved(false).build()); managerRepository.save(Manager.builder() - .name("이미나 선생님") - .email("lmn@handong.ac.kr") - .department("SW") - .approved(true).build()); + .name("이미나 선생님") + .email("lmn@handong.ac.kr") + .department("SW") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("안병웅") - .email("BW_Ahn@handong.ac.kr") - .department("전산전자공학부") - .approved(true).build()); + .name("안병웅") + .email("BW_Ahn@handong.ac.kr") + .department("전산전자공학부") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("박성진") - .email("JakePark@handong.ac.kr") - .department("글로벌리더쉽학부") - .approved(true).build()); + .name("박성진") + .email("JakePark@handong.ac.kr") + .department("글로벌리더쉽학부") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("홍성헌") - .email("lukehongg@handong.ac.kr") - .department("전산전자공학부") - .approved(true).build()); + .name("홍성헌") + .email("lukehongg@handong.ac.kr") + .department("전산전자공학부") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("이인혁") - .email("Bruse@handong.ac.kr") - .department("ICT융합학부") - .approved(true).build()); + .name("이인혁") + .email("Bruse@handong.ac.kr") + .department("ICT융합학부") + .approved(true).build()); managerRepository.save(Manager.builder() - .name("정수산나") - .email("Sanna@handong.ac.kr") - .department("경영경제학부") - .approved(false).build()); + .name("정수산나") + .email("Sanna@handong.ac.kr") + .department("경영경제학부") + .approved(false).build()); managerRepository.save(Manager.builder() - .name("정석민") - .email("PeterJung@handong.ac.kr") - .department("글로벌리더쉽학부") - .approved(false).build()); + .name("정석민") + .email("PeterJung@handong.ac.kr") + .department("글로벌리더쉽학부") + .approved(false).build()); managerRepository.save(Manager.builder() - .name("송다빈") - .email("Emerson@handong.ac.kr") - .department("전산전자공학부") - .approved(true).build()); + .name("송다빈") + .email("Emerson@handong.ac.kr") + .department("전산전자공학부") + .approved(true).build()); } @@ -350,92 +349,92 @@ private void saveNotice() { } noticeRepository.save(Notice.builder() - .manager(l.get(1)) - .title("원클릭 컴공 전공 상담신청 서비스 안내") - .content("

상담 받기 좋은 계절입니다.

 

질문거리, 고민거리는 있지만 어느 교수님께 물어야 할 지 모르겠다면...

교수님께 상담 요청 이메일, 어떻게 써야 할지 몰라 망설여지신다면...

편하게 이것저것 여쭤보고 싶은데 안면 있는 교수님이 없어 막막하시다면...

 

원클릭 컴공 전공상담신청을 이용해보시기 바랍니다!

 

 https://forms.gle/n8mvzfJ51Ahzaujz8

 

접수한 내용을 바탕으로 가능한 빨리 적절한 교수님을 찾아 매칭해드립니다. 

 

학생 이메일 도메인 변경에 따라 Google Form 주소도 업데이트 했으니

참고하시기 바랍니다.

 

- 홍신

") - .viewCnt(0) - .importance(true) - .pubDate(LocalDate.of(2022, Month.APRIL, 19)) - .expDate(LocalDate.of(2022, Month.APRIL, 26)) - .build()); + .manager(l.get(1)) + .title("원클릭 컴공 전공 상담신청 서비스 안내") + .content("

상담 받기 좋은 계절입니다.

 

질문거리, 고민거리는 있지만 어느 교수님께 물어야 할 지 모르겠다면...

교수님께 상담 요청 이메일, 어떻게 써야 할지 몰라 망설여지신다면...

편하게 이것저것 여쭤보고 싶은데 안면 있는 교수님이 없어 막막하시다면...

 

원클릭 컴공 전공상담신청을 이용해보시기 바랍니다!

 

 https://forms.gle/n8mvzfJ51Ahzaujz8

 

접수한 내용을 바탕으로 가능한 빨리 적절한 교수님을 찾아 매칭해드립니다. 

 

학생 이메일 도메인 변경에 따라 Google Form 주소도 업데이트 했으니

참고하시기 바랍니다.

 

- 홍신

") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.APRIL, 19)) + .expDate(LocalDate.of(2022, Month.APRIL, 26)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(2)) - .title("2022 BizFlow M Pre-Contest (신청기간연장 ~6.7(화))") - .content("


                                                                                         

 

 ■  접수기간 : 2022년 5월 25일 (수) ~ 6월 7일 (화)

 

 ■  접수링크 : https://docs.google.com/forms/d/1BR9IKalGSdDPKR4Hi6dvW8dpL57dKhvfz0oliJatRno/edit

         

 ■  참가자격

      한동대학교 재학생으로서 다음 사항 중 1개라도 해당되는 팀 (휴학생 팀원 참여 가능)

      1) 팀원 중 BizFlow Camp 수료자가 있는 경우

      2) 팀원 중 이전 BizFlow AppDev Contest 수상자(참가상 포함)가 있는 경우

      3) 팀원 중 BizFlow AppDev 사용 경험자가 있는 경우

      4) 팀원 모두 BizFlow AppDev 사용 경험은 없지만, 웹사이트 제작 경험이 있는 경우 

 

 ■ 컨테스트 내용   

     。사전 제시된 미션을 BizFlow M을 사용하여 구현한 후, 기한 내에 제출함 

     。미션 링크 : https://www.notion.so/HGU-X-AppDev-2022-Precontest-473e3aed71554cf2899238fd49ca3d6b

     。컨테스트 미션에 대한 설명 영상https://youtu.be/od_lQFIrj7g

     。이번 컨테스트 진행 중 질문답변을 위해 다음 링크를 사용하기 바랍니다.    

       클라썸 입장 링크: www.classum.com/EXSTQA 

 

 ■ 팀 구성 : 1~3인으로 팀 구성 (개인 참가 가능)



 ■ 수상팀에게는 여름방학 중에 진행되는 본 컨테스트 출전 자격이 주어집니다.

    1) 최우수상 : 1팀 60만원

     2) 우수상 : 5팀 내외 40만원

     3) 장려상 : 10팀 내외 20만원

     4) 참가상 : 기념품 지급

 

                    * 지적재산권 동의서 양식 첨부파일 확인 


") - .viewCnt(0) - .importance(true) - .pubDate(LocalDate.of(2022, Month.MAY, 24)) - .expDate(LocalDate.of(2022, Month.MAY, 30)) - .build()); + .manager(l.get(2)) + .title("2022 BizFlow M Pre-Contest (신청기간연장 ~6.7(화))") + .content("


                                                                                         

 

 ■  접수기간 : 2022년 5월 25일 (수) ~ 6월 7일 (화)

 

 ■  접수링크 : https://docs.google.com/forms/d/1BR9IKalGSdDPKR4Hi6dvW8dpL57dKhvfz0oliJatRno/edit

         

 ■  참가자격

      한동대학교 재학생으로서 다음 사항 중 1개라도 해당되는 팀 (휴학생 팀원 참여 가능)

      1) 팀원 중 BizFlow Camp 수료자가 있는 경우

      2) 팀원 중 이전 BizFlow AppDev Contest 수상자(참가상 포함)가 있는 경우

      3) 팀원 중 BizFlow AppDev 사용 경험자가 있는 경우

      4) 팀원 모두 BizFlow AppDev 사용 경험은 없지만, 웹사이트 제작 경험이 있는 경우 

 

 ■ 컨테스트 내용   

     。사전 제시된 미션을 BizFlow M을 사용하여 구현한 후, 기한 내에 제출함 

     。미션 링크 : https://www.notion.so/HGU-X-AppDev-2022-Precontest-473e3aed71554cf2899238fd49ca3d6b

     。컨테스트 미션에 대한 설명 영상https://youtu.be/od_lQFIrj7g

     。이번 컨테스트 진행 중 질문답변을 위해 다음 링크를 사용하기 바랍니다.    

       클라썸 입장 링크: www.classum.com/EXSTQA 

 

 ■ 팀 구성 : 1~3인으로 팀 구성 (개인 참가 가능)



 ■ 수상팀에게는 여름방학 중에 진행되는 본 컨테스트 출전 자격이 주어집니다.

    1) 최우수상 : 1팀 60만원

     2) 우수상 : 5팀 내외 40만원

     3) 장려상 : 10팀 내외 20만원

     4) 참가상 : 기념품 지급

 

                    * 지적재산권 동의서 양식 첨부파일 확인 


") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.MAY, 24)) + .expDate(LocalDate.of(2022, Month.MAY, 30)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(3)) - .title("2022-2 사전 학점인정 안내(타대학 교환·학점교류)") - .content("

22-2학기 타대학 교환·학점교류를 통해 전산전자공학부의 컴퓨터공학(심화), 전자공학(심화) 전공 학점으로 인정받고자 하는 학생은, 아래의 내용을 확인하시고 사전학점인정원 제출하시기 바랍니다.



1. 신청기간: ~2022.8.14.

     * 각 대학마다 수강신청기간이 다르므로, 본인 대학 수강신청기간 전에 신청 바람



2. 제출서류: 사전학점인정원, 해당 과목 강의계획서



3. 제출방법: csee@handong.edu로 온라인 제출



4. 사전학점인정 절차

  가. 학생이 학부사무실로 사전학점인정원 제출

  나. 해당 전공의 프로그램위원회에서 제출된 자료 검토하여 학점인정 여부 판단

  다. 검토완료 된 사전학점인정원을 학부사무실에서 학생 메일로 송부



5. 유의사항

  가. 각 대학마다 수강신청기간이 다르므로, 사전학점인정 승인 받은 후 수강신청 할 수 있도록 시간 여유를 두고 미리 신청 바람

  나. 본인서명 필수 /  담당교수 확인란은 비워 제출

  다. '해당전공'란은 컴퓨터공학 or 전자공학을 기입

  라. 이전 학기에 학점교류를 통해 전공 인정받은 학생의 경우 아래 내용 함께 제출

    1) 이전 교류대학명: 

    2) 인정 과목명:

    3) 총 인정학점:

  마. 사전학점인정원 승인을 받았더라도, 다른 수강 교과목과 내용이 중복되는 경우 추후 학점인정을 받지 못할 수 있음





문의 : 260-1414 / csee@handong.edu

") - .viewCnt(0) - .importance(false) - .pubDate(LocalDate.of(2022, Month.JUNE, 2)) - .expDate(LocalDate.of(2022, Month.JUNE, 15)) - .build()); + .manager(l.get(3)) + .title("2022-2 사전 학점인정 안내(타대학 교환·학점교류)") + .content("

22-2학기 타대학 교환·학점교류를 통해 전산전자공학부의 컴퓨터공학(심화), 전자공학(심화) 전공 학점으로 인정받고자 하는 학생은, 아래의 내용을 확인하시고 사전학점인정원 제출하시기 바랍니다.



1. 신청기간: ~2022.8.14.

     * 각 대학마다 수강신청기간이 다르므로, 본인 대학 수강신청기간 전에 신청 바람



2. 제출서류: 사전학점인정원, 해당 과목 강의계획서



3. 제출방법: csee@handong.edu로 온라인 제출



4. 사전학점인정 절차

  가. 학생이 학부사무실로 사전학점인정원 제출

  나. 해당 전공의 프로그램위원회에서 제출된 자료 검토하여 학점인정 여부 판단

  다. 검토완료 된 사전학점인정원을 학부사무실에서 학생 메일로 송부



5. 유의사항

  가. 각 대학마다 수강신청기간이 다르므로, 사전학점인정 승인 받은 후 수강신청 할 수 있도록 시간 여유를 두고 미리 신청 바람

  나. 본인서명 필수 /  담당교수 확인란은 비워 제출

  다. '해당전공'란은 컴퓨터공학 or 전자공학을 기입

  라. 이전 학기에 학점교류를 통해 전공 인정받은 학생의 경우 아래 내용 함께 제출

    1) 이전 교류대학명: 

    2) 인정 과목명:

    3) 총 인정학점:

  마. 사전학점인정원 승인을 받았더라도, 다른 수강 교과목과 내용이 중복되는 경우 추후 학점인정을 받지 못할 수 있음





문의 : 260-1414 / csee@handong.edu

") + .viewCnt(0) + .importance(false) + .pubDate(LocalDate.of(2022, Month.JUNE, 2)) + .expDate(LocalDate.of(2022, Month.JUNE, 15)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(4)) - .title("2022년 8월 졸업생 학위증 및 상장 교부 안내") - .content("

9/2(금) 15시까지 신청 건 우편 발송되었습니다. 

 

---------------------------------------------------------------------------

 

안녕하세요?

전산전자공학부입니다.



졸업을 진심으로 축하드립니다.\uD83C\uDF89



학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.



우편(착불 4500원 정도)으로 받고자 하는 학생은 

9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.



이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.



<유의사항>

1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.

2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.



감사합니다:D



문의) 전산전자공학부사무실 260-1414

") - .viewCnt(0) - .importance(true) - .pubDate(LocalDate.of(2022, Month.JUNE, 7)) - .expDate(LocalDate.of(2022, Month.JUNE, 29)) - .build()); + .manager(l.get(4)) + .title("2022년 8월 졸업생 학위증 및 상장 교부 안내") + .content("

9/2(금) 15시까지 신청 건 우편 발송되었습니다. 

 

---------------------------------------------------------------------------

 

안녕하세요?

전산전자공학부입니다.



졸업을 진심으로 축하드립니다.\uD83C\uDF89



학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.



우편(착불 4500원 정도)으로 받고자 하는 학생은 

9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.



이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.



<유의사항>

1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.

2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.



감사합니다:D



문의) 전산전자공학부사무실 260-1414

") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.JUNE, 7)) + .expDate(LocalDate.of(2022, Month.JUNE, 29)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(4)) - .title("2022년 8월 졸업생 학위증 및 상장 교부 안내") - .content("

9/2(금) 15시까지 신청 건 우편 발송되었습니다. 

 

---------------------------------------------------------------------------

 

안녕하세요?

전산전자공학부입니다.



졸업을 진심으로 축하드립니다.\uD83C\uDF89



학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.



우편(착불 4500원 정도)으로 받고자 하는 학생은 

9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.



이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.



<유의사항>

1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.

2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.



감사합니다:D



문의) 전산전자공학부사무실 260-1414

") - .viewCnt(0) - .importance(true) - .pubDate(LocalDate.of(2022, Month.JUNE, 21)) - .expDate(LocalDate.of(2022, Month.JUNE, 27)) - .build()); + .manager(l.get(4)) + .title("2022년 8월 졸업생 학위증 및 상장 교부 안내") + .content("

9/2(금) 15시까지 신청 건 우편 발송되었습니다. 

 

---------------------------------------------------------------------------

 

안녕하세요?

전산전자공학부입니다.



졸업을 진심으로 축하드립니다.\uD83C\uDF89



학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.



우편(착불 4500원 정도)으로 받고자 하는 학생은 

9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.



이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.



<유의사항>

1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.

2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.



감사합니다:D



문의) 전산전자공학부사무실 260-1414

") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.JUNE, 21)) + .expDate(LocalDate.of(2022, Month.JUNE, 27)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(3)) - .title("[BK21 인공지능 교육연구단] 2022-2 참여대학원생 등록서류 제출 및 연구장학금 신청 안내") - .content("

한동대학교 BK21 인공지능 사업단

2022학년도 2학기 참여대학원생 등록서류 제출 및 연구장학금 신청 안내

 

 

한동대학교 전산전자공학과 4단계 BK21 ‘산업혁신을 위한 AI 고급 인재교육연구단’ (BK21 인공지능사업단)에서 다음과 같이 등록 서류를 제출하여주시기 바랍니다.

 


1. 4단계 BK21 참여대학원생 기준 (다음의 조건을 모두 충족한 자)

BK21 참여교수의 지도학생 중 전일제(4대보험에 가입되어 있지 않은 학생)로 등록(연구생 등록 포함)한 석·박사과정 대학원생으로 다음 각 호에 해당하는 자

-입학한 지 2년이 지나지 않은 석사과정생

-입학한 지 4년이 지나지 않은 박사과정생 및 박사 수료생

-입학한 지 6년이 지나지 않은 석박통합과정생 및 석박통합과정 수료생

(위의 기간 기산 시 휴학 및 군복무 기간은 제외함).

 

위의 자격을 충족한 경우 ‘참여대학원생’으로 등록되어 ‘지원대학원생’ 선발 기회 등 BK21 사업의 지원을 받을 수 있음.

 

2. 지원대학원생 선발 및 연구장학금 지급

1) 참여대학원생으로 등록된 학생 중 70% 이내의 대학원생을 ‘지원대학원생’으로 선발해 연구장학금을 지급함.

2) 지원기간: 2022.09.01.~2023.02.28. (6개월 단위로 선발)

3) 선발기준: 지도교수 추천을 받은 참여대학원생 중 연구/프로젝트 성과 평가에 의해 선발

4) 역할 및 임무

- BK21 참여교수 연구실에서 논문 연구 및 산학 프로젝트를 성실히 수행 (주 40시간 이상)

- 사업단이 주관하는 각종 세미나, 포럼 등의 학술 활동에 참여

- 사업단이 요구하는 성과 자료 보고

 


3. 참여대학원생 등록서류 제출안내(등록서류는 단순참여, 장학금 지원 받는 학생 모두 제출해주세요.)

1) 첨부된 제출서류 다운 및 작성 후 BK21 사업단 사무실로 서류 제출.

2) 지도교수로부터 지원대학원생(장학금 받는 학생)으로 추천받은 대학원생은 5.제출서류 함께 제출

 

4. 서류 제출 기간: 2022년 8월 29일(월) 13:00 - 9월 7일(수) 17:00 (제출기한 엄수)




5. 제출서류

- 연구자등록번호 발급 방법

: KRI(한국연구업적통합정보시스템 http://www.kri.go.kr)에 접속 회원가입→연구자등록번호 발급 

  (가입 시 소속을 반드시 ‘한동대학교’로 가입) 



1) 재학증명서 1부. 연구생등록자의 경우 연구생등록증 1부(2022년 9월 1일자 기준으로 제출)

2) 개인정보 수집 이용 제공 동의서 1부. (BK사업에 처음 참여하는 학생만 제출)

3) 참여인력 서약서 1부. 

4) 참여대학원생 확약서 1부.

5) BK21 연구장학금 신청서 1부. (지원대학원생-BK장학금 받는 학생만 제출)

6) 전산전자공학과 학기 보고서 1부.

7) 재학증명서 1부.(9월 1일 기준)

 

8) 연구재단 필수 제출 서류 '4대 보험 가입 증명서' 1부. (22.10.1일 기준일로하여 메일로 회신)

(**10월1일 기준으로 출력 후 제출 바랍니다. 9월에는 제출하지 않아도 됩니다!)

- 출력 방법: 4대 사회보험 포털서비스(http://www.4insure.or.kr) 로그인(회원가입, 공인인증서 필요) → 상단 메뉴 증명서발급(가입내역확인) 클릭 후 출력

 

9) 대학원 성적표 1부. (신입생은 제출X)

 

<한국연구재단 필수 수강!!-참여기간 중 1회 수강 후 수료증 제출해야함, 교육 미이수자 및  22-2학기 신입생만 수강하면 됩니다.>

10) 온라인 교육 수료증 (http://alpha-campus.kr/) 에 접속하여 로그인 후 상단 메뉴의 '탐색'->'온라인교육' -> '건강한 연구환경 조성을 위한 인권침해예방교육'클릭 ->'수강신청' 클릭 후 팝업창에서 수강신청 정보 확인 및 '신청완료'-> '학습'-> '학습중과정'-> '건강한 연구환경 조성을 위한 인권침해예방교육' 순서대로 클릭 후 '학습하기'

컨텐츠 수강 후 ‘MY'-> '학습이력'클릭 후 수료증 발급 및 보관) 

*수료증은 메일로 회신부탁합니다. 

 

11) 통장사본 및 신분증 사본 각 1부.

 

※ 외국인 참여대학원생의 경우 외국인 등록증 앞, 뒤 사본(D-2비자 여부 및 만료기한 확인) 제출.

※ 기존 참여대학원생이 지원할 경우: 2)개인정보 수집 이용 제공 동의서, 10)온라인 교육 수료증 제출 생략.

 

6. 서류 제출 및 문의처

1) BK21사업단 사무실: 뉴턴홀 309호 전산전자공학부 사무실 담당자 고라경(Tel: 260-3150)

2) 신청 시 모든 서류는 위 제출서류 순서대로 정리하여 원본 제출 바랍니다.

 

7. 유의사항: 제출된 서류는 반환하지 않으며, 허위사실 기재 시 선발을 취소함.

") - .viewCnt(0) - .importance(false) - .pubDate(LocalDate.of(2022, Month.JULY, 1)) - .expDate(LocalDate.of(2022, Month.JULY, 14)) - .build()); + .manager(l.get(3)) + .title("[BK21 인공지능 교육연구단] 2022-2 참여대학원생 등록서류 제출 및 연구장학금 신청 안내") + .content("

한동대학교 BK21 인공지능 사업단

2022학년도 2학기 참여대학원생 등록서류 제출 및 연구장학금 신청 안내

 

 

한동대학교 전산전자공학과 4단계 BK21 ‘산업혁신을 위한 AI 고급 인재교육연구단’ (BK21 인공지능사업단)에서 다음과 같이 등록 서류를 제출하여주시기 바랍니다.

 


1. 4단계 BK21 참여대학원생 기준 (다음의 조건을 모두 충족한 자)

BK21 참여교수의 지도학생 중 전일제(4대보험에 가입되어 있지 않은 학생)로 등록(연구생 등록 포함)한 석·박사과정 대학원생으로 다음 각 호에 해당하는 자

-입학한 지 2년이 지나지 않은 석사과정생

-입학한 지 4년이 지나지 않은 박사과정생 및 박사 수료생

-입학한 지 6년이 지나지 않은 석박통합과정생 및 석박통합과정 수료생

(위의 기간 기산 시 휴학 및 군복무 기간은 제외함).

 

위의 자격을 충족한 경우 ‘참여대학원생’으로 등록되어 ‘지원대학원생’ 선발 기회 등 BK21 사업의 지원을 받을 수 있음.

 

2. 지원대학원생 선발 및 연구장학금 지급

1) 참여대학원생으로 등록된 학생 중 70% 이내의 대학원생을 ‘지원대학원생’으로 선발해 연구장학금을 지급함.

2) 지원기간: 2022.09.01.~2023.02.28. (6개월 단위로 선발)

3) 선발기준: 지도교수 추천을 받은 참여대학원생 중 연구/프로젝트 성과 평가에 의해 선발

4) 역할 및 임무

- BK21 참여교수 연구실에서 논문 연구 및 산학 프로젝트를 성실히 수행 (주 40시간 이상)

- 사업단이 주관하는 각종 세미나, 포럼 등의 학술 활동에 참여

- 사업단이 요구하는 성과 자료 보고

 


3. 참여대학원생 등록서류 제출안내(등록서류는 단순참여, 장학금 지원 받는 학생 모두 제출해주세요.)

1) 첨부된 제출서류 다운 및 작성 후 BK21 사업단 사무실로 서류 제출.

2) 지도교수로부터 지원대학원생(장학금 받는 학생)으로 추천받은 대학원생은 5.제출서류 함께 제출

 

4. 서류 제출 기간: 2022년 8월 29일(월) 13:00 - 9월 7일(수) 17:00 (제출기한 엄수)




5. 제출서류

- 연구자등록번호 발급 방법

: KRI(한국연구업적통합정보시스템 http://www.kri.go.kr)에 접속 회원가입→연구자등록번호 발급 

  (가입 시 소속을 반드시 ‘한동대학교’로 가입) 



1) 재학증명서 1부. 연구생등록자의 경우 연구생등록증 1부(2022년 9월 1일자 기준으로 제출)

2) 개인정보 수집 이용 제공 동의서 1부. (BK사업에 처음 참여하는 학생만 제출)

3) 참여인력 서약서 1부. 

4) 참여대학원생 확약서 1부.

5) BK21 연구장학금 신청서 1부. (지원대학원생-BK장학금 받는 학생만 제출)

6) 전산전자공학과 학기 보고서 1부.

7) 재학증명서 1부.(9월 1일 기준)

 

8) 연구재단 필수 제출 서류 '4대 보험 가입 증명서' 1부. (22.10.1일 기준일로하여 메일로 회신)

(**10월1일 기준으로 출력 후 제출 바랍니다. 9월에는 제출하지 않아도 됩니다!)

- 출력 방법: 4대 사회보험 포털서비스(http://www.4insure.or.kr) 로그인(회원가입, 공인인증서 필요) → 상단 메뉴 증명서발급(가입내역확인) 클릭 후 출력

 

9) 대학원 성적표 1부. (신입생은 제출X)

 

<한국연구재단 필수 수강!!-참여기간 중 1회 수강 후 수료증 제출해야함, 교육 미이수자 및  22-2학기 신입생만 수강하면 됩니다.>

10) 온라인 교육 수료증 (http://alpha-campus.kr/) 에 접속하여 로그인 후 상단 메뉴의 '탐색'->'온라인교육' -> '건강한 연구환경 조성을 위한 인권침해예방교육'클릭 ->'수강신청' 클릭 후 팝업창에서 수강신청 정보 확인 및 '신청완료'-> '학습'-> '학습중과정'-> '건강한 연구환경 조성을 위한 인권침해예방교육' 순서대로 클릭 후 '학습하기'

컨텐츠 수강 후 ‘MY'-> '학습이력'클릭 후 수료증 발급 및 보관) 

*수료증은 메일로 회신부탁합니다. 

 

11) 통장사본 및 신분증 사본 각 1부.

 

※ 외국인 참여대학원생의 경우 외국인 등록증 앞, 뒤 사본(D-2비자 여부 및 만료기한 확인) 제출.

※ 기존 참여대학원생이 지원할 경우: 2)개인정보 수집 이용 제공 동의서, 10)온라인 교육 수료증 제출 생략.

 

6. 서류 제출 및 문의처

1) BK21사업단 사무실: 뉴턴홀 309호 전산전자공학부 사무실 담당자 고라경(Tel: 260-3150)

2) 신청 시 모든 서류는 위 제출서류 순서대로 정리하여 원본 제출 바랍니다.

 

7. 유의사항: 제출된 서류는 반환하지 않으며, 허위사실 기재 시 선발을 취소함.

") + .viewCnt(0) + .importance(false) + .pubDate(LocalDate.of(2022, Month.JULY, 1)) + .expDate(LocalDate.of(2022, Month.JULY, 14)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(2)) - .title("2022 한동 SW페스티벌 수상자 안내 및 서류 제출 요청(10월 19일(수)까지)") - .content("

2022 한동 SW페스티벌 수상자 안내 및 서류 제출 요청(10월 19일(수)까지)

  

'2022 한동 SW페스티벌'에 참여한 모든 참가자들에게 감사드리며 수상팀을 안내드립니다. 

자세한 수상팀 명단은 첨부파일에서 확인 가능합니다.

수상한 모든 팀들 축하드립니다. 



[상금]

수상팀 제출 서류는 아래 설문지를 통해 팀대표 1명만 제출바랍니다.(팀장이 대표로 수령)

서류 제출 마감일은 10월 19일(수)입니다. 빠른 상금 수령을 위해 마감 기한을 꼭 지켜주세요!!

설문지로 바로이동



[상장]

배부기간: 10.20(목) ~ 21(금). 팀별 1부 발급

배  부  처: SW중심대학지원사업단, 뉴턴홀 218호

   * 상장 수령 시 개인정보 이용 동의서 서명도 함께 해주세요.

 

 

문의 : SW중심대학 지원사업단 이윤정(260-1478 / lyj1515@handong.edu)

") - .viewCnt(0) - .importance(false) - .pubDate(LocalDate.of(2022, Month.JULY, 7)) - .expDate(LocalDate.of(2022, Month.JULY, 12)) - .build()); + .manager(l.get(2)) + .title("2022 한동 SW페스티벌 수상자 안내 및 서류 제출 요청(10월 19일(수)까지)") + .content("

2022 한동 SW페스티벌 수상자 안내 및 서류 제출 요청(10월 19일(수)까지)

  

'2022 한동 SW페스티벌'에 참여한 모든 참가자들에게 감사드리며 수상팀을 안내드립니다. 

자세한 수상팀 명단은 첨부파일에서 확인 가능합니다.

수상한 모든 팀들 축하드립니다. 



[상금]

수상팀 제출 서류는 아래 설문지를 통해 팀대표 1명만 제출바랍니다.(팀장이 대표로 수령)

서류 제출 마감일은 10월 19일(수)입니다. 빠른 상금 수령을 위해 마감 기한을 꼭 지켜주세요!!

설문지로 바로이동



[상장]

배부기간: 10.20(목) ~ 21(금). 팀별 1부 발급

배  부  처: SW중심대학지원사업단, 뉴턴홀 218호

   * 상장 수령 시 개인정보 이용 동의서 서명도 함께 해주세요.

 

 

문의 : SW중심대학 지원사업단 이윤정(260-1478 / lyj1515@handong.edu)

") + .viewCnt(0) + .importance(false) + .pubDate(LocalDate.of(2022, Month.JULY, 7)) + .expDate(LocalDate.of(2022, Month.JULY, 12)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(1)) - .title("[전산전자공학부] 2022 CSEE Lab Week에 초대합니다.") - .content("

안녕하세요? \"\uD83D\uDCBB\"

전산전자공학부, 일반대학원 전산전자공학과가 9주차 10/24(월)~10/28(금)에 각 연구실에 대해 알아가고 다양한 연구의 내용을 공유하는 시간을 가지려고 합니다. 



저희 전산전자공학부, 일반대학원 전산전자공학과에서 어떤 주제의 연구들을 진행하고 있는지 Lab설명회, 포스터세션을 통해 이야기를 듣고 싶은 학생들의 많은 참여 바랍니다. 



행사에 참석하면 입시관련된 정보 또한 얻을 수 있으니 AI를 포함한 ICT관련 분야 진학에 관심있는 모든 학부생들의 참여를 환영합니다. 



\"d24;\"온라인 Lab 멘토링 실시 (기간: 10/24(월)~10/28(금))

(아래 링크접속 후 각 Lab의 오픈카톡방을 통한 자유로운 상담 가능)


https://docs.google.com/document/d/1vPNIac3vfuBxzr3-IsqVqEAFwJtA-6dXiE_RvKhXJHo/edit#

 

 

\"d24;\" Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성

제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.

https://forms.gle/a8XWyqXcTec8vdwq5

 

 

\"d24;\" CSEE Lab Week 행사 참석 희망자(만찬 참여 포함)는 아래 설문지 필수 작성


https://docs.google.com/forms/d/1wkUWbYgcPFFTfrI-M3aOonQYRd_Oq6VHugJx6rVkuRE/edit?pli=1



**10/28(금)** 포스터세션이 종료되고 만찬(오후 5시 예정)이 있을 예정입니다.

만찬은 인원수 제한으로 선착순으로 신청을 받습니다.






\"\uD83C\uDF81\"event\"\uD83C\uDF81\" CSEE Lab Week 참가자 커피쿠폰 증정 

 

 

* 문의: 전산전자공학과 고라경 선생님 (전화: 054-260-3150)

") - .viewCnt(0) - .importance(true) - .pubDate(LocalDate.of(2022, Month.AUGUST, 5)) - .expDate(LocalDate.of(2022, Month.AUGUST, 25)) - .build()); + .manager(l.get(1)) + .title("[전산전자공학부] 2022 CSEE Lab Week에 초대합니다.") + .content("

안녕하세요? \"\uD83D\uDCBB\"

전산전자공학부, 일반대학원 전산전자공학과가 9주차 10/24(월)~10/28(금)에 각 연구실에 대해 알아가고 다양한 연구의 내용을 공유하는 시간을 가지려고 합니다. 



저희 전산전자공학부, 일반대학원 전산전자공학과에서 어떤 주제의 연구들을 진행하고 있는지 Lab설명회, 포스터세션을 통해 이야기를 듣고 싶은 학생들의 많은 참여 바랍니다. 



행사에 참석하면 입시관련된 정보 또한 얻을 수 있으니 AI를 포함한 ICT관련 분야 진학에 관심있는 모든 학부생들의 참여를 환영합니다. 



\"d24;\"온라인 Lab 멘토링 실시 (기간: 10/24(월)~10/28(금))

(아래 링크접속 후 각 Lab의 오픈카톡방을 통한 자유로운 상담 가능)


https://docs.google.com/document/d/1vPNIac3vfuBxzr3-IsqVqEAFwJtA-6dXiE_RvKhXJHo/edit#

 

 

\"d24;\" Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성

제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.

https://forms.gle/a8XWyqXcTec8vdwq5

 

 

\"d24;\" CSEE Lab Week 행사 참석 희망자(만찬 참여 포함)는 아래 설문지 필수 작성


https://docs.google.com/forms/d/1wkUWbYgcPFFTfrI-M3aOonQYRd_Oq6VHugJx6rVkuRE/edit?pli=1



**10/28(금)** 포스터세션이 종료되고 만찬(오후 5시 예정)이 있을 예정입니다.

만찬은 인원수 제한으로 선착순으로 신청을 받습니다.






\"\uD83C\uDF81\"event\"\uD83C\uDF81\" CSEE Lab Week 참가자 커피쿠폰 증정 

 

 

* 문의: 전산전자공학과 고라경 선생님 (전화: 054-260-3150)

") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.AUGUST, 5)) + .expDate(LocalDate.of(2022, Month.AUGUST, 25)) + .build()); noticeRepository.save(Notice.builder() - .manager(l.get(0)) - .title("2022-2 비교과 졸업요건 서류 제출 안내(~12/16)") - .content("

안녕하세요?

17학번이후인 1전공 컴퓨터공학/AI·컴퓨터공학심화 학생 중 캡스톤디자인 교과목 수강생 및 2023.2월 졸업예정자에게 안내드립니다.

비교과 졸업요건 만족 여부 확인을 위해 첨부 된 양식 작성하여 구글폼으로 제출해주시기 바랍니다.

   * 비교과 졸업요건은 히즈넷-학생 졸업심사화면의 '학부추가졸업요건'에 해당합니다.

   * 해당 학생들에게는 문자로 안내하였습니다.

<17학번부터 적용되는 비교과 졸업요건>

- 산학프로젝트 1개 이상 수행 (산학R&D프로젝트, 또는 산학연계 교과목프로젝트 (예: 캡스톤디자인))

- 캡스톤프로젝트 결과물 등을 특허, 논문, SW시제품 중 한 가지 형태로 1건 이상 제출하여야 함 (공동 출원자/저자 모두 인정).

- 비교과 졸업요건은 캡스톤디자인 과목을 산학 주제로 수행한 결과를 논문 발표, 특허출원, 또는 SW등록함으로써 자연스럽게 충족 가능함.

1. 제출기한: 16주차 금요일(12/16)까지

2. 제출방법: 구글폼(https://forms.gle/Q7X1VfJL176h2TJ38) 제출

  - 23.2월에 졸업하는 경우, 12/16(금)까지 제출하셔야 졸업 가능합니다.(다음학기 ‘학사학위취득유예’ 학생 포함)

  - 23.2월에 졸업하지 않는 경우, 다음 학기에 제출하실 수 있습니다.(구글폼에 '졸업안함' 제출)

3. 참고사항

  가. 이전에 증빙서류로 제출하였던 사례

    1) 논문: 정식 게재된 목차 및 논문 스캔본, 발표 포스터 스캔본

    2) 특허: 특허청의 공식 문서로 출원번호 또는 등록번호와 발명자 정보(주소지 포함)가 기재되어 있는 서류

                 (특허출원서, 특허증, 공개특허공보, 등록특허공보 중 1개 선택)

    3) 시제품제작 (아래 3개 항목 중 1가지 선택)

      가) SW등록: SW등록증, 프로그램등록신청명세서, 저작권 등록증 등

      나) 앱 출시: 출시 된 앱의 스토어 게시 화면 캡쳐 이미지, 앱 출시 확인서 사본 등

      다) 상용서비스 수준 확인 : 산학프로젝트 참여 기업체의 담당자 또는 기업체 멘토가 작성한 시제품 확인서(첨부 양식)

  나. 자주묻는질문

    1) 비교과 졸업요건을 충족하기 위한 결과물은 꼭 캡스톤디자인의 결과물이어야 하나요?

          - 반드시 캡스톤 결과물이어야 할 필요는 없습니다.

    2) 저작권 등록을 한 학생이 대표로 하게되어 등록증에 한명의 이름만 기재되는데 어떻게 하나요?

          - 등록증에 들어있는 제목과 캡스톤 제목이 일치하면 같은 팀원에게 동일하게 적용됩니다.                                            다만, 서류는 개인별로 제출하셔야 합니다.



문의) csee@handong.edu

") - .viewCnt(0) - .importance(true) - .pubDate(LocalDate.of(2022, Month.AUGUST, 8)) - .expDate(LocalDate.of(2022, Month.DECEMBER, 16)) - .build()); + .manager(l.get(0)) + .title("2022-2 비교과 졸업요건 서류 제출 안내(~12/16)") + .content("

안녕하세요?

17학번이후인 1전공 컴퓨터공학/AI·컴퓨터공학심화 학생 중 캡스톤디자인 교과목 수강생 및 2023.2월 졸업예정자에게 안내드립니다.

비교과 졸업요건 만족 여부 확인을 위해 첨부 된 양식 작성하여 구글폼으로 제출해주시기 바랍니다.

   * 비교과 졸업요건은 히즈넷-학생 졸업심사화면의 '학부추가졸업요건'에 해당합니다.

   * 해당 학생들에게는 문자로 안내하였습니다.

<17학번부터 적용되는 비교과 졸업요건>

- 산학프로젝트 1개 이상 수행 (산학R&D프로젝트, 또는 산학연계 교과목프로젝트 (예: 캡스톤디자인))

- 캡스톤프로젝트 결과물 등을 특허, 논문, SW시제품 중 한 가지 형태로 1건 이상 제출하여야 함 (공동 출원자/저자 모두 인정).

- 비교과 졸업요건은 캡스톤디자인 과목을 산학 주제로 수행한 결과를 논문 발표, 특허출원, 또는 SW등록함으로써 자연스럽게 충족 가능함.

1. 제출기한: 16주차 금요일(12/16)까지

2. 제출방법: 구글폼(https://forms.gle/Q7X1VfJL176h2TJ38) 제출

  - 23.2월에 졸업하는 경우, 12/16(금)까지 제출하셔야 졸업 가능합니다.(다음학기 ‘학사학위취득유예’ 학생 포함)

  - 23.2월에 졸업하지 않는 경우, 다음 학기에 제출하실 수 있습니다.(구글폼에 '졸업안함' 제출)

3. 참고사항

  가. 이전에 증빙서류로 제출하였던 사례

    1) 논문: 정식 게재된 목차 및 논문 스캔본, 발표 포스터 스캔본

    2) 특허: 특허청의 공식 문서로 출원번호 또는 등록번호와 발명자 정보(주소지 포함)가 기재되어 있는 서류

                 (특허출원서, 특허증, 공개특허공보, 등록특허공보 중 1개 선택)

    3) 시제품제작 (아래 3개 항목 중 1가지 선택)

      가) SW등록: SW등록증, 프로그램등록신청명세서, 저작권 등록증 등

      나) 앱 출시: 출시 된 앱의 스토어 게시 화면 캡쳐 이미지, 앱 출시 확인서 사본 등

      다) 상용서비스 수준 확인 : 산학프로젝트 참여 기업체의 담당자 또는 기업체 멘토가 작성한 시제품 확인서(첨부 양식)

  나. 자주묻는질문

    1) 비교과 졸업요건을 충족하기 위한 결과물은 꼭 캡스톤디자인의 결과물이어야 하나요?

          - 반드시 캡스톤 결과물이어야 할 필요는 없습니다.

    2) 저작권 등록을 한 학생이 대표로 하게되어 등록증에 한명의 이름만 기재되는데 어떻게 하나요?

          - 등록증에 들어있는 제목과 캡스톤 제목이 일치하면 같은 팀원에게 동일하게 적용됩니다.                                            다만, 서류는 개인별로 제출하셔야 합니다.



문의) csee@handong.edu

") + .viewCnt(0) + .importance(true) + .pubDate(LocalDate.of(2022, Month.AUGUST, 8)) + .expDate(LocalDate.of(2022, Month.DECEMBER, 16)) + .build()); noticeRepository.save(Notice.builder() .manager(l.get(0)) .title("[이랜드이노플] 채용설명회 안내 및 수요조사") @@ -448,7 +447,7 @@ private void saveNotice() { noticeRepository.save(Notice.builder() .manager(l.get(1)) .title("[대학원] 세미나(11월 11일, 손현우 교수)-아날로그 연산기 기반의 학습가능한 신경망 시스템") - .content("

정보통신대학원 세미나를 소개합니다.

 

이번 세미나는 온.오프라인(한국어 강의)으로 진행 되며, 학부생, 대학원생, 교직원 누구나 참여 가능합니다. 

 

*특강에 참여한 전전 학부생들에게는(대학원생 제외) 소중대 마일리지를 적립해드리니, 관심있는 학생들의 많은 참여 바랍니다. (ZOOM 접속 후 닉네임을 학번, 이름으로 변경 필수!)

 

 

 

 

▶▶세미나5-정보통신대학원 세미나 2022년 2학기

 

 

 

 아날로그 연산기 기반의 학습가능한 신경망

 

손현우 교수

 

경상국립대학교

 

 

 초록



AI 알고리즘의 발전과 함께 IoT를 위한 에너지 효율적인 AI 하드웨어의 필요성이 증가하고 있다. 최근 BinaryNet 알고리즘을 이용하여 추론 과정에서 더 높은 효율을 위한 아날로그 연산기 기반의 하드웨어 가속기 [1] 가 제안되었지만, 학습과 추론이 가능한 AI 하드웨어는 여전히 상대적으로 높은 정확도의 곱셈과 함께 복잡한 학습 과정을 필요로 한다. 또한 인 메모리 하드웨어 구조는 적은 데이터 이동 및 대규모 병렬 동작으로 인하여 높은 에너지 효율과 낮은 지연 시간을 달성할 수 있지만, 아날로그 연산 특성 때문에 PVT 변화에 취약하여 오프라인으로 학습된 가중치를 사용시 상당한 성능저하를 유발할 수 있다. 최근 보고된 온칩 학습 가능한 오토인코더 [2] 와 서포트 벡터 머신 (SVM) [3] 은 소프트웨어로 입증된 AI 알고리즘의 아날로그 연산이 온칩 학습에 성공적으로 사용될 수 있음을 보여주었지만, 단일 오토인코더 유닛 또는 단일 레이어의 SVM으로 응용이 제한되었다. 본 논문 [4] 은 다층 신경망의 학습을 위해 널리 사용되는 오류 역전파 알고리즘을 수행하는 신경망 시스템을 제안한다 (그림. 1). 제안된 시스템의 한 구성 단위로서, 전류형 곱셈누적 연산 (MAC) 프로세서는 병렬 MAC연산으로 순전파 및 역전파를 모두 수행한다. 지도 학습을 위해, 제안된 시스템은 28nm CMOS 기술로 제작된 두 개의 프로세서 칩과 FPGA를 사용하여 두 레이어의 신경망에서 검증되었다. 제안된 시스템은 아날로그 기반 MAC을 위한 보정 회로 없이 동일한 아날로그 기반 MAC을 통해 학습 데이터를 학습함으로써 칩 대 칩 변화 및 아날로그 동작의 불완전성을 보상하였다. 제안된 시스템은 1-b (+1, 0, -1) 배치 업데이트를 사용하여 22×22의 사이즈로 조정된 MNIST 데이터 셋의 분류에서 약 97%의 인식률을 달성하였다.


 

*일시 11월 11일 (금), 16시~


* 장소 NTH412호

*ZOOM https://handong.zoom.us/j/86244954271

*회의ID 862 4495 4271

*문의 4단계 BK21 AI사업단 (260-3150)



") + .content("

정보통신대학원 세미나를 소개합니다.

 

이번 세미나는 온.오프라인(한국어 강의)으로 진행 되며, 학부생, 대학원생, 교직원 누구나 참여 가능합니다. 

 

*특강에 참여한 전전 학부생들에게는(대학원생 제외) 소중대 마일리지를 적립해드리니, 관심있는 학생들의 많은 참여 바랍니다. (ZOOM 접속 후 닉네임을 학번, 이름으로 변경 필수!)

 

 

 

 

▶▶세미나5-정보통신대학원 세미나 2022년 2학기

 

 

 

 아날로그 연산기 기반의 학습가능한 신경망

 

손현우 교수

 

경상국립대학교

 

 

 초록



AI 알고리즘의 발전과 함께 IoT를 위한 에너지 효율적인 AI 하드웨어의 필요성이 증가하고 있다. 최근 BinaryNet 알고리즘을 이용하여 추론 과정에서 더 높은 효율을 위한 아날로그 연산기 기반의 하드웨어 가속기 [1] 가 제안되었지만, 학습과 추론이 가능한 AI 하드웨어는 여전히 상대적으로 높은 정확도의 곱셈과 함께 복잡한 학습 과정을 필요로 한다. 또한 인 메모리 하드웨어 구조는 적은 데이터 이동 및 대규모 병렬 동작으로 인하여 높은 에너지 효율과 낮은 지연 시간을 달성할 수 있지만, 아날로그 연산 특성 때문에 PVT 변화에 취약하여 오프라인으로 학습된 가중치를 사용시 상당한 성능저하를 유발할 수 있다. 최근 보고된 온칩 학습 가능한 오토인코더 [2] 와 서포트 벡터 머신 (SVM) [3] 은 소프트웨어로 입증된 AI 알고리즘의 아날로그 연산이 온칩 학습에 성공적으로 사용될 수 있음을 보여주었지만, 단일 오토인코더 유닛 또는 단일 레이어의 SVM으로 응용이 제한되었다. 본 논문 [4] 은 다층 신경망의 학습을 위해 널리 사용되는 오류 역전파 알고리즘을 수행하는 신경망 시스템을 제안한다 (그림. 1). 제안된 시스템의 한 구성 단위로서, 전류형 곱셈누적 연산 (MAC) 프로세서는 병렬 MAC연산으로 순전파 및 역전파를 모두 수행한다. 지도 학습을 위해, 제안된 시스템은 28nm CMOS 기술로 제작된 두 개의 프로세서 칩과 FPGA를 사용하여 두 레이어의 신경망에서 검증되었다. 제안된 시스템은 아날로그 기반 MAC을 위한 보정 회로 없이 동일한 아날로그 기반 MAC을 통해 학습 데이터를 학습함으로써 칩 대 칩 변화 및 아날로그 동작의 불완전성을 보상하였다. 제안된 시스템은 1-b (+1, 0, -1) 배치 업데이트를 사용하여 22×22의 사이즈로 조정된 MNIST 데이터 셋의 분류에서 약 97%의 인식률을 달성하였다.


 

*일시 11월 11일 (금), 16시~


* 장소 NTH412호

*ZOOM https://handong.zoom.us/j/86244954271

*회의ID 862 4495 4271

*문의 4단계 BK21 AI사업단 (260-3150)



") .viewCnt(0) .importance(true) .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 9)) @@ -515,1006 +514,1456 @@ private void saveNotice() { private void saveStudent() { studentRepository.save(Student.builder() - .name("박성진") - .department(departementRepository.findByName("전산전자")) - .studentNum("21700266") - .semester(8) - .major1(majorRepository.findByName("컴퓨터공학심화전공")) - .major2(majorRepository.findByName("-")) - .phone("010-9484-4321") - .email("david@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@davidpiao.github") - .loginCnt(0L) - .readme("david's readme") - .build()); + .name("박성진") + .department(departementRepository.findByName("전산전자")) + .studentNum("21700266") + .semester(8) + .major1(majorRepository.findByName("컴퓨터공학심화전공")) + .major2(majorRepository.findByName("-")) + .phone("010-9484-4321") + .email("david@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@davidpiao.github") + .loginCnt(0L) + .readme("david's readme") + .build()); studentRepository.save(Student.builder() - .name("안병웅") - .department(departementRepository.findByName("생명과학")) - .studentNum("21600000") - .semester(6) - .major1(majorRepository.findByName("생명과학전공")) - .major2(majorRepository.findByName("-")) - .phone("010-1623-1512") - .email("mh03@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@wooong.github") - .loginCnt(0L) - .readme("an's readme") - .build()); + .name("안병웅") + .department(departementRepository.findByName("생명과학")) + .studentNum("21600000") + .semester(6) + .major1(majorRepository.findByName("생명과학전공")) + .major2(majorRepository.findByName("-")) + .phone("010-1623-1512") + .email("mh03@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wooong.github") + .loginCnt(0L) + .readme("an's readme") + .build()); studentRepository.save(Student.builder() - .name("홍성헌") - .department(departementRepository.findByName("커뮤니케이션")) - .studentNum("21800929") - .semester(8) - .major1(majorRepository.findByName("공연영상학전공")) - .major2(majorRepository.findByName("언로정보학전공")) - .phone("010-1623-3322") - .email("hong@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@hong.github") - .loginCnt(0L) - .readme("hong's readme") - .build()); + .name("홍성헌") + .department(departementRepository.findByName("커뮤니케이션")) + .studentNum("21800929") + .semester(8) + .major1(majorRepository.findByName("공연영상학전공")) + .major2(majorRepository.findByName("언로정보학전공")) + .phone("010-1623-3322") + .email("hong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@hong.github") + .loginCnt(0L) + .readme("hong's readme") + .build()); studentRepository.save(Student.builder() - .name("이인혁") - .department(departementRepository.findByName("기계제어")) - .studentNum("21700032") - .semester(5) - .major1(majorRepository.findByName("전자제어공학전공")) - .major2(majorRepository.findByName("기계공학전공")) - .phone("010-4983-6555") - .email("lee@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ee.github") - .loginCnt(0L) - .readme("lee's readme") - .build()); + .name("이인혁") + .department(departementRepository.findByName("기계제어")) + .studentNum("21700032") + .semester(5) + .major1(majorRepository.findByName("전자제어공학전공")) + .major2(majorRepository.findByName("기계공학전공")) + .phone("010-4983-6555") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); studentRepository.save(Student.builder() - .name("정석민") - .department(departementRepository.findByName("콘텐츠융합디자인")) - .studentNum("22000432") - .semester(3) - .major1(majorRepository.findByName("시각디자인전공")) - .major2(majorRepository.findByName("-")) - .phone("010-4983-6555") - .email("jeong@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jeong.github") - .loginCnt(0L) - .readme("jeong's readme") - .build()); + .name("정석민") + .department(departementRepository.findByName("콘텐츠융합디자인")) + .studentNum("22000432") + .semester(3) + .major1(majorRepository.findByName("시각디자인전공")) + .major2(majorRepository.findByName("-")) + .phone("010-4983-6555") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); studentRepository.save(Student.builder() - .name("송다빈") - .department(departementRepository.findByName("법학부")) - .studentNum("22000332") - .semester(3) - .major1(majorRepository.findByName("US & International Law")) - .major2(majorRepository.findByName("한국법전공")) - .phone("010-7788-0142") - .email("song@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@song.github") - .loginCnt(0L) - .readme("song's readme") - .build()); + .name("송다빈") + .department(departementRepository.findByName("법학부")) + .studentNum("22000332") + .semester(3) + .major1(majorRepository.findByName("US & International Law")) + .major2(majorRepository.findByName("한국법전공")) + .phone("010-7788-0142") + .email("song@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@song.github") + .loginCnt(0L) + .readme("song's readme") + .build()); studentRepository.save(Student.builder() - .name("김한동") - .department(departementRepository.findByName("전산전자")) - .studentNum("22200000") - .semester(5) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("생명과학전공")) - .phone("010-1234-1234") - .email("kim@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@kim.github") - .loginCnt(0L) - .readme("kim's readme") - .build()); + .name("김한동") + .department(departementRepository.findByName("전산전자")) + .studentNum("22200000") + .semester(5) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("생명과학전공")) + .phone("010-1234-1234") + .email("kim@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@kim.github") + .loginCnt(0L) + .readme("kim's readme") + .build()); studentRepository.save(Student.builder() - .name("박한동") - .department(departementRepository.findByName("국제어문")) - .studentNum("22200001") - .semester(3) - .major1(majorRepository.findByName("국제지역학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-1234-5678") - .email("park@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@park.github") - .loginCnt(0L) - .readme("park's readme") - .build()); + .name("박한동") + .department(departementRepository.findByName("국제어문")) + .studentNum("22200001") + .semester(3) + .major1(majorRepository.findByName("국제지역학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1234-5678") + .email("park@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@park.github") + .loginCnt(0L) + .readme("park's readme") + .build()); studentRepository.save(Student.builder() - .name("이한동") - .department(departementRepository.findByName("경영경제")) - .studentNum("22200002") - .semester(5) - .major1(majorRepository.findByName("경영학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-5678-1234") - .email("lee@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@lee.github") - .loginCnt(0L) - .readme("lee's readme") - .build()); + .name("이한동") + .department(departementRepository.findByName("경영경제")) + .studentNum("22200002") + .semester(5) + .major1(majorRepository.findByName("경영학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-5678-1234") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@lee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); studentRepository.save(Student.builder() - .name("정한동") - .department(departementRepository.findByName("법학부")) - .studentNum("22200003") - .semester(6) - .major1(majorRepository.findByName("한국법전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-1111-1111") - .email("jeong@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jeong.github") - .loginCnt(0L) - .readme("jeong's readme") - .build()); + .name("정한동") + .department(departementRepository.findByName("법학부")) + .studentNum("22200003") + .semester(6) + .major1(majorRepository.findByName("한국법전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1111-1111") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); studentRepository.save(Student.builder() - .name("우한동") - .department(departementRepository.findByName("커뮤니케이션")) - .studentNum("22200004") - .semester(6) - .major1(majorRepository.findByName("공연영상학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2222-3333") - .email("woo@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@woo.github") - .loginCnt(0L) - .readme("woo's readme") - .build()); + .name("우한동") + .department(departementRepository.findByName("커뮤니케이션")) + .studentNum("22200004") + .semester(6) + .major1(majorRepository.findByName("공연영상학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2222-3333") + .email("woo@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@woo.github") + .loginCnt(0L) + .readme("woo's readme") + .build()); studentRepository.save(Student.builder() - .name("위한동") - .department(departementRepository.findByName("상담복지")) - .studentNum("22200005") - .semester(6) - .major1(majorRepository.findByName("사회복지학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4444-1234") - .email("wi@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@wi.github") - .loginCnt(0L) - .readme("wi's readme") - .build()); + .name("위한동") + .department(departementRepository.findByName("상담복지")) + .studentNum("22200005") + .semester(6) + .major1(majorRepository.findByName("사회복지학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4444-1234") + .email("wi@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wi.github") + .loginCnt(0L) + .readme("wi's readme") + .build()); studentRepository.save(Student.builder() - .name("하한동") - .department(departementRepository.findByName("공간환경시스템")) - .studentNum("22200006") - .semester(8) - .major1(majorRepository.findByName("도시환경공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-9999-1111") - .email("ha@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ha.github") - .loginCnt(0L) - .readme("ha's readme") - .build()); + .name("하한동") + .department(departementRepository.findByName("공간환경시스템")) + .studentNum("22200006") + .semester(8) + .major1(majorRepository.findByName("도시환경공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-9999-1111") + .email("ha@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ha.github") + .loginCnt(0L) + .readme("ha's readme") + .build()); studentRepository.save(Student.builder() - .name("마한동") - .department(departementRepository.findByName("콘텐츠융합디자인")) - .studentNum("22200007") - .semester(4) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4312-4312") - .email("ma@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ma.github") - .loginCnt(0L) - .readme("ma's readme") - .build()); + .name("마한동") + .department(departementRepository.findByName("콘텐츠융합디자인")) + .studentNum("22200007") + .semester(4) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4312-4312") + .email("ma@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ma.github") + .loginCnt(0L) + .readme("ma's readme") + .build()); studentRepository.save(Student.builder() - .name("유한동") - .department(departementRepository.findByName("기계제어")) - .studentNum("22200008") - .semester(6) - .major1(majorRepository.findByName("기계공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-3434-2323") - .email("yu@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@yu.github") - .loginCnt(0L) - .readme("yu's readme") - .build()); + .name("유한동") + .department(departementRepository.findByName("기계제어")) + .studentNum("22200008") + .semester(6) + .major1(majorRepository.findByName("기계공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-3434-2323") + .email("yu@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@yu.github") + .loginCnt(0L) + .readme("yu's readme") + .build()); studentRepository.save(Student.builder() - .name("진한동") - .department(departementRepository.findByName("ICT창업학부")) - .studentNum("22200009") - .semester(7) - .major1(majorRepository.findByName("ICT 융합전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-8787-8787") - .email("jin@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jin.github") - .loginCnt(0L) - .readme("jin's readme") - .build()); + .name("진한동") + .department(departementRepository.findByName("ICT창업학부")) + .studentNum("22200009") + .semester(7) + .major1(majorRepository.findByName("ICT 융합전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-8787-8787") + .email("jin@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jin.github") + .loginCnt(0L) + .readme("jin's readme") + .build()); studentRepository.save(Student.builder() - .name("김건휘") - .department(departementRepository.findByName("전산전자")) - .studentNum("21700234") - .semester(2) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("생명과학전공")) - .phone("010-1234-1234") - .email("kim@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@kim.github") - .loginCnt(0L) - .readme("kim's readme") - .build()); + .name("김건휘") + .department(departementRepository.findByName("전산전자")) + .studentNum("21700234") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("생명과학전공")) + .phone("010-1234-1234") + .email("kim@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@kim.github") + .loginCnt(0L) + .readme("kim's readme") + .build()); studentRepository.save(Student.builder() - .name("이도경") - .department(departementRepository.findByName("국제어문")) - .studentNum("21200012") - .semester(9) - .major1(majorRepository.findByName("국제지역학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-1234-5678") - .email("park@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@park.github") - .loginCnt(0L) - .readme("park's readme") - .build()); + .name("이도경") + .department(departementRepository.findByName("국제어문")) + .studentNum("21200012") + .semester(9) + .major1(majorRepository.findByName("국제지역학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1234-5678") + .email("park@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@park.github") + .loginCnt(0L) + .readme("park's readme") + .build()); studentRepository.save(Student.builder() - .name("정민수") - .department(departementRepository.findByName("경영경제")) - .studentNum("22200032") - .semester(5) - .major1(majorRepository.findByName("경영학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-6655-4232") - .email("lee@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@lee.github") - .loginCnt(0L) - .readme("lee's readme") - .build()); + .name("정민수") + .department(departementRepository.findByName("경영경제")) + .studentNum("22200032") + .semester(5) + .major1(majorRepository.findByName("경영학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-6655-4232") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@lee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); studentRepository.save(Student.builder() - .name("조수아") - .department(departementRepository.findByName("법학부")) - .studentNum("21600223") - .semester(5) - .major1(majorRepository.findByName("한국법전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-9292-9292") - .email("jeong@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jeong.github") - .loginCnt(0L) - .readme("jeong's readme") - .build()); + .name("조수아") + .department(departementRepository.findByName("법학부")) + .studentNum("21600223") + .semester(5) + .major1(majorRepository.findByName("한국법전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-9292-9292") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); studentRepository.save(Student.builder() - .name("김빛나리") - .department(departementRepository.findByName("커뮤니케이션")) - .studentNum("22200023") - .semester(3) - .major1(majorRepository.findByName("공연영상학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2332-4333") - .email("woo@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@woo.github") - .loginCnt(0L) - .readme("woo's readme") - .build()); + .name("김빛나리") + .department(departementRepository.findByName("커뮤니케이션")) + .studentNum("22200023") + .semester(3) + .major1(majorRepository.findByName("공연영상학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2332-4333") + .email("woo@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@woo.github") + .loginCnt(0L) + .readme("woo's readme") + .build()); studentRepository.save(Student.builder() - .name("김혜린") - .department(departementRepository.findByName("상담복지")) - .studentNum("21900021") - .semester(4) - .major1(majorRepository.findByName("사회복지학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4444-1234") - .email("wi@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@wi.github") - .loginCnt(0L) - .readme("wi's readme") - .build()); + .name("김혜린") + .department(departementRepository.findByName("상담복지")) + .studentNum("21900021") + .semester(4) + .major1(majorRepository.findByName("사회복지학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4444-1234") + .email("wi@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wi.github") + .loginCnt(0L) + .readme("wi's readme") + .build()); studentRepository.save(Student.builder() - .name("이소희") - .department(departementRepository.findByName("공간환경시스템")) - .studentNum("21800002") - .semester(9) - .major1(majorRepository.findByName("도시환경공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-3221-6665") - .email("ha@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ha.github") - .loginCnt(0L) - .readme("ha's readme") - .build()); + .name("이소희") + .department(departementRepository.findByName("공간환경시스템")) + .studentNum("21800002") + .semester(9) + .major1(majorRepository.findByName("도시환경공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-3221-6665") + .email("ha@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ha.github") + .loginCnt(0L) + .readme("ha's readme") + .build()); studentRepository.save(Student.builder() - .name("이소연") - .department(departementRepository.findByName("콘텐츠융합디자인")) - .studentNum("21400025") - .semester(2) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4211-1123") - .email("ma@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ma.github") - .loginCnt(0L) - .readme("ma's readme") - .build()); + .name("이소연") + .department(departementRepository.findByName("콘텐츠융합디자인")) + .studentNum("21400025") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4211-1123") + .email("ma@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ma.github") + .loginCnt(0L) + .readme("ma's readme") + .build()); studentRepository.save(Student.builder() - .name("이동영") - .department(departementRepository.findByName("기계제어")) - .studentNum("21100234") - .semester(10) - .major1(majorRepository.findByName("기계공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2311-9992") - .email("yu@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@yu.github") - .loginCnt(0L) - .readme("yu's readme") - .build()); + .name("이동영") + .department(departementRepository.findByName("기계제어")) + .studentNum("21100234") + .semester(10) + .major1(majorRepository.findByName("기계공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2311-9992") + .email("yu@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@yu.github") + .loginCnt(0L) + .readme("yu's readme") + .build()); studentRepository.save(Student.builder() - .name("이연진") - .department(departementRepository.findByName("ICT창업학부")) - .studentNum("21800012") - .semester(9) - .major1(majorRepository.findByName("ICT 융합전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-1234-0494") - .email("jin@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jin.github") - .loginCnt(0L) - .readme("jin's readme") - .build()); + .name("이연진") + .department(departementRepository.findByName("ICT창업학부")) + .studentNum("21800012") + .semester(9) + .major1(majorRepository.findByName("ICT 융합전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1234-0494") + .email("jin@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jin.github") + .loginCnt(0L) + .readme("jin's readme") + .build()); studentRepository.save(Student.builder() - .name("김시온") - .department(departementRepository.findByName("전산전자")) - .studentNum("22100032") - .semester(2) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("생명과학전공")) - .phone("010-3232-6767") - .email("kim@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@kim.github") - .loginCnt(0L) - .readme("kim's readme") - .build()); + .name("김시온") + .department(departementRepository.findByName("전산전자")) + .studentNum("22100032") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("생명과학전공")) + .phone("010-3232-6767") + .email("kim@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@kim.github") + .loginCnt(0L) + .readme("kim's readme") + .build()); studentRepository.save(Student.builder() - .name("황유민") - .department(departementRepository.findByName("국제어문")) - .studentNum("21600432") - .semester(1) - .major1(majorRepository.findByName("국제지역학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4322-9009") - .email("park@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@park.github") - .loginCnt(0L) - .readme("park's readme") - .build()); + .name("황유민") + .department(departementRepository.findByName("국제어문")) + .studentNum("21600432") + .semester(1) + .major1(majorRepository.findByName("국제지역학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4322-9009") + .email("park@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@park.github") + .loginCnt(0L) + .readme("park's readme") + .build()); studentRepository.save(Student.builder() - .name("엄서영") - .department(departementRepository.findByName("경영경제")) - .studentNum("22000231") - .semester(5) - .major1(majorRepository.findByName("경영학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-6653-4231") - .email("lee@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@lee.github") - .loginCnt(0L) - .readme("lee's readme") - .build()); + .name("엄서영") + .department(departementRepository.findByName("경영경제")) + .studentNum("22000231") + .semester(5) + .major1(majorRepository.findByName("경영학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-6653-4231") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@lee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); studentRepository.save(Student.builder() - .name("이찬유") - .department(departementRepository.findByName("법학부")) - .studentNum("21600423") - .semester(5) - .major1(majorRepository.findByName("한국법전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-9292-9232") - .email("jeong@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jeong.github") - .loginCnt(0L) - .readme("jeong's readme") - .build()); + .name("이찬유") + .department(departementRepository.findByName("법학부")) + .studentNum("21600423") + .semester(5) + .major1(majorRepository.findByName("한국법전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-9292-9232") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); studentRepository.save(Student.builder() - .name("천그루") - .department(departementRepository.findByName("커뮤니케이션")) - .studentNum("22200026") - .semester(3) - .major1(majorRepository.findByName("공연영상학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2312-4343") - .email("woo@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@woo.github") - .loginCnt(0L) - .readme("woo's readme") - .build()); + .name("천그루") + .department(departementRepository.findByName("커뮤니케이션")) + .studentNum("22200026") + .semester(3) + .major1(majorRepository.findByName("공연영상학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2312-4343") + .email("woo@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@woo.github") + .loginCnt(0L) + .readme("woo's readme") + .build()); studentRepository.save(Student.builder() - .name("이하민") - .department(departementRepository.findByName("상담복지")) - .studentNum("21900032") - .semester(4) - .major1(majorRepository.findByName("사회복지학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4444-4234") - .email("wi@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@wi.github") - .loginCnt(0L) - .readme("wi's readme") - .build()); + .name("이하민") + .department(departementRepository.findByName("상담복지")) + .studentNum("21910032") + .semester(4) + .major1(majorRepository.findByName("사회복지학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4444-4234") + .email("wi@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wi.github") + .loginCnt(0L) + .readme("wi's readme") + .build()); studentRepository.save(Student.builder() - .name("박관희") - .department(departementRepository.findByName("공간환경시스템")) - .studentNum("21800232") - .semester(9) - .major1(majorRepository.findByName("도시환경공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-3221-6365") - .email("ha@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ha.github") - .loginCnt(0L) - .readme("ha's readme") - .build()); + .name("박관희") + .department(departementRepository.findByName("공간환경시스템")) + .studentNum("21800232") + .semester(9) + .major1(majorRepository.findByName("도시환경공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-3221-6365") + .email("ha@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ha.github") + .loginCnt(0L) + .readme("ha's readme") + .build()); studentRepository.save(Student.builder() - .name("현요섭") - .department(departementRepository.findByName("콘텐츠융합디자인")) - .studentNum("21400325") - .semester(2) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4211-1673") - .email("ma@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ma.github") - .loginCnt(0L) - .readme("ma's readme") - .build()); + .name("현요섭") + .department(departementRepository.findByName("콘텐츠융합디자인")) + .studentNum("21400325") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4211-1673") + .email("ma@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ma.github") + .loginCnt(0L) + .readme("ma's readme") + .build()); studentRepository.save(Student.builder() - .name("이찬호") - .department(departementRepository.findByName("기계제어")) - .studentNum("21100734") - .semester(10) - .major1(majorRepository.findByName("기계공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2911-9192") - .email("yu@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@yu.github") - .loginCnt(0L) - .readme("yu's readme") - .build()); + .name("이찬호") + .department(departementRepository.findByName("기계제어")) + .studentNum("21100734") + .semester(10) + .major1(majorRepository.findByName("기계공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2911-9192") + .email("yu@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@yu.github") + .loginCnt(0L) + .readme("yu's readme") + .build()); studentRepository.save(Student.builder() - .name("아무개") - .department(departementRepository.findByName("ICT창업학부")) - .studentNum("22200012") - .semester(9) - .major1(majorRepository.findByName("ICT 융합전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4321-1275") - .email("jin@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jin.github") - .loginCnt(0L) - .readme("jin's readme") - .build()); + .name("아무개") + .department(departementRepository.findByName("ICT창업학부")) + .studentNum("22200012") + .semester(9) + .major1(majorRepository.findByName("ICT 융합전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4321-1275") + .email("jin@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jin.github") + .loginCnt(0L) + .readme("jin's readme") + .build()); studentRepository.save(Student.builder() - .name("김요나") - .department(departementRepository.findByName("전산전자")) - .studentNum("21100032") - .semester(2) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("생명과학전공")) - .phone("010-6731-1423") - .email("kim@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@kim.github") - .loginCnt(0L) - .readme("kim's readme") - .build()); + .name("김요나") + .department(departementRepository.findByName("전산전자")) + .studentNum("21100032") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("생명과학전공")) + .phone("010-6731-1423") + .email("kim@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@kim.github") + .loginCnt(0L) + .readme("kim's readme") + .build()); studentRepository.save(Student.builder() - .name("박도마") - .department(departementRepository.findByName("국제어문")) - .studentNum("21900432") - .semester(1) - .major1(majorRepository.findByName("국제지역학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4222-3009") - .email("park@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@park.github") - .loginCnt(0L) - .readme("park's readme") - .build()); + .name("박도마") + .department(departementRepository.findByName("국제어문")) + .studentNum("21900432") + .semester(1) + .major1(majorRepository.findByName("국제지역학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4222-3009") + .email("park@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@park.github") + .loginCnt(0L) + .readme("park's readme") + .build()); studentRepository.save(Student.builder() - .name("이배드로") - .department(departementRepository.findByName("경영경제")) - .studentNum("22000331") - .semester(5) - .major1(majorRepository.findByName("경영학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-6653-9991") - .email("lee@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@lee.github") - .loginCnt(0L) - .readme("lee's readme") - .build()); + .name("이배드로") + .department(departementRepository.findByName("경영경제")) + .studentNum("22000331") + .semester(5) + .major1(majorRepository.findByName("경영학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-6653-9991") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@lee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); studentRepository.save(Student.builder() - .name("곽마태") - .department(departementRepository.findByName("법학부")) - .studentNum("21200423") - .semester(5) - .major1(majorRepository.findByName("한국법전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-1292-9132") - .email("jeong@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jeong.github") - .loginCnt(0L) - .readme("jeong's readme") - .build()); + .name("곽마태") + .department(departementRepository.findByName("법학부")) + .studentNum("21200423") + .semester(5) + .major1(majorRepository.findByName("한국법전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1292-9132") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); studentRepository.save(Student.builder() - .name("기운찬") - .department(departementRepository.findByName("커뮤니케이션")) - .studentNum("22100027") - .semester(3) - .major1(majorRepository.findByName("공연영상학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2112-4243") - .email("woo@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@woo.github") - .loginCnt(0L) - .readme("woo's readme") - .build()); + .name("기운찬") + .department(departementRepository.findByName("커뮤니케이션")) + .studentNum("22100027") + .semester(3) + .major1(majorRepository.findByName("공연영상학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2112-4243") + .email("woo@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@woo.github") + .loginCnt(0L) + .readme("woo's readme") + .build()); studentRepository.save(Student.builder() - .name("곤잘레스") - .department(departementRepository.findByName("상담복지")) - .studentNum("21900112") - .semester(4) - .major1(majorRepository.findByName("사회복지학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-1144-4214") - .email("wi@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@wi.github") - .loginCnt(0L) - .readme("wi's readme") - .build()); + .name("곤잘레스") + .department(departementRepository.findByName("상담복지")) + .studentNum("21900112") + .semester(4) + .major1(majorRepository.findByName("사회복지학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1144-4214") + .email("wi@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wi.github") + .loginCnt(0L) + .readme("wi's readme") + .build()); studentRepository.save(Student.builder() - .name("다비드") - .department(departementRepository.findByName("공간환경시스템")) - .studentNum("21800332") - .semester(9) - .major1(majorRepository.findByName("도시환경공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-3331-6365") - .email("ha@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ha.github") - .loginCnt(0L) - .readme("ha's readme") - .build()); + .name("다비드") + .department(departementRepository.findByName("공간환경시스템")) + .studentNum("21800332") + .semester(9) + .major1(majorRepository.findByName("도시환경공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-3331-6365") + .email("ha@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ha.github") + .loginCnt(0L) + .readme("ha's readme") + .build()); studentRepository.save(Student.builder() - .name("도베르만") - .department(departementRepository.findByName("콘텐츠융합디자인")) - .studentNum("21400425") - .semester(2) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4211-2673") - .email("ma@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ma.github") - .loginCnt(0L) - .readme("ma's readme") - .build()); + .name("도베르만") + .department(departementRepository.findByName("콘텐츠융합디자인")) + .studentNum("21400425") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4211-2673") + .email("ma@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ma.github") + .loginCnt(0L) + .readme("ma's readme") + .build()); studentRepository.save(Student.builder() - .name("진시황") - .department(departementRepository.findByName("기계제어")) - .studentNum("21100714") - .semester(10) - .major1(majorRepository.findByName("기계공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2931-9192") - .email("yu@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@yu.github") - .loginCnt(0L) - .readme("yu's readme") - .build()); + .name("진시황") + .department(departementRepository.findByName("기계제어")) + .studentNum("21100714") + .semester(10) + .major1(majorRepository.findByName("기계공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2931-9192") + .email("yu@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@yu.github") + .loginCnt(0L) + .readme("yu's readme") + .build()); studentRepository.save(Student.builder() - .name("황유비") - .department(departementRepository.findByName("ICT창업학부")) - .studentNum("21900012") - .semester(9) - .major1(majorRepository.findByName("ICT 융합전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4891-1275") - .email("jin@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jin.github") - .loginCnt(0L) - .readme("jin's readme") - .build()); + .name("황유비") + .department(departementRepository.findByName("ICT창업학부")) + .studentNum("21900012") + .semester(9) + .major1(majorRepository.findByName("ICT 융합전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4891-1275") + .email("jin@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jin.github") + .loginCnt(0L) + .readme("jin's readme") + .build()); studentRepository.save(Student.builder() - .name("우요셉") - .department(departementRepository.findByName("전산전자")) - .studentNum("21900032") - .semester(2) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("생명과학전공")) - .phone("010-9191-1423") - .email("kim@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@kim.github") - .loginCnt(0L) - .readme("kim's readme") - .build()); + .name("우요셉") + .department(departementRepository.findByName("전산전자")) + .studentNum("21900032") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("생명과학전공")) + .phone("010-9191-1423") + .email("kim@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@kim.github") + .loginCnt(0L) + .readme("kim's readme") + .build()); studentRepository.save(Student.builder() - .name("홍아담") - .department(departementRepository.findByName("국제어문")) - .studentNum("21901132") - .semester(1) - .major1(majorRepository.findByName("국제지역학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-9991-3009") - .email("park@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@park.github") - .loginCnt(0L) - .readme("park's readme") - .build()); + .name("홍아담") + .department(departementRepository.findByName("국제어문")) + .studentNum("21901132") + .semester(1) + .major1(majorRepository.findByName("국제지역학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-9991-3009") + .email("park@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@park.github") + .loginCnt(0L) + .readme("park's readme") + .build()); studentRepository.save(Student.builder() - .name("김이브") - .department(departementRepository.findByName("경영경제")) - .studentNum("22000131") - .semester(5) - .major1(majorRepository.findByName("경영학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-6653-9881") - .email("lee@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@lee.github") - .loginCnt(0L) - .readme("lee's readme") - .build()); + .name("김이브") + .department(departementRepository.findByName("경영경제")) + .studentNum("22000131") + .semester(5) + .major1(majorRepository.findByName("경영학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-6653-9881") + .email("lee@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@lee.github") + .loginCnt(0L) + .readme("lee's readme") + .build()); studentRepository.save(Student.builder() - .name("송삼손") - .department(departementRepository.findByName("법학부")) - .studentNum("21900423") - .semester(5) - .major1(majorRepository.findByName("한국법전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-1293-9832") - .email("jeong@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jeong.github") - .loginCnt(0L) - .readme("jeong's readme") - .build()); + .name("송삼손") + .department(departementRepository.findByName("법학부")) + .studentNum("21900423") + .semester(5) + .major1(majorRepository.findByName("한국법전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-1293-9832") + .email("jeong@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jeong.github") + .loginCnt(0L) + .readme("jeong's readme") + .build()); studentRepository.save(Student.builder() - .name("기윤호") - .department(departementRepository.findByName("커뮤니케이션")) - .studentNum("22100088") - .semester(3) - .major1(majorRepository.findByName("공연영상학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2188-4243") - .email("woo@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@woo.github") - .loginCnt(0L) - .readme("woo's readme") - .build()); + .name("기윤호") + .department(departementRepository.findByName("커뮤니케이션")) + .studentNum("22100088") + .semester(3) + .major1(majorRepository.findByName("공연영상학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2188-4243") + .email("woo@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@woo.github") + .loginCnt(0L) + .readme("woo's readme") + .build()); studentRepository.save(Student.builder() - .name("김영찬") - .department(departementRepository.findByName("상담복지")) - .studentNum("21900232") - .semester(4) - .major1(majorRepository.findByName("사회복지학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-6644-4214") - .email("wi@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@wi.github") - .loginCnt(0L) - .readme("wi's readme") - .build()); + .name("김영찬") + .department(departementRepository.findByName("상담복지")) + .studentNum("21900232") + .semester(4) + .major1(majorRepository.findByName("사회복지학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-6644-4214") + .email("wi@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@wi.github") + .loginCnt(0L) + .readme("wi's readme") + .build()); studentRepository.save(Student.builder() - .name("김영헌") - .department(departementRepository.findByName("공간환경시스템")) - .studentNum("21800232") - .semester(9) - .major1(majorRepository.findByName("도시환경공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-3431-6365") - .email("ha@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ha.github") - .loginCnt(0L) - .readme("ha's readme") - .build()); + .name("김영헌") + .department(departementRepository.findByName("공간환경시스템")) + .studentNum("21810232") + .semester(9) + .major1(majorRepository.findByName("도시환경공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-3431-6365") + .email("ha@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ha.github") + .loginCnt(0L) + .readme("ha's readme") + .build()); studentRepository.save(Student.builder() - .name("김하은") - .department(departementRepository.findByName("콘텐츠융합디자인")) - .studentNum("21400825") - .semester(2) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4111-2673") - .email("ma@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@ma.github") - .loginCnt(0L) - .readme("ma's readme") - .build()); + .name("김하은") + .department(departementRepository.findByName("콘텐츠융합디자인")) + .studentNum("21400825") + .semester(2) + .major1(majorRepository.findByName("컴퓨터공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4111-2673") + .email("ma@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@ma.github") + .loginCnt(0L) + .readme("ma's readme") + .build()); studentRepository.save(Student.builder() - .name("장유진") - .department(departementRepository.findByName("기계제어")) - .studentNum("21100114") - .semester(10) - .major1(majorRepository.findByName("기계공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2931-9192") - .email("yu@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@yu.github") - .loginCnt(0L) - .readme("yu's readme") - .build()); + .name("장유진") + .department(departementRepository.findByName("기계제어")) + .studentNum("21100114") + .semester(10) + .major1(majorRepository.findByName("기계공학전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-2931-9192") + .email("yu@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@yu.github") + .loginCnt(0L) + .readme("yu's readme") + .build()); studentRepository.save(Student.builder() - .name("정수산나") - .department(departementRepository.findByName("ICT창업학부")) - .studentNum("21900312") - .semester(9) - .major1(majorRepository.findByName("ICT 융합전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4821-1175") - .email("jin@handong.ac.kr") - .profile("profile.url") - .blog("blog.com") - .githubId("@jin.github") - .loginCnt(0L) - .readme("jin's readme") - .build()); + .name("정수산나") + .department(departementRepository.findByName("ICT창업학부")) + .studentNum("21900312") + .semester(9) + .major1(majorRepository.findByName("ICT 융합전공")) + .major2(majorRepository.findByName("컴퓨터공학전공")) + .phone("010-4821-1175") + .email("jin@handong.ac.kr") + .profile("profile.url") + .blog("blog.com") + .githubId("@jin.github") + .loginCnt(0L) + .readme("jin's readme") + .build()); } private void saveCategory() { categoryRepository.save(Category.builder() - .name("전공마일리지") - .build()); + .name("전공마일리지") + .build()); categoryRepository.save(Category.builder() - .name("산학마일리지") - .build()); + .name("산학마일리지") + .build()); categoryRepository.save(Category.builder() - .name("비교과-연구활동") - .build()); + .name("비교과-연구활동") + .build()); categoryRepository.save(Category.builder() - .name("비교과-특강참여") - .build()); + .name("비교과-특강참여") + .build()); categoryRepository.save(Category.builder() - .name("비교과-행사참여") - .build()); + .name("비교과-행사참여") + .build()); categoryRepository.save(Category.builder() - .name("비교과-학회할동") - .build()); + .name("비교과-학회할동") + .build()); categoryRepository.save(Category.builder() - .name("기타") - .build()); + .name("기타") + .build()); } private void saveDepartment() { departementRepository.save(Department.builder() - .name("전산전자") - .build()); + .name("전산전자") + .build()); departementRepository.save(Department.builder() - .name("국제어문") - .build()); + .name("국제어문") + .build()); departementRepository.save(Department.builder() - .name("경영경제") - .build()); + .name("경영경제") + .build()); departementRepository.save(Department.builder() - .name("법학부") - .build()); + .name("법학부") + .build()); departementRepository.save(Department.builder() - .name("커뮤니케이션") - .build()); + .name("커뮤니케이션") + .build()); departementRepository.save(Department.builder() - .name("상담복지") - .build()); + .name("상담복지") + .build()); departementRepository.save(Department.builder() - .name("공간환경시스템") - .build()); + .name("공간환경시스템") + .build()); departementRepository.save(Department.builder() - .name("콘텐츠융합디자인") - .build()); + .name("콘텐츠융합디자인") + .build()); departementRepository.save(Department.builder() - .name("기계제어") - .build()); + .name("기계제어") + .build()); departementRepository.save(Department.builder() - .name("ICT창업학부") - .build()); + .name("ICT창업학부") + .build()); departementRepository.save(Department.builder() - .name("ICT융합학부") - .build()); + .name("ICT융합학부") + .build()); departementRepository.save(Department.builder() - .name("생명과학") - .build()); + .name("생명과학") + .build()); } public void saveActivities() { activityRepository.save(Activity.builder() - .semester("2021-2") - .personal(false) - .remark("Spring 이용") - .requestStatus(1) - .name("(캠프)웹서비스 프로젝트(spring)_장소연") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); + .semester("2021-2") + .personal(false) + .remark("Spring 이용") + .requestStatus(1) + .name("(캠프)웹서비스 프로젝트(spring)_장소연") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); activityRepository.save(Activity.builder() - .semester("2022-2") - .personal(false) - .remark("우수상 수상") - .requestStatus(1) - .name("비즈플로우") - .weight(2) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); + .semester("2021-2") + .personal(false) + .remark("우수상 수상") + .requestStatus(1) + .name("(캠프)미리미리C 캠프_김광") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); activityRepository.save(Activity.builder() - .semester("2020-2") - .personal(false) - .remark("") - .requestStatus(1) - .name("(캠프)미리미리C 캠프_김광") - .weight(5) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); + .semester("2021-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("공학프로젝트기획") + .weight(2) + .category(categoryRepository.findByName("전공마일리지")) + .build()); activityRepository.save(Activity.builder() - .semester("2020-1") - .personal(false) - .remark("") - .requestStatus(1) - .name("C 프로그래밍") - .weight(1) - .category(categoryRepository.findByName("전공마일리지")) - .build()); + .semester("2021-2") + .personal(true) + .remark("우수상 수상") + .requestStatus(1) + .name("해커톤") + .weight(5) + .category(categoryRepository.findByName("기타")) + .build()); activityRepository.save(Activity.builder() - .semester("2021-1") - .personal(false) - .remark("") - .requestStatus(1) - .name("AI프로젝트 입문") - .weight(2) - .category(categoryRepository.findByName("전공마일리지")) - .build()); + .semester("2021-2") + .personal(true) + .remark("") + .requestStatus(1) + .name("정보처리기사 자격증") + .weight(4) + .category(categoryRepository.findByName("기타")) + .build()); activityRepository.save(Activity.builder() - .semester("2019-2") - .personal(false) - .remark("") - .requestStatus(1) - .name("(캠프)Advanced Flutter Camp_조성배") - .weight(4) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); + .semester("2021-2") + .personal(false) + .remark("우수상 수상") + .requestStatus(1) + .name("(캠프)Advanced Flutter Camp_조성배") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); activityRepository.save(Activity.builder() - .semester("2019-1") - .personal(true) - .remark("") - .requestStatus(1) - .name("정보처리기사 자격증") - .weight(2) - .category(categoryRepository.findByName("기타")) - .build()); + .semester("2021-2") + .personal(true) + .remark("") + .requestStatus(1) + .name("현장실습") + .weight(5) + .category(categoryRepository.findByName("산학마일리지")) + .build()); activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(false) - .remark("") - .requestStatus(1) - .name("공학프로젝트기획") - .weight(6) - .category(categoryRepository.findByName("전공마일리지")) - .build()); + .semester("2021-2") + .personal(true) + .remark("") + .requestStatus(1) + .name("논문 분석") + .weight(3) + .category(categoryRepository.findByName("비교과-연구활동")) + .build()); activityRepository.save(Activity.builder() - .semester("2020-2") - .personal(false) - .remark("") - .requestStatus(1) - .name("캡스톤") - .weight(1) - .category(categoryRepository.findByName("전공마일리지")) - .build()); + .semester("2021-2") + .personal(false) + .remark("디지털 시대와 개발자 (10.26)") + .requestStatus(1) + .name("CSEE 특강") + .weight(3) + .category(categoryRepository.findByName("비교과-특강참여")) + .build()); activityRepository.save(Activity.builder() - .semester("2021-2") - .personal(false) - .remark("") - .requestStatus(1) - .name("프로그래밍 집중훈련 캠프_김호준") - .weight(7) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); + .semester("2021-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("캡스톤 페스티벌 참여") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2021-2") + .personal(false) + .remark("미리미리 C 캠프") + .requestStatus(1) + .name("CRA") + .weight(3) + .category(categoryRepository.findByName("비교과-학회활동")) + .build()); + activityRepository.save(Activity.builder() + .semester("2021-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("GHOST GBC") + .weight(4) + .category(categoryRepository.findByName("비교과-학회활동")) + .build()); + activityRepository.save(Activity.builder() + .semester("2021-2") + .personal(true) + .remark("") + .requestStatus(1) + .name("네이버 부트캠프") + .weight(5) + .category(categoryRepository.findByName("기타")) + .build()); + activityRepository.save(Activity.builder() + .semester("2021-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)프로그래밍 집중훈련 캠프_김호준") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2021-2") + .personal(false) + .remark("프로그래머로 산다는 것 (11.2)") + .requestStatus(1) + .name("CSEE 특강") + .weight(3) + .category(categoryRepository.findByName("비교과-특강참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2021-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)파이썬 기초 잡기 캠프_박성진") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2021-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)Program Problem Solving 캠프_김광") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2021-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)VVS_세상 소중한 나를 위한 캠프_정석민") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2021-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)에메르송의 코딩테스트 준비 캠프_송다빈") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2021-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)딥러닝 심화 캠프_김인중") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("Spring 이용") + .requestStatus(1) + .name("(캠프)웹서비스 프로젝트(spring)_장소연") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("우수상 수상") + .requestStatus(1) + .name("(캠프)미리미리C 캠프_김광") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("공학설계입문") + .weight(1) + .category(categoryRepository.findByName("전공마일리지")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(true) + .remark("최우수상 수상") + .requestStatus(1) + .name("해커톤") + .weight(5) + .category(categoryRepository.findByName("기타")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(true) + .remark("") + .requestStatus(1) + .name("ISQTB 자격증") + .weight(2) + .category(categoryRepository.findByName("기타")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)Advanced Flutter Camp_조성배") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(true) + .remark("BizFlow") + .requestStatus(1) + .name("현장실습") + .weight(5) + .category(categoryRepository.findByName("산학마일리지")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(true) + .remark("AI 딥러닝") + .requestStatus(1) + .name("논문 분석") + .weight(3) + .category(categoryRepository.findByName("비교과-연구활동")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("제네시스랩의 기술 창업 스토리") + .requestStatus(1) + .name("CSEE 특강") + .weight(2) + .category(categoryRepository.findByName("비교과-특강참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("공학 페스티벌 참여") + .weight(1) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("미리미리 C 캠프") + .requestStatus(1) + .name("CRA") + .weight(1) + .category(categoryRepository.findByName("비교과-학회활동")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("슬기짜기 코딩 교육") + .weight(1) + .category(categoryRepository.findByName("비교과-학회활동")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(true) + .remark("세상을 바꾸는 디지털 전환과 신기술 도입 사례 (04.16)") + .requestStatus(1) + .name("CSEE 특강") + .weight(1) + .category(categoryRepository.findByName("비교과-특강참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)프로그래밍 캠프_김호준") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("글로벌 라이다 기술 동향 및 에스오에스랩 창업 스토리 (04.23)") + .requestStatus(1) + .name("CSEE 특강") + .weight(3) + .category(categoryRepository.findByName("비교과-특강참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)파이썬 심화 캠프_박성진") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)Program Problem Solving 캠프_김광") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)VVS_프로그램 기획 및 설계 캠프_정석민") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)에메르송의 면접 준비 캠프_송다빈") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-1") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)컴퓨터 비전 캠프_황성수") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("Spring 이용") + .requestStatus(1) + .name("(캠프)웹서비스 프로젝트(spring)_장소연") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("우수상 수상") + .requestStatus(1) + .name("(캠프)미리미리C 캠프_김광") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("랩 설명회 참여") + .weight(1) + .category(categoryRepository.findByName("전공마일리지")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(true) + .remark("장려상 수상") + .requestStatus(1) + .name("해커톤") + .weight(5) + .category(categoryRepository.findByName("기타")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(true) + .remark("") + .requestStatus(1) + .name("SQLD 자격증") + .weight(3) + .category(categoryRepository.findByName("기타")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)Advanced Flutter Camp_조성배") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(true) + .remark("카카오") + .requestStatus(1) + .name("현장실습") + .weight(5) + .category(categoryRepository.findByName("산학마일리지")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(true) + .remark("Brain Computer Interface") + .requestStatus(1) + .name("논문 분석") + .weight(3) + .category(categoryRepository.findByName("비교과-연구활동")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("웹과 클라우드 개발자 취업의 현장 (11.07)") + .requestStatus(1) + .name("CSEE 특강") + .weight(3) + .category(categoryRepository.findByName("비교과-특강참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("커리어 페스티벌 참여") + .weight(1) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("미리미리 C 캠프") + .requestStatus(1) + .name("CRA") + .weight(1) + .category(categoryRepository.findByName("비교과-학회활동")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("SODA 코딩 교육") + .weight(1) + .category(categoryRepository.findByName("비교과-학회활동")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(true) + .remark("웹 개발자로 살아남는 법 (11.27)") + .requestStatus(1) + .name("CSEE 특강") + .weight(1) + .category(categoryRepository.findByName("비교과-특강참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)프로그래밍 캠프_김호준") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("빅데이터 분석과 활용법 (12.10)") + .requestStatus(1) + .name("CSEE 특강") + .weight(1) + .category(categoryRepository.findByName("비교과-특강참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)파이썬 심화 캠프_박성진") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)Program Problem Solving 캠프_김광") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)VVS_프로그램 기획 및 설계 캠프_정석민") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)에메르송의 면접 준비 캠프_송다빈") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); + activityRepository.save(Activity.builder() + .semester("2022-2") + .personal(false) + .remark("") + .requestStatus(1) + .name("(캠프)컴퓨터 비전 캠프_황성수") + .weight(3) + .category(categoryRepository.findByName("비교과-행사참여")) + .build()); } From 875fd14ff9834aded0d595e8dc57b099f8fa20d6 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Tue, 8 Nov 2022 01:05:42 +0900 Subject: [PATCH 084/148] =?UTF-8?q?[#81]=20:=20Section,=20API=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix[#81] : section 항목 수정 * fix[#81] : activity 값 변경 --- .../activity/application/dto/ActivityParticipantDto.java | 4 ++-- .../presentation/response/ActivityParticipantResponse.java | 5 +++-- src/main/java/com/server/hispath/student/domain/Section.java | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityParticipantDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityParticipantDto.java index 4540ca1..0ccd974 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ActivityParticipantDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityParticipantDto.java @@ -17,10 +17,10 @@ public class ActivityParticipantDto { private String name; private String remark; private ParticipantContentDto participant; - + private int requestStatus; public static ActivityParticipantDto of(Participant participant) { Activity activity = participant.getActivity(); return new ActivityParticipantDto(activity.getId(), activity.getSemester(), activity.getName(), - activity.getRemark(), ParticipantContentDto.of(participant)); + activity.getRemark(), ParticipantContentDto.of(participant), activity.getRequestStatus()); } } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java index 2275cc4..d1cc968 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java @@ -16,10 +16,11 @@ public class ActivityParticipantResponse { private String remark; private String section; private String data; + private boolean isMileage; public static ActivityParticipantResponse of(ActivityParticipantDto dto) { return new ActivityParticipantResponse(dto.getId(), dto.getSemester(), dto.getName(), dto.getRemark(), - - dto.getParticipant().getSection().getName(), dto.getParticipant().getData()); + dto.getParticipant().getSection().getName(), dto.getParticipant() + .getData(), dto.getRequestStatus() == 1); } } diff --git a/src/main/java/com/server/hispath/student/domain/Section.java b/src/main/java/com/server/hispath/student/domain/Section.java index b770f37..f2126bf 100644 --- a/src/main/java/com/server/hispath/student/domain/Section.java +++ b/src/main/java/com/server/hispath/student/domain/Section.java @@ -8,8 +8,8 @@ import com.server.hispath.exception.student.SectionNotExistException; public enum Section { - REWARD("수상"), SKILL("기술"), COURSE("과정"), LINK("링크"), - INTERNSHIP("인턴"), CERTIFICATE("자격증"), LANGUAGE("언어"), ETC("기타"); + EXPERIENCE("경력"), DEGREE("학력"),SKILL("기술"), CERTIFICATE("자격증"),REWARD("수상"), LANGUAGE("외국어"), + LINK("링크"), ETC("기타"); private String name; From 64fdf314e8f643983394c189b96d930498ad729f Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 8 Nov 2022 01:11:20 +0900 Subject: [PATCH 085/148] =?UTF-8?q?hotfix=20:=20isMileage=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/response/ActivityParticipantResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java index d1cc968..986e9ba 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantResponse.java @@ -16,7 +16,7 @@ public class ActivityParticipantResponse { private String remark; private String section; private String data; - private boolean isMileage; + private boolean mileage; public static ActivityParticipantResponse of(ActivityParticipantDto dto) { return new ActivityParticipantResponse(dto.getId(), dto.getSemester(), dto.getName(), dto.getRemark(), From 52001797e3191f90e840072a3344f4ef33c49e10 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 8 Nov 2022 01:14:44 +0900 Subject: [PATCH 086/148] =?UTF-8?q?hotfix=20:=20test=20controller=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/server/hispath/common/TestController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 5c83c26..ddc1b19 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -1374,7 +1374,7 @@ private void saveCategory() { .name("비교과-행사참여") .build()); categoryRepository.save(Category.builder() - .name("비교과-학회할동") + .name("비교과-학회활동") .build()); categoryRepository.save(Category.builder() .name("기타") From 6260aa7fb5666a95cc56a69ab7ebdc5b0797aaaf Mon Sep 17 00:00:00 2001 From: shinel98 <75024473+shinel98@users.noreply.github.com> Date: Tue, 8 Nov 2022 01:30:20 +0900 Subject: [PATCH 087/148] =?UTF-8?q?[#76]=20:=20=EB=A7=88=EC=9D=BC=EB=A6=AC?= =?UTF-8?q?=EC=A7=80=20=ED=99=9C=EB=8F=99=20section,=20semester=EC=97=90?= =?UTF-8?q?=20=EB=94=B0=EB=9D=BC=20=ED=95=84=ED=84=B0=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20API=20=EA=B5=AC=ED=98=84=20(#83)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * git 문제 해결 * [#76] : 마일리지 활동 카테고리별, 학기별 필터링 API 구현 * git 문제 해결 --- .../application/MActivityService.java | 13 ++++++++++ .../dto/MActivityParticipantDto.java | 24 +++++++++++++++++ .../dto/MParticipantContentDto.java | 26 +++++++++++++++++++ .../activity/application/dto/SemesterDto.java | 19 ++++++++++++++ .../hispath/activity/domain/Activity.java | 4 +++ .../presentation/ActivityController.java | 2 +- .../presentation/MActivityController.java | 16 +++++++++++- .../request/MStudentActivityCURequest.java | 19 ++++++++++++++ .../MActivityParticipantResponse.java | 25 ++++++++++++++++++ .../hispath/category/domain/Category.java | 6 +++++ .../hispath/student/domain/Participant.java | 7 +++++ .../domain/repository/StudentRepository.java | 8 +++++- 12 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/server/hispath/activity/application/dto/MActivityParticipantDto.java create mode 100644 src/main/java/com/server/hispath/activity/application/dto/MParticipantContentDto.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/request/MStudentActivityCURequest.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/MActivityParticipantResponse.java diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index 41fa947..f92aac2 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -122,4 +122,17 @@ public List findSemestersById(Long studentId) { .stream().map(participant -> {return SemesterDto.from(participant.getActivity().getSemester());}).distinct().collect(Collectors.toList()); return semesters; } + + + + @Transactional(readOnly = true) + public ListfindAllParticipantActivities(Long id, String semester, String category) { + Student student = studentRepository.findStudentWithMActivities(id).orElseThrow(StudentNotFoundException::new); + return student.getParticipants() + .stream() + .filter(participant -> participant.isSameSemester(semester)) + .filter(participant -> participant.isSameCategory(category)) + .map(MActivityParticipantDto::of) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/MActivityParticipantDto.java b/src/main/java/com/server/hispath/activity/application/dto/MActivityParticipantDto.java new file mode 100644 index 0000000..d883f12 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/MActivityParticipantDto.java @@ -0,0 +1,24 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.student.domain.Participant; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class MActivityParticipantDto { + private Long id; + private String semester; + private String name; + private String remark; + private MParticipantContentDto participant; + + public static MActivityParticipantDto of(Participant participant) { + Activity activity = participant.getActivity(); + return new MActivityParticipantDto(activity.getId(), activity.getSemester(), activity.getName(), + activity.getRemark(), MParticipantContentDto.of(participant)); + } +} diff --git a/src/main/java/com/server/hispath/activity/application/dto/MParticipantContentDto.java b/src/main/java/com/server/hispath/activity/application/dto/MParticipantContentDto.java new file mode 100644 index 0000000..b980a24 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/MParticipantContentDto.java @@ -0,0 +1,26 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.activity.presentation.request.MStudentActivityCURequest; +import com.server.hispath.activity.presentation.request.StudentActivityCURequest; +import com.server.hispath.category.domain.Category; +import com.server.hispath.student.domain.Participant; +import com.server.hispath.student.domain.Section; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class MParticipantContentDto { + private Category category; + private String data; + + public static MParticipantContentDto of(MStudentActivityCURequest request) { + return new MParticipantContentDto(Category.fromString(request.getCategory()), request.getData()); + } + public static MParticipantContentDto of(Participant participant) { + return new MParticipantContentDto(participant.getActivity().getCategory(), participant.getData()); + } +} + diff --git a/src/main/java/com/server/hispath/activity/application/dto/SemesterDto.java b/src/main/java/com/server/hispath/activity/application/dto/SemesterDto.java index 6a5c7df..00cee8f 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/SemesterDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/SemesterDto.java @@ -1,11 +1,14 @@ package com.server.hispath.activity.application.dto; import com.server.hispath.activity.domain.Activity; +import com.server.hispath.student.domain.Student; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.util.Objects; + @Getter @Setter @NoArgsConstructor @@ -16,6 +19,22 @@ public class SemesterDto { public static SemesterDto from(String semester) { return new SemesterDto(semester); } + + + @Override + public boolean equals(Object o) { + if(o instanceof SemesterDto){ + return semester.equals(((SemesterDto) o).semester); + } + return false; + } + + @Override + public int hashCode(){ + return semester.hashCode(); + } + + } diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 4e8546d..884affa 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -156,6 +156,10 @@ public boolean isSameSemester(String semester) { return Objects.equals(this.semester, semester); } + public boolean isSameCategory(String category) { + return Objects.equals(this.category.getName(), category); + } + public void apply(){ this.requestStatus = 0; } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index e5454ea..b0fb475 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -152,7 +152,7 @@ public ResponseEntity rejectActivity(@PathVariable Long id) { } - + @GetMapping("/activity-detail/{activityId}") @ApiOperation(value = ApiDoc.ACTIVITY_STUDENT_DETAIL) public ResponseEntity findParticipantActivityById(@PathVariable Long activityId) { diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 2fc5ae0..fcdd3c0 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -9,7 +9,9 @@ import com.server.hispath.activity.presentation.request.MActivityCURequest; import com.server.hispath.activity.presentation.request.MParticipantRequest; import com.server.hispath.activity.presentation.request.MStudentRegisterRequest; +import com.server.hispath.activity.presentation.response.ActivityParticipantResponse; import com.server.hispath.activity.presentation.response.ActivityResponse; +import com.server.hispath.activity.presentation.response.MActivityParticipantResponse; import com.server.hispath.activity.presentation.response.SemesterResponse; import com.server.hispath.docs.ApiDoc; import com.server.hispath.student.application.StudentService; @@ -131,4 +133,16 @@ public ResponseEntity> findSemestersById(@PathVariable Lo } -} + + @GetMapping("/student-mactivities/{id}") + @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_READ_SEMESTER) + public ResponseEntity> findParticipatedActivities(@PathVariable Long id, @RequestParam String semester, @RequestParam String category) { + List responses = mActivityService.findAllParticipantActivities(id, semester, category) + .stream() + .map(MActivityParticipantResponse::of) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + + + } +} \ No newline at end of file diff --git a/src/main/java/com/server/hispath/activity/presentation/request/MStudentActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/MStudentActivityCURequest.java new file mode 100644 index 0000000..e12d94f --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/request/MStudentActivityCURequest.java @@ -0,0 +1,19 @@ +package com.server.hispath.activity.presentation.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class MStudentActivityCURequest { + + private String semester; + private String name; + private String remark; + private String category; + private String data; +} diff --git a/src/main/java/com/server/hispath/activity/presentation/response/MActivityParticipantResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/MActivityParticipantResponse.java new file mode 100644 index 0000000..477bca8 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/MActivityParticipantResponse.java @@ -0,0 +1,25 @@ +package com.server.hispath.activity.presentation.response; + +import com.server.hispath.activity.application.dto.ActivityParticipantDto; +import com.server.hispath.activity.application.dto.MActivityParticipantDto; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class MActivityParticipantResponse { + private Long id; + private String semester; + private String name; + private String remark; + private String category; + private String data; + + public static MActivityParticipantResponse of(MActivityParticipantDto dto) { + return new MActivityParticipantResponse(dto.getId(), dto.getSemester(), dto.getName(), dto.getRemark(), + + dto.getParticipant().getCategory().getName(), dto.getParticipant().getData()); + } +} diff --git a/src/main/java/com/server/hispath/category/domain/Category.java b/src/main/java/com/server/hispath/category/domain/Category.java index b372388..b76ff0b 100644 --- a/src/main/java/com/server/hispath/category/domain/Category.java +++ b/src/main/java/com/server/hispath/category/domain/Category.java @@ -42,4 +42,10 @@ public static Category from(CategoryCUDto dto) { .name(dto.getName()) .build(); } + + public static Category fromString(String category) { + return Category.builder().name(category).build(); + } + + } diff --git a/src/main/java/com/server/hispath/student/domain/Participant.java b/src/main/java/com/server/hispath/student/domain/Participant.java index d9ef66a..9b1fcae 100644 --- a/src/main/java/com/server/hispath/student/domain/Participant.java +++ b/src/main/java/com/server/hispath/student/domain/Participant.java @@ -54,12 +54,19 @@ public boolean isSameSemester(String semester) { return activity.isSameSemester(semester); } + public boolean isSameSection(String section) { if (Objects.equals(section, "ALL")) return true; return Objects.equals(this.section.getName(), section); } + public boolean isSameCategory(String category) { + if(Objects.equals(category, "ALL")) + return true; + return activity.isSameCategory(category); + } + public boolean isSameStudent(Student student) { return Objects.equals(this.student, student); } diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java index a6c1115..1dfd1c2 100644 --- a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java @@ -22,7 +22,7 @@ public interface StudentRepository extends JpaRepository { @Query("select s from Student s " + "left join fetch s.participants as p " + "left join fetch p.activity as a " + - "where s.id = :id ") + "where s.id = :id") Optional findStudentWithActivities(Long id); @Query("select s from Student s " + @@ -32,4 +32,10 @@ public interface StudentRepository extends JpaRepository { "where s.id = :id " + "and a.semester = :semester") Optional findStudentWithIdAndSemester(Long id, String semester); + + @Query("select s from Student s " + + "left join fetch s.participants as p " + + "left join fetch p.activity as a " + + "where s.id = :id and a.requestStatus = 1") + Optional findStudentWithMActivities(Long id); } From 348eb7ca70466b6a680511ac8af5db2d680cb07f Mon Sep 17 00:00:00 2001 From: shinel98 Date: Tue, 8 Nov 2022 01:32:11 +0900 Subject: [PATCH 088/148] =?UTF-8?q?hotfix:=20apidoc=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/server/hispath/docs/ApiDoc.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index a1e40e3..676f073 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -95,6 +95,6 @@ public class ApiDoc { public static final String SCHOLARSHIP_ACTIVITIES = "장학금 수혜자 정보와 그 활동들 조회"; public static final String APPROVE_SCHOLARSHIPS = "현학기 장학금 승인 명단 엑셀 업로드"; public static final String SCHOLARSHIP_SEARCH_STUDENT = "장학금 수혜 학생 필터 검색"; - public static final String InHyeok = "제발 하라는 대로 하자 dev branch에서 dev 풀 받고, 다시 너의 브렌치로 이동해서 git merge dev 후 git push origin 너브랜체 그리고 pull request 만들기 "; + public static final String InHyeok = "제발 하라는 대로 하자 dev branch에서 dev 풀 받고, 다시 너의 브렌치로 이동해서 git merge dev 후 git push origin 너브랜체 그리고 pull request 만들기 pull request로 dev 에 스쿼시 머지 이후 로컬에서는 다시 dev로 이동 git pull origin dev 이런다음에 새로운 기능을 개발하려면 git checkout -b 인혁브렌치"; } From e57bee0527019cbcac2b7ba24ea8536cf1b3b053 Mon Sep 17 00:00:00 2001 From: shinel98 <75024473+shinel98@users.noreply.github.com> Date: Tue, 8 Nov 2022 01:41:21 +0900 Subject: [PATCH 089/148] =?UTF-8?q?[#76]=20:=20git=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=EB=90=98=EC=97=88=EB=82=98=20=EB=8B=A4?= =?UTF-8?q?=EC=8B=9C=20=EC=B2=B4=ED=81=AC=20=20(#84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * git 문제 해결 * [#76] : 마일리지 활동 카테고리별, 학기별 필터링 API 구현 * git 문제 해결 * git 해결되었나 체크 --- .../hispath/activity/domain/repository/ActivityRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java index e5e62a9..2036cd7 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -11,7 +11,7 @@ public interface ActivityRepository extends JpaRepository { List findAllBySemester(String semester); - + // commit 테스트용 @Query("select a from Activity a " + "left join fetch a.participants as p " + "left join fetch p.student " + From a3baccee91f0652ce94d352133845666976c980d Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Tue, 8 Nov 2022 02:16:24 +0900 Subject: [PATCH 090/148] =?UTF-8?q?fix[#85]=20:=20activityCnt=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#86)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/response/ScholarshipDetailResponse.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipDetailResponse.java b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipDetailResponse.java index 1b37f0e..41b6fcb 100644 --- a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipDetailResponse.java +++ b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipDetailResponse.java @@ -27,10 +27,11 @@ public class ScholarshipDetailResponse { private int totalWeight; private String result; private List activities = new ArrayList<>(); + private int activityCnt; public static ScholarshipDetailResponse from(ScholarshipDto dto, List activities) { return new ScholarshipDetailResponse(dto.getName(), dto.getStudentNum(), dto.getSemester(), dto.getStudentSemester(), dto.getDepartmentName(), dto.getMajor1Name(), dto.getMajor2Name(), dto.getEmail(), - dto.getPhone(), dto.getTotalWeight(), dto.getResult(), activities); + dto.getPhone(), dto.getTotalWeight(), dto.getResult(), activities, activities.size()); } } From 56324fb2ccd77889a7a5bbab9b790bc4cac60829 Mon Sep 17 00:00:00 2001 From: shinel98 <75024473+shinel98@users.noreply.github.com> Date: Tue, 8 Nov 2022 19:32:26 +0900 Subject: [PATCH 091/148] =?UTF-8?q?[#87]=20:=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=ED=99=9C=EB=8F=99=20=EC=A4=91=20=ED=95=99=EC=83=9D=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=20=ED=99=9C=EB=8F=99=20=EC=A1=B0=ED=9A=8C=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * git 문제 해결 * [#76] : 마일리지 활동 카테고리별, 학기별 필터링 API 구현 * git 문제 해결 * git 해결되었나 체크 * [#87] : 전체 활동 중 학생 참여 활동 조회 API 구현 --- .../application/MActivityService.java | 24 ++++++++++++++++ .../dto/AllMActivityParticipantDto.java | 28 +++++++++++++++++++ .../hispath/activity/domain/Activity.java | 11 ++++++++ .../domain/repository/ActivityRepository.java | 7 ++++- .../presentation/MActivityController.java | 15 +++++++--- .../AllMActivityParticipantResponse.java | 24 ++++++++++++++++ .../java/com/server/hispath/docs/ApiDoc.java | 2 ++ .../server/hispath/student/domain/Inhyok.java | 24 ++++++++++++++++ .../hispath/student/domain/Participant.java | 2 ++ .../domain/repository/StudentRepository.java | 5 ++++ 10 files changed, 137 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/server/hispath/activity/application/dto/AllMActivityParticipantDto.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/AllMActivityParticipantResponse.java create mode 100644 src/main/java/com/server/hispath/student/domain/Inhyok.java diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index f92aac2..2b1efbb 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -13,6 +13,7 @@ import com.server.hispath.exception.activity.ParticipantNotFoundException; import com.server.hispath.exception.student.StudentNotFoundException; import com.server.hispath.student.application.dto.StudentRefDetailDto; +//import com.server.hispath.student.domain.Inhyok; import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; @@ -135,4 +136,27 @@ public List findSemestersById(Long studentId) { .map(MActivityParticipantDto::of) .collect(Collectors.toList()); } + + @Transactional(readOnly = true) + public ListfindParticipatedActivities(Long id, String semester, String category) { + List activities = activityRepository.findParticipatedActivity(); + Student student = studentRepository.findById(id).orElseThrow(StudentNotFoundException::new); + + List collect = + activities.stream() + .filter(activity -> activity.isSameSemester(semester) && activity.isSameCategory(category)) + .map(activity -> {return AllMActivityParticipantDto.of(activity, activity.isParticipate(student)); }) + .collect(Collectors.toList()); + + return collect; + + +// return activities +// .stream() +// .map(activity -> activity.getParticipants().stream() +// .filter(participant -> participant.isSameSemester(semester)) +// .filter(participant -> participant.isSameCategory(category)) +// .map(participant -> { return AllMActivityParticipantDto.of(participant, participant.isSameStudent(student));}).collect(Collectors.toList())); + + } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/AllMActivityParticipantDto.java b/src/main/java/com/server/hispath/activity/application/dto/AllMActivityParticipantDto.java new file mode 100644 index 0000000..e7b996c --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/AllMActivityParticipantDto.java @@ -0,0 +1,28 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.category.application.dto.CategoryDto; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class AllMActivityParticipantDto { + private Long id; + private String semester; + private String name; + private String remark; + private CategoryDto category; + private boolean participated; + + public static AllMActivityParticipantDto of(Activity activity, boolean participated) { + return new AllMActivityParticipantDto(activity.getId(), activity.getSemester(), activity.getName(), activity.getRemark(), CategoryDto.from(activity.getCategory()), + participated); + } + public boolean getParticipated(){ + return participated; + } +} + diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 884affa..440810a 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -153,10 +153,14 @@ public void updateStudentRegister() { } public boolean isSameSemester(String semester) { + if(Objects.equals(semester, "ALL")) + return true; return Objects.equals(this.semester, semester); } public boolean isSameCategory(String category) { + if(Objects.equals(category, "ALL")) + return true; return Objects.equals(this.category.getName(), category); } @@ -172,4 +176,11 @@ public void approve(int weight){ public void reject(){ this.requestStatus = 2; } + + public boolean isParticipate(Student student) { + return this.participants.stream() + .anyMatch(participant -> participant.isSameStudent(student)); + } + + } diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java index 2036cd7..cafd6f3 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -30,5 +30,10 @@ public interface ActivityRepository extends JpaRepository { List findAllBySemesterAndRequestStatus(String semester, int requestStatus); List findAllByRequestStatus(int requestStatus); - + + @Query("select distinct a from Activity a " + + "left join fetch a.participants as p " + + "left join fetch p.student " + + "where a.requestStatus = 1") + List findParticipatedActivity(); } diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index fcdd3c0..78f184d 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -9,10 +9,7 @@ import com.server.hispath.activity.presentation.request.MActivityCURequest; import com.server.hispath.activity.presentation.request.MParticipantRequest; import com.server.hispath.activity.presentation.request.MStudentRegisterRequest; -import com.server.hispath.activity.presentation.response.ActivityParticipantResponse; -import com.server.hispath.activity.presentation.response.ActivityResponse; -import com.server.hispath.activity.presentation.response.MActivityParticipantResponse; -import com.server.hispath.activity.presentation.response.SemesterResponse; +import com.server.hispath.activity.presentation.response.*; import com.server.hispath.docs.ApiDoc; import com.server.hispath.student.application.StudentService; import com.server.hispath.student.application.dto.StudentSimpleRefDto; @@ -145,4 +142,14 @@ public ResponseEntity> findParticipatedActivi } + + @GetMapping("/student-allmactivities/{id}") + @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_READ_PARTICIPATE) + public ResponseEntity> findAllParticipatedActivities(@PathVariable Long id, @RequestParam String semester, @RequestParam String category) { + List responses = mActivityService.findParticipatedActivities(id, semester, category) + .stream() + .map(AllMActivityParticipantResponse::of) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/activity/presentation/response/AllMActivityParticipantResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/AllMActivityParticipantResponse.java new file mode 100644 index 0000000..bb207fa --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/AllMActivityParticipantResponse.java @@ -0,0 +1,24 @@ +package com.server.hispath.activity.presentation.response; + +import com.server.hispath.activity.application.dto.AllMActivityParticipantDto; +import com.server.hispath.activity.application.dto.MActivityParticipantDto; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class AllMActivityParticipantResponse { + private Long id; + private String semester; + private String name; + private String remark; + private String category; + private boolean participated; + + public static AllMActivityParticipantResponse of(AllMActivityParticipantDto dto) { + return new AllMActivityParticipantResponse(dto.getId(), dto.getSemester(), dto.getName(), dto.getRemark(), + dto.getCategory().getName(), dto.getParticipated()); + } +} \ No newline at end of file diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 676f073..ea3dc2f 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -27,6 +27,8 @@ public class ApiDoc { public static final String STUDENT_ACTIVITY_CREATE = "학생의 개인 활동 생성"; public static final String STUDENT_ACTIVITY_UPDATE = "학생의 참여 활동 수정"; public static final String STUDENT_ACTIVITY_READ_SEMESTER = "학생의 참여 활동 학기별 조회"; + + public static final String STUDENT_ACTIVITY_READ_PARTICIPATE = "전체 활동 중 학생 참여 활동 조회"; public static final String SECTION_READ_ALL = "모든 섹션 조회"; public static final String PARTICIPANT_DELETE = "학생 참여 데이터 삭제"; public static final String ACTIVITY_APPLY = "학생 활동 마일리지 신청"; diff --git a/src/main/java/com/server/hispath/student/domain/Inhyok.java b/src/main/java/com/server/hispath/student/domain/Inhyok.java new file mode 100644 index 0000000..58f326a --- /dev/null +++ b/src/main/java/com/server/hispath/student/domain/Inhyok.java @@ -0,0 +1,24 @@ +//package com.server.hispath.student.domain; +// +//import com.server.hispath.activity.domain.Activity; +//import com.server.hispath.category.application.dto.CategoryDto; +//import lombok.AllArgsConstructor; +//import lombok.Getter; +//import lombok.NoArgsConstructor; +// +//@Getter +//@NoArgsConstructor +//@AllArgsConstructor +//public class Inhyok { +// private Long id; +// private String semester; +// private String name; +// private String remark; +// private CategoryDto category; +// private boolean participated; +// +// public Inhyok(Activity activity, boolean participated) { +// return new Inhyok(activity.getId(), activity.getSemester(), activity.getName(), CategoryDto.from(activity.getCategory()), +// , participated); +// } +//} diff --git a/src/main/java/com/server/hispath/student/domain/Participant.java b/src/main/java/com/server/hispath/student/domain/Participant.java index 9b1fcae..69ea60f 100644 --- a/src/main/java/com/server/hispath/student/domain/Participant.java +++ b/src/main/java/com/server/hispath/student/domain/Participant.java @@ -75,4 +75,6 @@ public void update(ParticipantContentDto participantContentDto) { this.section = participantContentDto.getSection(); this.data = participantContentDto.getData(); } + + } diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java index 1dfd1c2..1c3fd0e 100644 --- a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java @@ -38,4 +38,9 @@ public interface StudentRepository extends JpaRepository { "left join fetch p.activity as a " + "where s.id = :id and a.requestStatus = 1") Optional findStudentWithMActivities(Long id); + +// @Query("select a from Student a " + +// "left join fetch a.participants as p " + +// "left join fetch p.activity as q ") +// Optional findParticipatedStudent(); } From 73863f6f545731e39bff86ad6e86bdb838210e30 Mon Sep 17 00:00:00 2001 From: lukehongg <79990740+lukehongg@users.noreply.github.com> Date: Tue, 8 Nov 2022 21:36:07 +0900 Subject: [PATCH 092/148] [Notice]:HotFix (#89) --- .../server/hispath/notice/application/dto/NoticeDto.java | 6 +++++- .../hispath/notice/presentation/NoticeController.java | 2 +- .../notice/presentation/response/NoticeResponse.java | 5 ++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java b/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java index 6b569b4..f3cb7b7 100644 --- a/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java +++ b/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java @@ -9,6 +9,7 @@ import javax.persistence.Column; import java.time.LocalDate; +import java.time.LocalDateTime; @Getter @NoArgsConstructor @@ -21,6 +22,9 @@ public class NoticeDto{ private int viewCnt; private boolean importance; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDateTime regDate; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") private LocalDate pubDate; @@ -29,6 +33,6 @@ public class NoticeDto{ public static NoticeDto from(Notice notice) { return new NoticeDto(notice.getId(), ManagerDto.of(notice.getManager()), notice.getTitle(), - notice.getContent(), notice.getViewCnt(), notice.isImportance(), notice.getPubDate(), notice.getExpDate()); + notice.getContent(), notice.getViewCnt(), notice.isImportance(),notice.getCreatedAt() ,notice.getPubDate(), notice.getExpDate()); } } diff --git a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java index a664a30..aa4b18e 100644 --- a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java +++ b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java @@ -38,7 +38,7 @@ public ResponseEntity create(@RequestBody NoticeRequest request){ @GetMapping("/notice") @ApiOperation(value = ApiDoc.NOTICE_READ_ALL) public ResponseEntity> findAll() { - List responses = noticeService.findAll().stream().sorted(Comparator.comparing(NoticeDto::getId).reversed()).map(NoticeResponse::from).collect(Collectors.toList()); + List responses = noticeService.findAll().stream().sorted(Comparator.comparing(NoticeDto::getRegDate).reversed()).map(NoticeResponse::from).collect(Collectors.toList()); return ResponseEntity.ok(responses); } diff --git a/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java b/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java index cefd8a5..f50bba4 100644 --- a/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java +++ b/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java @@ -25,6 +25,9 @@ public class NoticeResponse { private int viewCnt; private boolean importance; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") + private LocalDate regDate; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") private LocalDate pubDate; @@ -33,6 +36,6 @@ public class NoticeResponse { public static NoticeResponse from(NoticeDto dto) { return new NoticeResponse(dto.getId(), dto.getManager().getId(), dto.getManager().getName(), - dto.getTitle(), dto.getContent(), dto.getViewCnt(), dto.isImportance(), dto.getPubDate(), dto.getExpDate()); + dto.getTitle(), dto.getContent(), dto.getViewCnt(), dto.isImportance(),dto.getRegDate().toLocalDate() ,dto.getPubDate(), dto.getExpDate()); } } From 6487b1eebf3568b5da5ecf3cb98064785a939d8d Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Fri, 11 Nov 2022 10:49:25 +0900 Subject: [PATCH 093/148] =?UTF-8?q?fix[#90]=20:=20Scholarship=20get=20Stud?= =?UTF-8?q?ent=20API=20=EC=88=98=EC=A0=95=20(#91)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/scholarship/application/dto/ScholarshipDto.java | 4 +++- .../presentation/response/ScholarshipResponse.java | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java index 9391629..825670e 100644 --- a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java +++ b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java @@ -12,6 +12,7 @@ @NoArgsConstructor @AllArgsConstructor public class ScholarshipDto { + private Long studentId; private String name; private String studentNum; private String semester; @@ -25,7 +26,8 @@ public class ScholarshipDto { private int totalWeight; public static ScholarshipDto of(Scholarship scholarship) { - return new ScholarshipDto(scholarship.getStudent().getName(), scholarship.getStudent().getStudentNum(), + return new ScholarshipDto(scholarship.getId(), scholarship.getStudent().getName(), scholarship.getStudent() + .getStudentNum(), scholarship.getSemester(), scholarship.getStudentSemester(), scholarship.getSDepartment().getName(), scholarship.getSMajor1().getName(), scholarship.getSMajor2().getName(), scholarship.getStudent() .getEmail(), diff --git a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java index 9724ed0..ae544d8 100644 --- a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java +++ b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java @@ -12,6 +12,7 @@ @NoArgsConstructor @AllArgsConstructor public class ScholarshipResponse { + private Long studentId; private String name; private String studentNum; private String semester; @@ -23,8 +24,8 @@ public class ScholarshipResponse { private String phone; private int totalWeight; - public static ScholarshipResponse of(ScholarshipDto dto){ - return new ScholarshipResponse(dto.getName(), dto.getStudentNum(), + public static ScholarshipResponse of(ScholarshipDto dto) { + return new ScholarshipResponse(dto.getStudentId(), dto.getName(), dto.getStudentNum(), dto.getSemester(), dto.getStudentSemester(), dto.getDepartmentName(), dto.getMajor1Name(), dto.getMajor2Name(), dto.getEmail(), dto.getPhone(), dto.getTotalWeight()); } From 1757b07705c1592f12652ed9467697ef43bebfc1 Mon Sep 17 00:00:00 2001 From: gomster Date: Fri, 11 Nov 2022 11:47:03 +0900 Subject: [PATCH 094/148] =?UTF-8?q?hotfix=20:=20studentID=20=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=B4=EB=82=B4=EC=A4=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/scholarship/application/dto/ScholarshipDto.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java index 825670e..f182b21 100644 --- a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java +++ b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipDto.java @@ -26,8 +26,8 @@ public class ScholarshipDto { private int totalWeight; public static ScholarshipDto of(Scholarship scholarship) { - return new ScholarshipDto(scholarship.getId(), scholarship.getStudent().getName(), scholarship.getStudent() - .getStudentNum(), + return new ScholarshipDto(scholarship.getStudent().getId(), scholarship.getStudent().getName(), scholarship.getStudent() + .getStudentNum(), scholarship.getSemester(), scholarship.getStudentSemester(), scholarship.getSDepartment().getName(), scholarship.getSMajor1().getName(), scholarship.getSMajor2().getName(), scholarship.getStudent() .getEmail(), From 82b00797c95b1637483a1b339ba0025997b05a34 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sun, 13 Nov 2022 00:03:37 +0900 Subject: [PATCH 095/148] =?UTF-8?q?[#93]=20:=20=EA=B0=9C=EC=9D=B8=EC=9D=B4?= =?UTF-8?q?=20=EC=B0=B8=EC=97=AC=ED=95=9C=20=EA=B0=9C=EC=9D=B8=20=ED=99=9C?= =?UTF-8?q?=EB=8F=99=20=ED=95=99=EA=B8=B0=EB=B3=84,=20=EC=84=B9=EC=85=98?= =?UTF-8?q?=EB=B3=84=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84=20(#9?= =?UTF-8?q?4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/ActivityService.java | 12 ++++++++++ .../domain/repository/ActivityRepository.java | 7 ++++++ .../ActivityParticipantStatusResponse.java | 24 +++++++++++++++++++ .../java/com/server/hispath/docs/ApiDoc.java | 2 +- .../hispath/student/domain/Participant.java | 3 +++ .../presentation/StudentController.java | 14 +++++++++++ 6 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantStatusResponse.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index f87daa8..2acb680 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -121,6 +121,18 @@ public List findAllParticipantActivites(Long id, String .collect(Collectors.toList()); } + @Transactional(readOnly = true) + public List findAllPersonalParticipantActivites(Long id, String semester, String section) { + Student student = studentRepository.findStudentWithActivities(id).orElseThrow(StudentNotFoundException::new); + return student.getParticipants() + .stream() + .filter(participant -> participant.isSameSemester(semester)) + .filter(participant -> participant.isSameSection(section)) + .filter(Participant::isPersonal) + .map(ActivityParticipantDto::of) + .collect(Collectors.toList()); + } + @Transactional(readOnly = true) public ActivityParticipantDto findParticipantActivityById(Long studentId, Long activityId) { Activity activity = activityRepository.findActivityWithStudents(activityId) diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java index cafd6f3..766bf08 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -18,6 +18,13 @@ public interface ActivityRepository extends JpaRepository { "where a.id = :id ") Optional findActivityWithStudents(Long id); + @Query("select a from Activity a " + + "left join fetch a.participants as p " + + "left join fetch p.student " + + "where a.id = :id " + + "and a.personal = true ") + Optional findActivityWithStudentsAndPeronel(Long id); + @Query("select a from Activity a " + "left join fetch a.participants as p " + "where p.student = :student " + diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantStatusResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantStatusResponse.java new file mode 100644 index 0000000..98f770f --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityParticipantStatusResponse.java @@ -0,0 +1,24 @@ +package com.server.hispath.activity.presentation.response; + +import com.server.hispath.activity.application.dto.ActivityParticipantDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ActivityParticipantStatusResponse { + private Long id; + private String semester; + private String name; + private String remark; + private String section; + private int requestStatus; + + public static ActivityParticipantStatusResponse of(ActivityParticipantDto dto) { + return new ActivityParticipantStatusResponse(dto.getId(), dto.getSemester(), dto.getName(), + dto.getRemark(), dto.getParticipant().getSection().getName(), dto.getRequestStatus()); + } +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index ea3dc2f..c368e80 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -27,7 +27,7 @@ public class ApiDoc { public static final String STUDENT_ACTIVITY_CREATE = "학생의 개인 활동 생성"; public static final String STUDENT_ACTIVITY_UPDATE = "학생의 참여 활동 수정"; public static final String STUDENT_ACTIVITY_READ_SEMESTER = "학생의 참여 활동 학기별 조회"; - + public static final String STUDENT_ACTIVITY_READ_SEMESTER_SECTION_STATUS = "학생의 참여 활동 상태와 함께 학기별, 섹션별 조회"; public static final String STUDENT_ACTIVITY_READ_PARTICIPATE = "전체 활동 중 학생 참여 활동 조회"; public static final String SECTION_READ_ALL = "모든 섹션 조회"; public static final String PARTICIPANT_DELETE = "학생 참여 데이터 삭제"; diff --git a/src/main/java/com/server/hispath/student/domain/Participant.java b/src/main/java/com/server/hispath/student/domain/Participant.java index 69ea60f..9e8b7e3 100644 --- a/src/main/java/com/server/hispath/student/domain/Participant.java +++ b/src/main/java/com/server/hispath/student/domain/Participant.java @@ -76,5 +76,8 @@ public void update(ParticipantContentDto participantContentDto) { this.data = participantContentDto.getData(); } + public boolean isPersonal(){ + return this.activity.isPersonal(); + } } diff --git a/src/main/java/com/server/hispath/student/presentation/StudentController.java b/src/main/java/com/server/hispath/student/presentation/StudentController.java index 39e0e28..cfacede 100644 --- a/src/main/java/com/server/hispath/student/presentation/StudentController.java +++ b/src/main/java/com/server/hispath/student/presentation/StudentController.java @@ -3,6 +3,8 @@ import java.util.List; import java.util.stream.Collectors; +import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.presentation.response.ActivityParticipantStatusResponse; import com.server.hispath.docs.ApiDoc; import com.server.hispath.notice.application.NoticeService; import com.server.hispath.notice.application.dto.DashboardNoticeDto; @@ -29,6 +31,7 @@ public class StudentController { private final StudentService studentService; private final NoticeService noticeService; + private final ActivityService activityService; @PostMapping("/student") @ApiOperation(value = ApiDoc.STUDENT_CREATE) @@ -84,4 +87,15 @@ public ResponseEntity getDashboardInfo(@PathVariable Long id) List dashboardNoticeDtos = noticeService.findRecentNotice(); return ResponseEntity.ok(DashboardResponse.from(studentDto, dashboardNoticeDtos)); } + + @GetMapping("/student-activities/status") + @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_READ_SEMESTER_SECTION_STATUS) + public ResponseEntity> findStudentActivitiesWithStatus(@RequestParam String semester, @RequestParam String section) { + // ToDo Student ID 관련해서는 나중에 Login 처리하기 현재는 1L로 되어있음 + List responses = activityService.findAllPersonalParticipantActivites(1L, semester, section) + .stream() + .map(ActivityParticipantStatusResponse::of) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } } From b6af476abbc53305b1a5191b1399c895fad55a91 Mon Sep 17 00:00:00 2001 From: davidpiao Date: Sun, 13 Nov 2022 01:36:26 +0900 Subject: [PATCH 096/148] =?UTF-8?q?hotfix=20:=20scholarship=20approve=20al?= =?UTF-8?q?l=20api=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/scholarship/application/ScholarshipService.java | 2 +- .../com/server/hispath/scholarship/domain/Scholarship.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index cbe9359..c2e3a70 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -99,7 +99,7 @@ public void approveAll(List scholarshipApprovalDtos, Str .orElseThrow(StudentNotFoundException::new); Scholarship scholarship = scholarshipRepository.findFirstByStudentAndSemester(student, semester) .orElseThrow(ScholarshipNotFoundException::new); - scholarship.approve(); + scholarship.approve(dto.getResult()); }); diff --git a/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java b/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java index b79eb69..17614b8 100644 --- a/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java +++ b/src/main/java/com/server/hispath/scholarship/domain/Scholarship.java @@ -51,8 +51,9 @@ public class Scholarship extends BaseEntity { private boolean approved = false; - public void approve() { + public void approve(String result) { approved = true; + this.result = result; } public boolean isStudentSemesterMatch(int studentSemester) { From eab609325e10136fd519aff2df99e6daa702bd62 Mon Sep 17 00:00:00 2001 From: shinel98 <75024473+shinel98@users.noreply.github.com> Date: Sun, 13 Nov 2022 01:50:15 +0900 Subject: [PATCH 097/148] =?UTF-8?q?[#87]=20:=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=ED=99=9C=EB=8F=99=20=EC=A4=91=20=ED=95=99=EC=83=9D=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=20=EB=A7=88=EC=9D=BC=EB=A6=AC=EC=A7=80=20=ED=99=9C?= =?UTF-8?q?=EB=8F=99=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84=20(#9?= =?UTF-8?q?5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * git 문제 해결 * [#76] : 마일리지 활동 카테고리별, 학기별 필터링 API 구현 * git 문제 해결 * git 해결되었나 체크 * [#87] : 전체 활동 중 학생 참여 활동 조회 API 구현 * feat[#87] : 전체 활동 중 학생 참여 활동 조회 API 구현 --- .../application/MActivityService.java | 18 +++++---------- .../dto/AllMActivityParticipantDto.java | 4 +--- .../presentation/MActivityController.java | 22 +++++++++++++++---- .../AllMActivityParticipantResponse.java | 6 +++-- .../java/com/server/hispath/docs/ApiDoc.java | 1 + .../hispath/student/domain/Participant.java | 1 + 6 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/MActivityService.java b/src/main/java/com/server/hispath/activity/application/MActivityService.java index 2b1efbb..cd222b2 100644 --- a/src/main/java/com/server/hispath/activity/application/MActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/MActivityService.java @@ -1,6 +1,7 @@ package com.server.hispath.activity.application; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import com.server.hispath.activity.application.dto.*; @@ -141,22 +142,15 @@ public List findSemestersById(Long studentId) { public ListfindParticipatedActivities(Long id, String semester, String category) { List activities = activityRepository.findParticipatedActivity(); Student student = studentRepository.findById(id).orElseThrow(StudentNotFoundException::new); - List collect = activities.stream() - .filter(activity -> activity.isSameSemester(semester) && activity.isSameCategory(category)) - .map(activity -> {return AllMActivityParticipantDto.of(activity, activity.isParticipate(student)); }) - .collect(Collectors.toList()); + .filter(activity -> activity.isSameSemester(semester) && activity.isSameCategory(category)) + .map(activity -> { + return AllMActivityParticipantDto.of(activity, activity.isParticipate(student)); + }) + .collect(Collectors.toList()); return collect; - -// return activities -// .stream() -// .map(activity -> activity.getParticipants().stream() -// .filter(participant -> participant.isSameSemester(semester)) -// .filter(participant -> participant.isSameCategory(category)) -// .map(participant -> { return AllMActivityParticipantDto.of(participant, participant.isSameStudent(student));}).collect(Collectors.toList())); - } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/AllMActivityParticipantDto.java b/src/main/java/com/server/hispath/activity/application/dto/AllMActivityParticipantDto.java index e7b996c..a1a6105 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/AllMActivityParticipantDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/AllMActivityParticipantDto.java @@ -21,8 +21,6 @@ public static AllMActivityParticipantDto of(Activity activity, boolean participa return new AllMActivityParticipantDto(activity.getId(), activity.getSemester(), activity.getName(), activity.getRemark(), CategoryDto.from(activity.getCategory()), participated); } - public boolean getParticipated(){ - return participated; - } + } diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 78f184d..09ac126 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -1,6 +1,7 @@ package com.server.hispath.activity.presentation; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; @@ -75,6 +76,7 @@ public ResponseEntity> findAllBySemester(@RequestParam St @GetMapping("/mileages") @ApiOperation(value = ApiDoc.MILEAGE_READ_ALL) public ResponseEntity> findAll() { + List responses = mActivityService.findAll() .stream() .map(ActivityResponse::from) @@ -146,10 +148,22 @@ public ResponseEntity> findParticipatedActivi @GetMapping("/student-allmactivities/{id}") @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_READ_PARTICIPATE) public ResponseEntity> findAllParticipatedActivities(@PathVariable Long id, @RequestParam String semester, @RequestParam String category) { - List responses = mActivityService.findParticipatedActivities(id, semester, category) - .stream() - .map(AllMActivityParticipantResponse::of) - .collect(Collectors.toList()); + + List responses; + if(Objects.equals(category, "참여여부")){ + responses = mActivityService.findParticipatedActivities(id, semester, "ALL") + .stream() + .filter(example -> example.isParticipated()) + .map(AllMActivityParticipantResponse::of) + .collect(Collectors.toList()); + } + else { + responses = mActivityService.findParticipatedActivities(id, semester, category) + .stream() + .map(AllMActivityParticipantResponse::of) + .collect(Collectors.toList()); + } return ResponseEntity.ok(responses); } + } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/activity/presentation/response/AllMActivityParticipantResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/AllMActivityParticipantResponse.java index bb207fa..f638c7a 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/AllMActivityParticipantResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/AllMActivityParticipantResponse.java @@ -15,10 +15,12 @@ public class AllMActivityParticipantResponse { private String name; private String remark; private String category; - private boolean participated; + + private boolean participated; public static AllMActivityParticipantResponse of(AllMActivityParticipantDto dto) { return new AllMActivityParticipantResponse(dto.getId(), dto.getSemester(), dto.getName(), dto.getRemark(), - dto.getCategory().getName(), dto.getParticipated()); + dto.getCategory().getName(), dto.isParticipated()); + } } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index c368e80..760e9b0 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -28,6 +28,7 @@ public class ApiDoc { public static final String STUDENT_ACTIVITY_UPDATE = "학생의 참여 활동 수정"; public static final String STUDENT_ACTIVITY_READ_SEMESTER = "학생의 참여 활동 학기별 조회"; public static final String STUDENT_ACTIVITY_READ_SEMESTER_SECTION_STATUS = "학생의 참여 활동 상태와 함께 학기별, 섹션별 조회"; + public static final String STUDENT_ACTIVITY_READ_PARTICIPATE = "전체 활동 중 학생 참여 활동 조회"; public static final String SECTION_READ_ALL = "모든 섹션 조회"; public static final String PARTICIPANT_DELETE = "학생 참여 데이터 삭제"; diff --git a/src/main/java/com/server/hispath/student/domain/Participant.java b/src/main/java/com/server/hispath/student/domain/Participant.java index 9e8b7e3..dd557a8 100644 --- a/src/main/java/com/server/hispath/student/domain/Participant.java +++ b/src/main/java/com/server/hispath/student/domain/Participant.java @@ -80,4 +80,5 @@ public boolean isPersonal(){ return this.activity.isPersonal(); } + } From 2a6930ca6ba43a9fbbad4b09e640d9d3306b25f2 Mon Sep 17 00:00:00 2001 From: davidpiao Date: Sun, 13 Nov 2022 02:03:03 +0900 Subject: [PATCH 098/148] =?UTF-8?q?hotfix=20:=20scholarship=20=EC=88=98?= =?UTF-8?q?=ED=98=9C=20=EA=B8=88=EC=95=A1=20=EB=B6=88=EB=9F=AC=EC=98=A4?= =?UTF-8?q?=EA=B8=B0=20api=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scholarship/presentation/response/ScholarshipResponse.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java index ae544d8..f505672 100644 --- a/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java +++ b/src/main/java/com/server/hispath/scholarship/presentation/response/ScholarshipResponse.java @@ -22,11 +22,12 @@ public class ScholarshipResponse { private String major2Name; private String email; private String phone; + private String result; private int totalWeight; public static ScholarshipResponse of(ScholarshipDto dto) { return new ScholarshipResponse(dto.getStudentId(), dto.getName(), dto.getStudentNum(), dto.getSemester(), dto.getStudentSemester(), dto.getDepartmentName(), dto.getMajor1Name(), - dto.getMajor2Name(), dto.getEmail(), dto.getPhone(), dto.getTotalWeight()); + dto.getMajor2Name(), dto.getEmail(), dto.getPhone(), dto.getResult(), dto.getTotalWeight()); } } From f12664829ea349c7a77496b649a1d2d402ab5f1d Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sun, 13 Nov 2022 17:06:59 +0900 Subject: [PATCH 099/148] =?UTF-8?q?[#65]=20:=20=EB=A7=88=EC=9D=BC=EB=A6=AC?= =?UTF-8?q?=EC=A7=80=20=ED=99=9C=EB=8F=99=20=EC=B9=B4=ED=85=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=B0=A8=ED=8A=B8=20=EA=B4=80=EB=A0=A8=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#96)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#65] : 학생이 참여한 학기들 조회 API 구현 * feat[#65] : 중복되는 메서드 없애고 QueryDsl로 한번에 처리 * feat[#65] : 차트 관련 개발 잠깐 멈춤 Query DSL, Projection, GroupBy를 사용해서 해결하기 * feat[#65] : 차트만들기 중간점검 * feat[#65] : 이동을 위함 * feat[#65] : chart Category Data 가져오기 부분 구현 * feat[#65] : category 별로 chart data 받아오는 API 구현 --- .../activity/application/ActivityService.java | 41 +++++++-- .../activity/application/dto/ActivityDto.java | 5 + .../application/dto/ChartCategoryCntDto.java | 39 ++++++++ .../application/dto/ChartDataDto.java | 29 ++++++ .../dto/ChartSearchRequestDto.java | 18 ++++ .../repository/ActivityRepositoryCustom.java | 92 +++++++++++++++++++ .../presentation/ActivityController.java | 9 +- .../presentation/ChartController.java | 43 +++++++++ .../presentation/MActivityController.java | 35 +++---- .../response/MileageChartResponse.java | 18 ++++ .../response/chart/ChartDataResponse.java | 23 +++++ .../response/chart/ChartRankResponse.java | 12 +++ .../java/com/server/hispath/docs/ApiDoc.java | 8 +- .../application/dto/SearchRequestDto.java | 7 +- .../ScholarshipRepositoryCustom.java | 8 +- .../presentation/ScholarshipController.java | 2 +- .../student/application/StudentService.java | 39 +++++--- .../hispath/student/domain/Participant.java | 5 +- .../domain/repository/StudentRepository.java | 4 - .../repository/StudentRepositoryCustom.java | 49 ++++++++++ .../presentation/StudentController.java | 13 +++ 21 files changed, 439 insertions(+), 60 deletions(-) create mode 100644 src/main/java/com/server/hispath/activity/application/dto/ChartCategoryCntDto.java create mode 100644 src/main/java/com/server/hispath/activity/application/dto/ChartDataDto.java create mode 100644 src/main/java/com/server/hispath/activity/application/dto/ChartSearchRequestDto.java create mode 100644 src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/ChartController.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/MileageChartResponse.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDataResponse.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/chart/ChartRankResponse.java create mode 100644 src/main/java/com/server/hispath/student/domain/repository/StudentRepositoryCustom.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index 2acb680..2c3d347 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -7,6 +7,7 @@ import com.server.hispath.activity.application.dto.*; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; +import com.server.hispath.activity.domain.repository.ActivityRepositoryCustom; import com.server.hispath.category.application.CategoryService; import com.server.hispath.category.domain.Category; import com.server.hispath.category.domain.repository.CategoryRepository; @@ -16,6 +17,7 @@ import com.server.hispath.student.domain.Participant; import com.server.hispath.student.domain.Student; import com.server.hispath.student.domain.repository.StudentRepository; +import com.server.hispath.student.domain.repository.StudentRepositoryCustom; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,6 +32,8 @@ public class ActivityService { private final CategoryService categoryService; private final CategoryRepository categoryRepository; private final StudentRepository studentRepository; + private final StudentRepositoryCustom studentRepositoryCustom; + private final ActivityRepositoryCustom activityRepositoryCustom; @Transactional public Long create(Long categoryId, ActivityContentDto dto) { @@ -68,10 +72,6 @@ public void delete(Long id) { activityRepository.deleteById(id); } - public Activity findById(Long id) { - return activityRepository.findById(id).orElseThrow(ActivityNotFoundException::new); - } - @Transactional(readOnly = true) public List bringSemester() { List semesters = activityRepository.bringSemester(); @@ -150,8 +150,8 @@ public ActivityParticipantDto findParticipantActivityById(Long studentId, Long a @Transactional(readOnly = true) public List findAllByStudentAndSemster(Long id, String semester) { - Student student = studentRepository.findStudentWithIdAndSemester(id, semester) - .orElseThrow(StudentNotFoundException::new); + Student student = findStudentWholeByIdAndSemester(id, semester, false); + return student.getParticipants() .stream() .map(participant -> ActivityDto.from(participant.getActivity())) @@ -172,4 +172,33 @@ public void approve(Long activityId, int weight) { public void reject(Long activityId) { this.findById(activityId).reject(); } + + + @Transactional(readOnly = true) + public List getChartDatasByCategory(Long studentId, ChartSearchRequestDto dto) { + Student student = studentRepository.findById(studentId).orElseThrow(StudentNotFoundException::new); + List studentCnts = activityRepositoryCustom.getStudentCategoryChartCnt(student, dto); + List totalCnts = activityRepositoryCustom.getTotalCategoryChartCnt(dto); + int totalStudentCnt = activityRepositoryCustom.getTotalStudentCntByChartSearchRequest(dto); + + return totalCnts.stream() + .map(totalCnt -> + studentCnts.stream() + .filter(studentCnt -> studentCnt.isSameCategory(totalCnt.getCategory())) + .findFirst() + .map(studentCnt -> new ChartDataDto(studentCnt, totalCnt.getCnt(), totalStudentCnt)) + .orElseGet(() -> new ChartDataDto(totalCnt.getCategory(), totalCnt.getCnt(), totalStudentCnt)) + ) + .collect(Collectors.toList()); + + } + + private Student findStudentWholeByIdAndSemester(Long studentId, String semester, boolean isMileage) { + return studentRepositoryCustom.findStudentWithIdAndSemester(studentId, semester, isMileage) + .orElseThrow(StudentNotFoundException::new); + } + + public Activity findById(Long id) { + return activityRepository.findById(id).orElseThrow(ActivityNotFoundException::new); + } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java index d5eb6e1..0df3724 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java @@ -2,6 +2,7 @@ import com.server.hispath.activity.domain.Activity; import com.server.hispath.category.application.dto.CategoryDto; +import com.server.hispath.student.domain.Participant; import lombok.AllArgsConstructor; import lombok.Getter; @@ -25,4 +26,8 @@ public static ActivityDto from(Activity activity) { activity.isPersonal(), activity.getName(), activity.getRemark(), activity.getWeight(), activity.isStudentRegistered()); } + + public static ActivityDto from(Participant participant){ + return ActivityDto.from(participant.getActivity()); + } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartCategoryCntDto.java b/src/main/java/com/server/hispath/activity/application/dto/ChartCategoryCntDto.java new file mode 100644 index 0000000..051fa5b --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ChartCategoryCntDto.java @@ -0,0 +1,39 @@ +package com.server.hispath.activity.application.dto; + +import java.util.Objects; + +import com.querydsl.core.annotations.QueryProjection; +import com.server.hispath.category.application.dto.CategoryDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ChartCategoryCntDto { + private CategoryDto category; + private Long cnt; + + @QueryProjection + public ChartCategoryCntDto(Long categoryId, String categoryName, Long cnt) { + this.category = new CategoryDto(categoryId, categoryName); + this.cnt = cnt; + } + + @QueryProjection + public ChartCategoryCntDto(Long categoryId, String categoryName, Integer cnt) { + this.category = new CategoryDto(categoryId, categoryName); + this.cnt = cnt.longValue(); + } + + public ChartCategoryCntDto(CategoryDto category) { + this.category = category; + this.cnt = 0L; + } + + public boolean isSameCategory(CategoryDto categoryDto){ + return Objects.equals(categoryDto.getId(), this.category.getId()); + } +} diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartDataDto.java b/src/main/java/com/server/hispath/activity/application/dto/ChartDataDto.java new file mode 100644 index 0000000..4bda603 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ChartDataDto.java @@ -0,0 +1,29 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.category.application.dto.CategoryDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ChartDataDto { + + private CategoryDto category; + private Long myCnt; + private Double averageCnt; + + public ChartDataDto(ChartCategoryCntDto dto, Long totalCnt, int totalStudent) { + this.category = dto.getCategory(); + this.myCnt = dto.getCnt(); + this.averageCnt = totalCnt / (double) totalStudent; + } + + public ChartDataDto(CategoryDto dto, Long totalCnt, int totalStudent) { + this.category = dto; + this.myCnt = 0L; + this.averageCnt = totalCnt / (double) totalStudent; + } +} diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartSearchRequestDto.java b/src/main/java/com/server/hispath/activity/application/dto/ChartSearchRequestDto.java new file mode 100644 index 0000000..2ae7340 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ChartSearchRequestDto.java @@ -0,0 +1,18 @@ +package com.server.hispath.activity.application.dto; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ChartSearchRequestDto { + private String semester; + private Integer grade; + private String department; + private String major; +} diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java new file mode 100644 index 0000000..752b4fd --- /dev/null +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java @@ -0,0 +1,92 @@ +package com.server.hispath.activity.domain.repository; + +import java.util.List; +import java.util.Objects; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.JPAExpressions; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.server.hispath.activity.application.dto.ChartCategoryCntDto; +import com.server.hispath.activity.application.dto.ChartSearchRequestDto; +import com.server.hispath.activity.application.dto.QChartCategoryCntDto; +import com.server.hispath.student.domain.Student; + +import org.springframework.stereotype.Repository; + +import lombok.RequiredArgsConstructor; + +import static com.server.hispath.activity.domain.QActivity.activity; +import static com.server.hispath.category.domain.QCategory.category; +import static com.server.hispath.student.domain.QParticipant.participant; +import static com.server.hispath.student.domain.QStudent.student; + +@Repository +@RequiredArgsConstructor +public class ActivityRepositoryCustom { + private final JPAQueryFactory queryFactory; + + public List getStudentCategoryChartCnt(Student student, ChartSearchRequestDto dto) { + return queryFactory.select(new QChartCategoryCntDto(category.id, category.name, activity.count())) + .from(activity) + .leftJoin(activity.participants, participant) + .leftJoin(activity.category, category) + .where(studentChartCategoryCondition(student, dto)) + .groupBy(category) + .fetch(); + + } + + public List getTotalCategoryChartCnt(ChartSearchRequestDto dto) { + return queryFactory.select(new QChartCategoryCntDto(category.id, category.name, activity.participants.size() + .count())) + .from(activity) + .leftJoin(activity.participants, participant) + .leftJoin(participant.activity, activity) + .leftJoin(activity.category, category) + .where(totalChartCategoryCondition(dto)) + .groupBy(category) + .fetch(); + } + + public int getTotalStudentCntByChartSearchRequest(ChartSearchRequestDto dto) { + return queryFactory.selectDistinct(participant.student.id) + .from(activity) + .leftJoin(activity.participants, participant) + .where(totalChartCategoryCondition(dto)) + .fetch().size(); + } + + public BooleanBuilder studentChartCategoryCondition(Student student, ChartSearchRequestDto dto) { + BooleanBuilder booleanBuilder = new BooleanBuilder(); + + booleanBuilder.and(participant.student.eq(student)); + booleanBuilder = semesterDepartmentMajorCondition(booleanBuilder, dto); + + return booleanBuilder; + } + + public BooleanBuilder totalChartCategoryCondition(ChartSearchRequestDto dto) { + BooleanBuilder booleanBuilder = new BooleanBuilder(); + booleanBuilder = semesterDepartmentMajorCondition(booleanBuilder, dto); + if (!Objects.isNull(dto.getGrade())) { + int grade = (dto.getGrade() + 1) / 2 * 2; + booleanBuilder.and(participant.student.semester.eq(grade - 1).or(participant.student.semester.eq(grade))); + } + if (!Objects.isNull(dto.getMajor())) { + booleanBuilder.and(participant.student.major1.name.eq(dto.getMajor())); + } + return booleanBuilder; + } + + + public BooleanBuilder semesterDepartmentMajorCondition(BooleanBuilder booleanBuilder, ChartSearchRequestDto dto) { + if (!Objects.isNull(dto.getSemester())) { + booleanBuilder.and(activity.semester.eq(dto.getSemester())); + } + if (!Objects.isNull(dto.getDepartment())) { + booleanBuilder.and(participant.student.department.name.eq(dto.getDepartment())); + } + return booleanBuilder; + } + +} diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index b0fb475..b9ad75d 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -5,12 +5,8 @@ import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; -import com.server.hispath.activity.application.dto.*; import com.server.hispath.activity.application.MActivityService; -import com.server.hispath.activity.application.dto.ActivityContentDto; -import com.server.hispath.activity.application.dto.ActivityDto; -import com.server.hispath.activity.application.dto.MStudentActivityDetailDto; -import com.server.hispath.activity.application.dto.SemesterDto; +import com.server.hispath.activity.application.dto.*; import com.server.hispath.activity.presentation.request.ActivityApproveRequest; import com.server.hispath.activity.presentation.request.ActivityCURequest; import com.server.hispath.activity.presentation.request.StudentActivityCURequest; @@ -26,14 +22,12 @@ import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.apache.poi.ss.formula.EvaluationName; @RestController @RequiredArgsConstructor @RequestMapping("/api") public class ActivityController { private final ActivityService activityService; - private final MActivityService mActivityService; @PostMapping("/activity") @@ -152,7 +146,6 @@ public ResponseEntity rejectActivity(@PathVariable Long id) { } - @GetMapping("/activity-detail/{activityId}") @ApiOperation(value = ApiDoc.ACTIVITY_STUDENT_DETAIL) public ResponseEntity findParticipantActivityById(@PathVariable Long activityId) { diff --git a/src/main/java/com/server/hispath/activity/presentation/ChartController.java b/src/main/java/com/server/hispath/activity/presentation/ChartController.java new file mode 100644 index 0000000..2be3a3e --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/ChartController.java @@ -0,0 +1,43 @@ +package com.server.hispath.activity.presentation; + +import java.util.List; +import java.util.stream.Collectors; + +import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.application.dto.ChartSearchRequestDto; +import com.server.hispath.activity.presentation.response.chart.ChartDataResponse; +import com.server.hispath.docs.ApiDoc; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import io.swagger.annotations.ApiOperation; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +public class ChartController { + private final ActivityService activityService; + + @GetMapping("/chart/category") + @ApiOperation(value = ApiDoc.CHART_STUDENT_CATEGORY) + public ResponseEntity> getChartDatasByCategory( + String semester, + @RequestParam(required = false) Integer grade, + @RequestParam(required = false) String department, + @RequestParam(required = false) String major + ) { + ChartSearchRequestDto chartSearchRequestDto = new ChartSearchRequestDto(semester, grade, department, major); + // ToDo 지금은 1L로 하지만 나중에 바꿀 예정 + List responses = activityService.getChartDatasByCategory(1L, chartSearchRequestDto) + .stream() + .map(ChartDataResponse::of) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } +} diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 09ac126..7ead274 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -10,7 +10,10 @@ import com.server.hispath.activity.presentation.request.MActivityCURequest; import com.server.hispath.activity.presentation.request.MParticipantRequest; import com.server.hispath.activity.presentation.request.MStudentRegisterRequest; -import com.server.hispath.activity.presentation.response.*; +import com.server.hispath.activity.presentation.response.ActivityResponse; +import com.server.hispath.activity.presentation.response.AllMActivityParticipantResponse; +import com.server.hispath.activity.presentation.response.MActivityParticipantResponse; +import com.server.hispath.activity.presentation.response.SemesterResponse; import com.server.hispath.docs.ApiDoc; import com.server.hispath.student.application.StudentService; import com.server.hispath.student.application.dto.StudentSimpleRefDto; @@ -126,20 +129,19 @@ public ResponseEntity findActivtyByStudentId(@PathVar public ResponseEntity> findSemestersById(@PathVariable Long id) { List semesters = mActivityService.findSemestersById(id); List responses = semesters.stream() - .map(SemesterResponse::from) - .collect(Collectors.toList()); + .map(SemesterResponse::from) + .collect(Collectors.toList()); return ResponseEntity.ok(responses); } - @GetMapping("/student-mactivities/{id}") @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_READ_SEMESTER) public ResponseEntity> findParticipatedActivities(@PathVariable Long id, @RequestParam String semester, @RequestParam String category) { List responses = mActivityService.findAllParticipantActivities(id, semester, category) - .stream() - .map(MActivityParticipantResponse::of) - .collect(Collectors.toList()); + .stream() + .map(MActivityParticipantResponse::of) + .collect(Collectors.toList()); return ResponseEntity.ok(responses); @@ -150,18 +152,17 @@ public ResponseEntity> findParticipatedActivi public ResponseEntity> findAllParticipatedActivities(@PathVariable Long id, @RequestParam String semester, @RequestParam String category) { List responses; - if(Objects.equals(category, "참여여부")){ + if (Objects.equals(category, "참여여부")) { responses = mActivityService.findParticipatedActivities(id, semester, "ALL") - .stream() - .filter(example -> example.isParticipated()) - .map(AllMActivityParticipantResponse::of) - .collect(Collectors.toList()); - } - else { + .stream() + .filter(example -> example.isParticipated()) + .map(AllMActivityParticipantResponse::of) + .collect(Collectors.toList()); + } else { responses = mActivityService.findParticipatedActivities(id, semester, category) - .stream() - .map(AllMActivityParticipantResponse::of) - .collect(Collectors.toList()); + .stream() + .map(AllMActivityParticipantResponse::of) + .collect(Collectors.toList()); } return ResponseEntity.ok(responses); } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/MileageChartResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/MileageChartResponse.java new file mode 100644 index 0000000..90a02e4 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/MileageChartResponse.java @@ -0,0 +1,18 @@ +package com.server.hispath.activity.presentation.response; + +import java.util.ArrayList; +import java.util.List; + +import com.server.hispath.activity.presentation.response.chart.ChartDataResponse; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class MileageChartResponse { + + private List chartDatas = new ArrayList<>(); +} diff --git a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDataResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDataResponse.java new file mode 100644 index 0000000..c203dce --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDataResponse.java @@ -0,0 +1,23 @@ +package com.server.hispath.activity.presentation.response.chart; + +import com.server.hispath.activity.application.dto.ChartDataDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ChartDataResponse { + + private Long categoryId; + private String categoryName; + private Long myCnt; + private Double averageCnt; + + public static ChartDataResponse of(ChartDataDto dto) { + return new ChartDataResponse(dto.getCategory().getId(), dto.getCategory().getName(), + dto.getMyCnt(), dto.getAverageCnt()); + } +} diff --git a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartRankResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartRankResponse.java new file mode 100644 index 0000000..c9a16c7 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartRankResponse.java @@ -0,0 +1,12 @@ +package com.server.hispath.activity.presentation.response.chart; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ChartRankResponse { + private Float rank; +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 760e9b0..60cb178 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -2,10 +2,6 @@ public class ApiDoc { - - /* Student 관련 API 명세 */ - - /* Activity 관련 API 명세 */ public static final String ACTIVITY_CREATE = "단일 활동 생성"; public static final String ACTIVITY_READ = "단일 활동 조회"; @@ -35,8 +31,11 @@ public class ApiDoc { public static final String ACTIVITY_APPLY = "학생 활동 마일리지 신청"; public static final String ACTIVITY_APPROVE = "학생 활동 마일리지 승인"; public static final String ACTIVITY_REJECT = "학생 활동 마일리지 반려"; + public static final String MILEAGE_CATEGORY_CHART_DATAS = "카테고리 당 마일리지 참여, 평균 수 조회"; public static final String ACTIVITY_STUDENT_DETAIL = "학생 개인 활동 상세 조회"; + /* Chart 관련 API 명세 */ + public static final String CHART_STUDENT_CATEGORY = "카테고리에 따른 학생 활동 차트 데이터 조회"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; @@ -67,6 +66,7 @@ public class ApiDoc { public static final String STUDENT_UPDATE = "학생 수정"; public static final String STUDENT_DELETE = "학생 삭제"; public static final String DASHBOARD = "메인페이지 대시보드 정보 조회"; + public static final String STUDENT_SEMESTER = "학생의 활동 학기들 조회"; /* Manager 관련 API 명세 */ public static final String MANAGER_READ = "단일 관리자 조회"; diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/SearchRequestDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/SearchRequestDto.java index 245902b..741295d 100644 --- a/src/main/java/com/server/hispath/scholarship/application/dto/SearchRequestDto.java +++ b/src/main/java/com/server/hispath/scholarship/application/dto/SearchRequestDto.java @@ -1,6 +1,7 @@ package com.server.hispath.scholarship.application.dto; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -10,7 +11,7 @@ public class SearchRequestDto { private String semester; private String studentSemester; - String department; - String major1; - String major2; + private String department; + private String major1; + private String major2; } diff --git a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java index 76c6de6..37befa5 100644 --- a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java +++ b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java @@ -25,10 +25,10 @@ public List searchScholarshipStudent(SearchRequestDto dto) { return queryFactory.select(scholarship) .distinct() .from(scholarship) - .leftJoin(scholarship.student) - .leftJoin(scholarship.sDepartment) - .leftJoin(scholarship.sMajor1) - .leftJoin(scholarship.sMajor2) + .leftJoin(scholarship.student).fetchJoin() + .leftJoin(scholarship.sDepartment).fetchJoin() + .leftJoin(scholarship.sMajor1).fetchJoin() + .leftJoin(scholarship.sMajor2).fetchJoin() .where(scholarshipStudentCondition(dto)) .fetch(); diff --git a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java index 2d45c51..b6bfda3 100644 --- a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java +++ b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java @@ -78,7 +78,7 @@ public ResponseEntity approveAll(@RequestPart(value = "file", required = f @GetMapping("/scholarship/students") @ApiOperation(value = ApiDoc.SCHOLARSHIP_SEARCH_STUDENT) public ResponseEntity> searchScholarshipStudents( - @RequestParam(required = false) String semester , + @RequestParam(required = false) String semester, @RequestParam(required = false) String studentSemester, @RequestParam(required = false) String department, @RequestParam(required = false) String major1, diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java index 899988b..d4b6944 100644 --- a/src/main/java/com/server/hispath/student/application/StudentService.java +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -1,5 +1,6 @@ package com.server.hispath.student.application; +import com.server.hispath.activity.application.dto.SemesterDto; import com.server.hispath.department.application.DepartmentService; import com.server.hispath.department.domain.Department; import com.server.hispath.exception.activity.ParticipantNotFoundException; @@ -8,7 +9,9 @@ import com.server.hispath.major.domain.Major; import com.server.hispath.student.application.dto.StudentCUDto; import com.server.hispath.student.application.dto.StudentDto; + import java.util.List; + import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.MActivityService; import com.server.hispath.activity.domain.Activity; @@ -49,13 +52,13 @@ public Long create(StudentCUDto dto) { @Transactional public void createAll(List dtos) { List students = dtos.stream() - .map(dto -> { - Student student = findById(Long.valueOf(dto.getId())); - Department department = departmentService.findById(dto.getDepartmentId()); - Major major1 = majorService.findById(dto.getMajor1Id()); - Major major2 = majorService.findById(dto.getMajor2Id()); - return student.from(dto, department, major1, major2); - }).collect(Collectors.toList()); + .map(dto -> { + Student student = findById(Long.valueOf(dto.getId())); + Department department = departmentService.findById(dto.getDepartmentId()); + Major major1 = majorService.findById(dto.getMajor1Id()); + Major major2 = majorService.findById(dto.getMajor2Id()); + return student.from(dto, department, major1, major2); + }).collect(Collectors.toList()); studentRepository.saveAll(students); } @@ -73,8 +76,8 @@ public List findAll() { System.out.println("student.getName() = " + student.getName()); }); return students.stream() - .map(StudentDto::from) - .collect(Collectors.toList()); + .map(StudentDto::from) + .collect(Collectors.toList()); } @Transactional @@ -102,7 +105,7 @@ public void registerParticipants(Long activityId, List stud mActivityService.deleteAllParticipant(activity); studentRefDtos.forEach(dto -> { Student student = studentRepository.findByStudentNum(dto.getStudentNum()) - .orElseThrow(StudentNotFoundException::new); + .orElseThrow(StudentNotFoundException::new); validateStudent(student, dto); activity.addParticipant(student, Section.ETC); }); @@ -110,7 +113,7 @@ public void registerParticipants(Long activityId, List stud } @Transactional - public void registerParticipant(Long activityId, StudentSimpleRefDto dto){ + public void registerParticipant(Long activityId, StudentSimpleRefDto dto) { Activity activity = activityService.findById(activityId); Student student = studentRepository.findByStudentNum(dto.getStudentNum()) .orElseThrow(StudentNotFoundException::new); @@ -118,9 +121,21 @@ public void registerParticipant(Long activityId, StudentSimpleRefDto dto){ activity.addParticipant(student, Section.ETC); } - private void validateStudent(Student student, StudentSimpleRefDto dto){ + private void validateStudent(Student student, StudentSimpleRefDto dto) { if (!student.isNameMatch(dto.getName())) { throw new StudentDataNotMatchException(dto.getStudentNum(), dto.getName()); } } + + @Transactional(readOnly = true) + public List getStudentSemesters(Long studentId) { + Student student = studentRepository.findActivitiesByStudent(studentId) + .orElseThrow(StudentNotFoundException::new); + return student.getParticipants() + .stream() + .map(participant -> participant.getActivity().getSemester()) + .distinct() + .map(SemesterDto::new) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/server/hispath/student/domain/Participant.java b/src/main/java/com/server/hispath/student/domain/Participant.java index dd557a8..01130ec 100644 --- a/src/main/java/com/server/hispath/student/domain/Participant.java +++ b/src/main/java/com/server/hispath/student/domain/Participant.java @@ -54,7 +54,6 @@ public boolean isSameSemester(String semester) { return activity.isSameSemester(semester); } - public boolean isSameSection(String section) { if (Objects.equals(section, "ALL")) return true; @@ -76,6 +75,10 @@ public void update(ParticipantContentDto participantContentDto) { this.data = participantContentDto.getData(); } + public String getActivityCategoryName(){ + return activity.getCategory().getName(); + } + public boolean isPersonal(){ return this.activity.isPersonal(); } diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java index 1c3fd0e..b133c47 100644 --- a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java @@ -39,8 +39,4 @@ public interface StudentRepository extends JpaRepository { "where s.id = :id and a.requestStatus = 1") Optional findStudentWithMActivities(Long id); -// @Query("select a from Student a " + -// "left join fetch a.participants as p " + -// "left join fetch p.activity as q ") -// Optional findParticipatedStudent(); } diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepositoryCustom.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepositoryCustom.java new file mode 100644 index 0000000..da6535e --- /dev/null +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepositoryCustom.java @@ -0,0 +1,49 @@ +package com.server.hispath.student.domain.repository; + +import java.util.Objects; +import java.util.Optional; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.server.hispath.student.domain.QStudent; +import com.server.hispath.student.domain.Student; + +import org.springframework.stereotype.Repository; + +import lombok.RequiredArgsConstructor; + +import static com.server.hispath.activity.domain.QActivity.activity; +import static com.server.hispath.student.domain.QParticipant.participant; +import static com.server.hispath.student.domain.QStudent.student; + +@Repository +@RequiredArgsConstructor +public class StudentRepositoryCustom { + private final JPAQueryFactory queryFactory; + + + public Optional findStudentWithIdAndSemester(Long id, String semester, boolean isMileage) { + Student student = queryFactory.select(QStudent.student) + .from(QStudent.student) + .leftJoin(QStudent.student.participants, participant).fetchJoin() + .leftJoin(participant.activity, activity).fetchJoin() + .leftJoin(activity.category).fetchJoin() + .where(studentSearchCondition(id, semester, isMileage)) + .fetchOne(); + return Optional.ofNullable(student); + } + + + public BooleanBuilder studentSearchCondition(Long studentId, String semester, boolean isMileage) { + BooleanBuilder booleanBuilder = new BooleanBuilder(); + + booleanBuilder.and(student.id.eq(studentId)); + if (!Objects.isNull(semester)) { + booleanBuilder.and(activity.semester.eq(semester)); + } + if (isMileage) { + booleanBuilder.and(activity.requestStatus.eq(1)); + } + return booleanBuilder; + } +} diff --git a/src/main/java/com/server/hispath/student/presentation/StudentController.java b/src/main/java/com/server/hispath/student/presentation/StudentController.java index cfacede..a40c268 100644 --- a/src/main/java/com/server/hispath/student/presentation/StudentController.java +++ b/src/main/java/com/server/hispath/student/presentation/StudentController.java @@ -5,6 +5,7 @@ import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.presentation.response.ActivityParticipantStatusResponse; +import com.server.hispath.activity.presentation.response.SemesterResponse; import com.server.hispath.docs.ApiDoc; import com.server.hispath.notice.application.NoticeService; import com.server.hispath.notice.application.dto.DashboardNoticeDto; @@ -98,4 +99,16 @@ public ResponseEntity> findStudentActivi .collect(Collectors.toList()); return ResponseEntity.ok(responses); } + + @GetMapping("/student/semesters") + @ApiOperation(value = ApiDoc.STUDENT_SEMESTER) + public ResponseEntity> getStudentSemeters() { + // Todo @Login 을 통해 API 를 호출 할 수 있도록 하기 + // Todo 현재는 그냥 단순 테스트를 위해 1번에 넣기 + List responses = studentService.getStudentSemesters(1L) + .stream() + .map(SemesterResponse::from) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } } From 8f98a26a11ea7b0b4c6629c37c35984493bba2ea Mon Sep 17 00:00:00 2001 From: lukehongg <79990740+lukehongg@users.noreply.github.com> Date: Sun, 13 Nov 2022 19:48:14 +0900 Subject: [PATCH 100/148] Feat/notice/hot fix (#98) * [Notice]:HotFix * [text] * [HotFix] --- src/main/java/com/server/hispath/docs/ApiDoc.java | 3 ++- .../hispath/notice/application/NoticeService.java | 6 ++++++ .../notice/application/dto/DashboardNoticeDto.java | 4 +++- .../notice/domain/repository/NoticeRepository.java | 8 ++++++++ .../hispath/notice/presentation/NoticeController.java | 11 ++++++++++- .../response/NoticeDashboardResponse.java | 4 +++- 6 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 60cb178..56f8e31 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -53,6 +53,7 @@ public class ApiDoc { public static final String NOTICE_CREATE = "공지 생성"; public static final String NOTICE_READ_ALL = "전체 공지 조회"; + public static final String NOTICE_READ_IMP = "강제 공지 조회"; public static final String NOTICE_READ = "단일 공지 조회"; public static final String NOTICE_DELETE = "공지 삭제"; public static final String NOTICE_UPDATE = "공지 수정"; @@ -98,6 +99,6 @@ public class ApiDoc { public static final String SCHOLARSHIP_ACTIVITIES = "장학금 수혜자 정보와 그 활동들 조회"; public static final String APPROVE_SCHOLARSHIPS = "현학기 장학금 승인 명단 엑셀 업로드"; public static final String SCHOLARSHIP_SEARCH_STUDENT = "장학금 수혜 학생 필터 검색"; - public static final String InHyeok = "제발 하라는 대로 하자 dev branch에서 dev 풀 받고, 다시 너의 브렌치로 이동해서 git merge dev 후 git push origin 너브랜체 그리고 pull request 만들기 pull request로 dev 에 스쿼시 머지 이후 로컬에서는 다시 dev로 이동 git pull origin dev 이런다음에 새로운 기능을 개발하려면 git checkout -b 인혁브렌치"; + } diff --git a/src/main/java/com/server/hispath/notice/application/NoticeService.java b/src/main/java/com/server/hispath/notice/application/NoticeService.java index 8bf304f..5d9754e 100644 --- a/src/main/java/com/server/hispath/notice/application/NoticeService.java +++ b/src/main/java/com/server/hispath/notice/application/NoticeService.java @@ -45,6 +45,12 @@ public List findAll() { List notices = noticeRepository.findAll(); return notices.stream().map(NoticeDto::from).collect(Collectors.toList()); } + @Transactional(readOnly = true) + public List findImp() { + LocalDate today = LocalDate.now(); + List notices = noticeRepository.findAllImpInPub(today); + return notices.stream().map(DashboardNoticeDto::of).collect(Collectors.toList()); + } @Transactional public NoticeDto find(Long id) { diff --git a/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java b/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java index 7f7fb86..1934e80 100644 --- a/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java +++ b/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java @@ -15,8 +15,10 @@ public class DashboardNoticeDto { private Long id; private String title; private LocalDate pubDate; + private LocalDate expDate; + private LocalDate regDate; public static DashboardNoticeDto of(Notice notice) { - return new DashboardNoticeDto(notice.getId(), notice.getTitle(), notice.getPubDate()); + return new DashboardNoticeDto(notice.getId(), notice.getTitle(), notice.getPubDate(), notice.getExpDate(), notice.getCreatedAt().toLocalDate()); } } diff --git a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java index 87a7b04..74395a8 100644 --- a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java +++ b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java @@ -1,5 +1,6 @@ package com.server.hispath.notice.domain.repository; +import com.server.hispath.activity.domain.Activity; import com.server.hispath.notice.domain.Notice; import org.springframework.data.jpa.repository.JpaRepository; @@ -15,4 +16,11 @@ @Repository public interface NoticeRepository extends JpaRepository { List findTop6ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate pubDate, LocalDate expDate); + + @Query("select n from Notice n " + + "where n.importance = true " + + "and n.pubDate <= :today " + + "and n.expDate >= :today") + List findAllImpInPub(LocalDate today); + } diff --git a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java index aa4b18e..3131718 100644 --- a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java +++ b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java @@ -1,12 +1,14 @@ package com.server.hispath.notice.presentation; import com.server.hispath.docs.ApiDoc; +import com.server.hispath.notice.application.dto.DashboardNoticeDto; import com.server.hispath.notice.application.dto.NoticeContentDto; import com.server.hispath.notice.application.dto.NoticeDto; import com.server.hispath.notice.application.NoticeService; import com.server.hispath.notice.domain.Notice; import com.server.hispath.notice.presentation.request.NoticeRequest; +import com.server.hispath.notice.presentation.response.NoticeDashboardResponse; import com.server.hispath.notice.presentation.response.NoticeResponse; import io.swagger.annotations.ApiOperation; import org.springframework.http.ResponseEntity; @@ -42,6 +44,14 @@ public ResponseEntity> findAll() { return ResponseEntity.ok(responses); } + @CrossOrigin(origins = "http://localhost:3000") + @GetMapping("/notice/imp") + @ApiOperation(value = ApiDoc.NOTICE_READ_IMP) + public ResponseEntity> findImp() { + List responses = noticeService.findImp().stream().sorted(Comparator.comparing(DashboardNoticeDto::getPubDate).reversed()).map(NoticeDashboardResponse::of).collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } + @CrossOrigin(origins = "http://localhost:3000") @GetMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_READ) @@ -52,7 +62,6 @@ public ResponseEntity find(@PathVariable Long id){ } - @CrossOrigin(origins = "http://localhost:3000") @PatchMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_UPDATE) diff --git a/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java b/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java index 90062b4..0c06b5c 100644 --- a/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java +++ b/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java @@ -15,8 +15,10 @@ public class NoticeDashboardResponse { private Long noticeId; private String title; private LocalDate pubDate; + private LocalDate expDate; + private LocalDate regDate; static public NoticeDashboardResponse of(DashboardNoticeDto dto) { - return new NoticeDashboardResponse(dto.getId(), dto.getTitle(), dto.getPubDate()); + return new NoticeDashboardResponse(dto.getId(), dto.getTitle(), dto.getPubDate(), dto.getExpDate(), dto.getRegDate()); } } From 1ce7c25db480951a0124252f1fa0e6ee10a6eb48 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sun, 13 Nov 2022 21:46:02 +0900 Subject: [PATCH 101/148] =?UTF-8?q?[#97]=20:=20=EB=A7=88=EC=9D=BC=EB=A6=AC?= =?UTF-8?q?=EC=A7=80=20=ED=99=9C=EB=8F=99=20=EC=B0=A8=ED=8A=B8=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20API=20=EA=B5=AC=ED=98=84=20(#99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix[#97] : mileage 활동만 통계에 가져오도록 API 수정 * feat[#97] : 내 활동과 평균활동의 분포도를 보여주는 API 경로 변경 * feat[#97] : milage popularity chart API 구현 * feat[#97] : chart rank api 구현 * feat[#97] : Chart Timeline API 구현 --- .../activity/application/ActivityService.java | 23 +++++++- .../application/dto/ChartCategoryDto.java | 31 ++++++++++ .../application/dto/ChartRankDto.java | 16 ++++++ .../dto/ChartSearchRequestDto.java | 1 - .../application/dto/ChartTimelineDto.java | 19 +++++++ .../domain/repository/ActivityRepository.java | 5 ++ .../repository/ActivityRepositoryCustom.java | 37 ++++++++---- .../presentation/ChartController.java | 57 +++++++++++++++++-- .../response/chart/ChartCategoryResponse.java | 23 ++++++++ .../response/chart/ChartRankResponse.java | 10 +++- .../response/chart/ChartTimelineResponse.java | 19 +++++++ .../java/com/server/hispath/docs/ApiDoc.java | 5 +- .../application/ScholarshipService.java | 26 +++++++++ .../ScholarshipRepositoryCustom.java | 28 +++++++++ .../domain/repository/StudentRepository.java | 4 ++ 15 files changed, 283 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/server/hispath/activity/application/dto/ChartCategoryDto.java create mode 100644 src/main/java/com/server/hispath/activity/application/dto/ChartRankDto.java create mode 100644 src/main/java/com/server/hispath/activity/application/dto/ChartTimelineDto.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/chart/ChartCategoryResponse.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/chart/ChartTimelineResponse.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index 2c3d347..4bbea79 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -177,8 +177,8 @@ public void reject(Long activityId) { @Transactional(readOnly = true) public List getChartDatasByCategory(Long studentId, ChartSearchRequestDto dto) { Student student = studentRepository.findById(studentId).orElseThrow(StudentNotFoundException::new); - List studentCnts = activityRepositoryCustom.getStudentCategoryChartCnt(student, dto); - List totalCnts = activityRepositoryCustom.getTotalCategoryChartCnt(dto); + List studentCnts = activityRepositoryCustom.getStudentCategoryParticipateCnt(student, dto); + List totalCnts = activityRepositoryCustom.getTotalCategoryParticipateCnt(dto); int totalStudentCnt = activityRepositoryCustom.getTotalStudentCntByChartSearchRequest(dto); return totalCnts.stream() @@ -193,6 +193,25 @@ public List getChartDatasByCategory(Long studentId, ChartSearchReq } + @Transactional(readOnly = true) + public List getChartTotalDatasByCategory(Long studentId, ChartSearchRequestDto dto) { + List chartDataDtos = this.getChartDatasByCategory(studentId, dto); + + List activityCntDtos = activityRepositoryCustom.getActivityCntByCategoryAndSemester(dto); + + return chartDataDtos.stream() + .map(chartDataDto -> + activityCntDtos.stream() + .filter(activityCntDto -> activityCntDto.isSameCategory(chartDataDto.getCategory())) + .findFirst() + .map(activityCntDto -> new ChartCategoryDto(chartDataDto, activityCntDto.getCnt())) + .orElseThrow(ActivityNotFoundException::new)) + .filter(ChartCategoryDto::isNotETC) + .collect(Collectors.toList()); + + } + + private Student findStudentWholeByIdAndSemester(Long studentId, String semester, boolean isMileage) { return studentRepositoryCustom.findStudentWithIdAndSemester(studentId, semester, isMileage) .orElseThrow(StudentNotFoundException::new); diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartCategoryDto.java b/src/main/java/com/server/hispath/activity/application/dto/ChartCategoryDto.java new file mode 100644 index 0000000..9467008 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ChartCategoryDto.java @@ -0,0 +1,31 @@ +package com.server.hispath.activity.application.dto; + +import java.util.Objects; + +import com.server.hispath.category.application.dto.CategoryDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ChartCategoryDto { + private CategoryDto category; + private Long myCnt; + private Double averageCnt; + private Long totalCnt; + + + public ChartCategoryDto(ChartDataDto dto, Long totalActivityCnt) { + this.category = dto.getCategory(); + this.myCnt = dto.getMyCnt(); + this.averageCnt = dto.getAverageCnt(); + this.totalCnt = totalActivityCnt; + } + + public boolean isNotETC(){ + return !Objects.equals(category.getName(), "기타"); + } +} diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartRankDto.java b/src/main/java/com/server/hispath/activity/application/dto/ChartRankDto.java new file mode 100644 index 0000000..07f6e23 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ChartRankDto.java @@ -0,0 +1,16 @@ +package com.server.hispath.activity.application.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ChartRankDto { + + private int myTotalWeight; + private double avgTotalWeight; + private int maxTotalWeight; + +} diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartSearchRequestDto.java b/src/main/java/com/server/hispath/activity/application/dto/ChartSearchRequestDto.java index 2ae7340..73340d6 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ChartSearchRequestDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ChartSearchRequestDto.java @@ -14,5 +14,4 @@ public class ChartSearchRequestDto { private String semester; private Integer grade; private String department; - private String major; } diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartTimelineDto.java b/src/main/java/com/server/hispath/activity/application/dto/ChartTimelineDto.java new file mode 100644 index 0000000..15e72f3 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ChartTimelineDto.java @@ -0,0 +1,19 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.scholarship.domain.Scholarship; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ChartTimelineDto { + private String semester; + private int totalWeight; + + public static ChartTimelineDto of(Scholarship scholarship){ + return new ChartTimelineDto(scholarship.getSemester(), scholarship.getTotalMileage()); + } +} diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java index 766bf08..5b2e6f6 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepository.java @@ -11,6 +11,7 @@ public interface ActivityRepository extends JpaRepository { List findAllBySemester(String semester); + // commit 테스트용 @Query("select a from Activity a " + "left join fetch a.participants as p " + @@ -43,4 +44,8 @@ public interface ActivityRepository extends JpaRepository { "left join fetch p.student " + "where a.requestStatus = 1") List findParticipatedActivity(); + + @Query("select sum(a.weight) from Activity a " + + "where a.semester = :semester") + int sumActivityWeight(String semester); } diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java index 752b4fd..0e99a41 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java @@ -25,7 +25,7 @@ public class ActivityRepositoryCustom { private final JPAQueryFactory queryFactory; - public List getStudentCategoryChartCnt(Student student, ChartSearchRequestDto dto) { + public List getStudentCategoryParticipateCnt(Student student, ChartSearchRequestDto dto) { return queryFactory.select(new QChartCategoryCntDto(category.id, category.name, activity.count())) .from(activity) .leftJoin(activity.participants, participant) @@ -36,7 +36,7 @@ public List getStudentCategoryChartCnt(Student student, Cha } - public List getTotalCategoryChartCnt(ChartSearchRequestDto dto) { + public List getTotalCategoryParticipateCnt(ChartSearchRequestDto dto) { return queryFactory.select(new QChartCategoryCntDto(category.id, category.name, activity.participants.size() .count())) .from(activity) @@ -48,6 +48,15 @@ public List getTotalCategoryChartCnt(ChartSearchRequestDto .fetch(); } + public List getActivityCntByCategoryAndSemester(ChartSearchRequestDto dto) { + return queryFactory.select(new QChartCategoryCntDto(category.id, category.name ,activity.count()) ) + .from(activity) + .leftJoin(activity.category, category) + .where(semesterCondition(new BooleanBuilder(), dto)) + .groupBy(category) + .fetch(); + } + public int getTotalStudentCntByChartSearchRequest(ChartSearchRequestDto dto) { return queryFactory.selectDistinct(participant.student.id) .from(activity) @@ -60,33 +69,41 @@ public BooleanBuilder studentChartCategoryCondition(Student student, ChartSearch BooleanBuilder booleanBuilder = new BooleanBuilder(); booleanBuilder.and(participant.student.eq(student)); - booleanBuilder = semesterDepartmentMajorCondition(booleanBuilder, dto); - + booleanBuilder = semesterCondition(booleanBuilder, dto); + booleanBuilder = mileageActivityCondition(booleanBuilder); return booleanBuilder; } public BooleanBuilder totalChartCategoryCondition(ChartSearchRequestDto dto) { BooleanBuilder booleanBuilder = new BooleanBuilder(); - booleanBuilder = semesterDepartmentMajorCondition(booleanBuilder, dto); + booleanBuilder = semesterCondition(booleanBuilder, dto); + booleanBuilder = departmentCondition(booleanBuilder, dto); + booleanBuilder = mileageActivityCondition(booleanBuilder); if (!Objects.isNull(dto.getGrade())) { int grade = (dto.getGrade() + 1) / 2 * 2; booleanBuilder.and(participant.student.semester.eq(grade - 1).or(participant.student.semester.eq(grade))); } - if (!Objects.isNull(dto.getMajor())) { - booleanBuilder.and(participant.student.major1.name.eq(dto.getMajor())); - } return booleanBuilder; } - - public BooleanBuilder semesterDepartmentMajorCondition(BooleanBuilder booleanBuilder, ChartSearchRequestDto dto) { + public BooleanBuilder semesterCondition(BooleanBuilder booleanBuilder, ChartSearchRequestDto dto) { if (!Objects.isNull(dto.getSemester())) { booleanBuilder.and(activity.semester.eq(dto.getSemester())); } + return booleanBuilder; + } + + public BooleanBuilder departmentCondition(BooleanBuilder booleanBuilder, ChartSearchRequestDto dto) { + if (!Objects.isNull(dto.getDepartment())) { booleanBuilder.and(participant.student.department.name.eq(dto.getDepartment())); } + return booleanBuilder; } + public BooleanBuilder mileageActivityCondition(BooleanBuilder booleanBuilder) { + booleanBuilder.and(activity.requestStatus.eq(1)); + return booleanBuilder; + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/ChartController.java b/src/main/java/com/server/hispath/activity/presentation/ChartController.java index 2be3a3e..33769ff 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ChartController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ChartController.java @@ -4,9 +4,14 @@ import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.application.dto.ChartRankDto; import com.server.hispath.activity.application.dto.ChartSearchRequestDto; +import com.server.hispath.activity.presentation.response.chart.ChartCategoryResponse; import com.server.hispath.activity.presentation.response.chart.ChartDataResponse; +import com.server.hispath.activity.presentation.response.chart.ChartRankResponse; +import com.server.hispath.activity.presentation.response.chart.ChartTimelineResponse; import com.server.hispath.docs.ApiDoc; +import com.server.hispath.scholarship.application.ScholarshipService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -22,17 +27,18 @@ @RequiredArgsConstructor @RequestMapping("/api") public class ChartController { + private final ActivityService activityService; + private final ScholarshipService scholarshipService; - @GetMapping("/chart/category") - @ApiOperation(value = ApiDoc.CHART_STUDENT_CATEGORY) - public ResponseEntity> getChartDatasByCategory( + @GetMapping("/chart/mileage") + @ApiOperation(value = ApiDoc.CHART_MILEAGE_CATEGORY) + public ResponseEntity> getChartMileageData( String semester, @RequestParam(required = false) Integer grade, - @RequestParam(required = false) String department, - @RequestParam(required = false) String major + @RequestParam(required = false) String department ) { - ChartSearchRequestDto chartSearchRequestDto = new ChartSearchRequestDto(semester, grade, department, major); + ChartSearchRequestDto chartSearchRequestDto = new ChartSearchRequestDto(semester, grade, department); // ToDo 지금은 1L로 하지만 나중에 바꿀 예정 List responses = activityService.getChartDatasByCategory(1L, chartSearchRequestDto) .stream() @@ -40,4 +46,43 @@ public ResponseEntity> getChartDatasByCategory( .collect(Collectors.toList()); return ResponseEntity.ok(responses); } + + @GetMapping("/chart/popularity") + @ApiOperation(value = ApiDoc.CHART_MILEAGE_POPULARITY_CATEGORY) + public ResponseEntity> getChartMileagePopularity( + String semester, + @RequestParam(required = false) Integer grade, + @RequestParam(required = false) String department + ) { + ChartSearchRequestDto chartSearchRequestDto = new ChartSearchRequestDto(semester, grade, department); + // ToDo 지금은 1L로 하지만 나중에 바꿀 예정 + List responses = activityService.getChartTotalDatasByCategory(1L, chartSearchRequestDto) + .stream() + .map(ChartCategoryResponse::of) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } + + @GetMapping("/chart/rank") + @ApiOperation(value = ApiDoc.CHART_MILEAGE_RANK) + public ResponseEntity getChartMileageRank( + String semester, + @RequestParam(required = false) Integer grade, + @RequestParam(required = false) String department + ) { + ChartSearchRequestDto chartSearchRequestDto = new ChartSearchRequestDto(semester, grade, department); + // ToDo 지금은 1L로 하지만 나중에 바꿀 예정 + return ResponseEntity.ok(ChartRankResponse.of(scholarshipService.getRankChartData(1L, chartSearchRequestDto))); + } + + @GetMapping("/chart/timeline") + @ApiOperation(value = ApiDoc.CHART_MILEAGE_TIMELINE) + public ResponseEntity> getChartMileageTimeline() { + // ToDo 지금은 1L로 하지만 나중에 바꿀 예정 + List responses = scholarshipService.getChartTimelines(1L) + .stream() + .map(ChartTimelineResponse::of) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartCategoryResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartCategoryResponse.java new file mode 100644 index 0000000..b8b07b0 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartCategoryResponse.java @@ -0,0 +1,23 @@ +package com.server.hispath.activity.presentation.response.chart; + +import com.server.hispath.activity.application.dto.ChartCategoryDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ChartCategoryResponse { + private Long categoryId; + private String categoryName; + private Long myCnt; + private Double averageCnt; + private Long totalCategoryCnt; + + public static ChartCategoryResponse of(ChartCategoryDto dto) { + return new ChartCategoryResponse(dto.getCategory().getId(), dto.getCategory().getName(), + dto.getMyCnt(), dto.getAverageCnt(), dto.getTotalCnt()); + } +} diff --git a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartRankResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartRankResponse.java index c9a16c7..24e9f44 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartRankResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartRankResponse.java @@ -1,5 +1,7 @@ package com.server.hispath.activity.presentation.response.chart; +import com.server.hispath.activity.application.dto.ChartRankDto; + import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -8,5 +10,11 @@ @NoArgsConstructor @AllArgsConstructor public class ChartRankResponse { - private Float rank; + private int myTotalWeight; + private double avgTotalWeight; + private int maxTotalWeight; + + public static ChartRankResponse of(ChartRankDto dto){ + return new ChartRankResponse(dto.getMyTotalWeight(), dto.getAvgTotalWeight(), dto.getMaxTotalWeight()); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartTimelineResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartTimelineResponse.java new file mode 100644 index 0000000..8c97788 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartTimelineResponse.java @@ -0,0 +1,19 @@ +package com.server.hispath.activity.presentation.response.chart; + +import com.server.hispath.activity.application.dto.ChartTimelineDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ChartTimelineResponse { + private String semester; + private int totalWeight; + + public static ChartTimelineResponse of(ChartTimelineDto dto) { + return new ChartTimelineResponse(dto.getSemester(), dto.getTotalWeight()); + } +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 56f8e31..1fd408a 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -35,7 +35,10 @@ public class ApiDoc { public static final String ACTIVITY_STUDENT_DETAIL = "학생 개인 활동 상세 조회"; /* Chart 관련 API 명세 */ - public static final String CHART_STUDENT_CATEGORY = "카테고리에 따른 학생 활동 차트 데이터 조회"; + public static final String CHART_MILEAGE_CATEGORY = "카테고리에 따른 학생 마일리지 활동 차트 데이터 조회"; + public static final String CHART_MILEAGE_POPULARITY_CATEGORY = "카테고리에 따른 전체 활동 갯수와 나의 참여수, 평균 참여수 조회"; + public static final String CHART_MILEAGE_RANK = "내 마일리지 총점이 어느정도 위치하는지 조회"; + public static final String CHART_MILEAGE_TIMELINE = "마일리지 활동 Timeline 조회"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index c2e3a70..1370210 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -1,10 +1,14 @@ package com.server.hispath.scholarship.application; +import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import com.server.hispath.activity.application.dto.ChartRankDto; +import com.server.hispath.activity.application.dto.ChartSearchRequestDto; +import com.server.hispath.activity.application.dto.ChartTimelineDto; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.exception.scholarship.ScholarshipDuplicateException; @@ -150,4 +154,26 @@ public List searchScholarshipStudent(SearchRequestDto dto) { .map(ScholarshipDto::of) .collect(Collectors.toList()); } + + @Transactional(readOnly = true) + public ChartRankDto getRankChartData(Long studentId, ChartSearchRequestDto dto) { + Student student = studentService.findById(studentId); + int myWeight = scholarshipRepository.findFirstByStudentAndSemester(student, dto.getSemester()) + .orElseThrow(ScholarshipNotFoundException::new) + .getTotalMileage(); + Double avgWeight = scholarshipRepositoryCustom.getTotalMileageAvg(dto); + int maxWeight = activityRepository.sumActivityWeight(dto.getSemester()); + return new ChartRankDto(myWeight, avgWeight, maxWeight); + } + + @Transactional(readOnly = true) + public List getChartTimelines(Long studentId) { + return studentRepository.findStudentWithScholarships(studentId) + .orElseThrow(StudentNotFoundException::new) + .getScholarships() + .stream() + .map(ChartTimelineDto::of) + .sorted(Comparator.comparing(ChartTimelineDto::getSemester)) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java index 37befa5..47bc84f 100644 --- a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java +++ b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java @@ -7,6 +7,7 @@ import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; +import com.server.hispath.activity.application.dto.ChartSearchRequestDto; import com.server.hispath.scholarship.application.dto.SearchRequestDto; import com.server.hispath.scholarship.domain.Scholarship; @@ -14,7 +15,9 @@ import lombok.RequiredArgsConstructor; +import static com.server.hispath.activity.domain.QActivity.activity; import static com.server.hispath.scholarship.domain.QScholarship.scholarship; +import static com.server.hispath.student.domain.QParticipant.participant; @Repository @RequiredArgsConstructor @@ -34,6 +37,31 @@ public List searchScholarshipStudent(SearchRequestDto dto) { } + public Double getTotalMileageAvg(ChartSearchRequestDto dto) { + return queryFactory.select(scholarship.totalMileage.avg()) + .from(scholarship) + .where(totalMileageAvgCondition(dto)) + .fetchOne(); + } + + public BooleanBuilder totalMileageAvgCondition(ChartSearchRequestDto dto) { + BooleanBuilder booleanBuilder = new BooleanBuilder(); + + if (!Objects.isNull(dto.getSemester())) { + booleanBuilder.and(scholarship.semester.eq(dto.getSemester())); + } + if (!Objects.isNull(dto.getDepartment())) { + booleanBuilder.and(scholarship.sDepartment.name.eq(dto.getDepartment())); + } + + if (!Objects.isNull(dto.getGrade())) { + int grade = (dto.getGrade() + 1) / 2 * 2; + booleanBuilder.and(scholarship.studentSemester.eq(grade - 1).or(scholarship.studentSemester.eq(grade))); + } + + return booleanBuilder; + } + public BooleanBuilder scholarshipStudentCondition(SearchRequestDto dto) { BooleanBuilder booleanBuilder = new BooleanBuilder(); diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java index b133c47..ce3e455 100644 --- a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java @@ -39,4 +39,8 @@ public interface StudentRepository extends JpaRepository { "where s.id = :id and a.requestStatus = 1") Optional findStudentWithMActivities(Long id); + @Query("select s from Student s " + + "left join fetch s.scholarships " + + "where s.id = :id") + Optional findStudentWithScholarships(Long id); } From d4cdce9975030e2ca3195473b0bb030577e092c0 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sun, 13 Nov 2022 22:46:50 +0900 Subject: [PATCH 102/148] =?UTF-8?q?[#100]=20:=20=EC=9E=A5=ED=95=99?= =?UTF-8?q?=EA=B8=88=20=EC=88=98=ED=98=9C=20=EA=B4=80=EB=A0=A8=20=EC=B0=A8?= =?UTF-8?q?=ED=8A=B8=20API=20=EA=B5=AC=ED=98=84=20(#101)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix[#100] : 승인된 Scholarship만 조회할 수 있도록 변경 * feat[#100] : Scholarship weight 분포 API 구현 * feat[#100] : 차트 학년 별 분포 조회 API 구현 * feat[#100] : 학부별 학생 수혜 분포 차트 API 구현 --- .../dto/ChartDepartmentDataDto.java | 21 +++++++++ .../application/dto/ChartGradeDataDto.java | 21 +++++++++ .../presentation/ChartController.java | 32 +++++++++++-- .../chart/ChartDepartmentResponse.java | 20 ++++++++ .../response/chart/ChartGradeResponse.java | 19 ++++++++ .../java/com/server/hispath/docs/ApiDoc.java | 10 ++-- .../application/ScholarshipService.java | 46 +++++++++++++++---- .../repository/ScholarshipRepository.java | 2 + .../ScholarshipRepositoryCustom.java | 18 +++++++- .../domain/repository/StudentRepository.java | 2 +- 10 files changed, 173 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/server/hispath/activity/application/dto/ChartDepartmentDataDto.java create mode 100644 src/main/java/com/server/hispath/activity/application/dto/ChartGradeDataDto.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDepartmentResponse.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/chart/ChartGradeResponse.java diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartDepartmentDataDto.java b/src/main/java/com/server/hispath/activity/application/dto/ChartDepartmentDataDto.java new file mode 100644 index 0000000..f5cd9eb --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ChartDepartmentDataDto.java @@ -0,0 +1,21 @@ +package com.server.hispath.activity.application.dto; + + +import com.querydsl.core.annotations.QueryProjection; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class ChartDepartmentDataDto { + + private String department; + private Long cnt; + + @QueryProjection + public ChartDepartmentDataDto(String department, Long cnt) { + this.department = department; + this.cnt = cnt; + } +} diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartGradeDataDto.java b/src/main/java/com/server/hispath/activity/application/dto/ChartGradeDataDto.java new file mode 100644 index 0000000..e0d03f8 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ChartGradeDataDto.java @@ -0,0 +1,21 @@ +package com.server.hispath.activity.application.dto; + + +import com.querydsl.core.annotations.QueryProjection; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class ChartGradeDataDto { + + private int grade; + private Long cnt; + + @QueryProjection + public ChartGradeDataDto(int grade, Long cnt) { + this.grade = grade; + this.cnt = cnt; + } +} diff --git a/src/main/java/com/server/hispath/activity/presentation/ChartController.java b/src/main/java/com/server/hispath/activity/presentation/ChartController.java index 33769ff..d42cbe1 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ChartController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ChartController.java @@ -4,12 +4,8 @@ import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; -import com.server.hispath.activity.application.dto.ChartRankDto; import com.server.hispath.activity.application.dto.ChartSearchRequestDto; -import com.server.hispath.activity.presentation.response.chart.ChartCategoryResponse; -import com.server.hispath.activity.presentation.response.chart.ChartDataResponse; -import com.server.hispath.activity.presentation.response.chart.ChartRankResponse; -import com.server.hispath.activity.presentation.response.chart.ChartTimelineResponse; +import com.server.hispath.activity.presentation.response.chart.*; import com.server.hispath.docs.ApiDoc; import com.server.hispath.scholarship.application.ScholarshipService; @@ -85,4 +81,30 @@ public ResponseEntity> getChartMileageTimeline() { .collect(Collectors.toList()); return ResponseEntity.ok(responses); } + + @GetMapping("/chart/weight") + @ApiOperation(value = ApiDoc.CHART_SCHOLARSHIP_WEIGHT) + public ResponseEntity> getChartWeightDistribution(@RequestParam String semester) { + return ResponseEntity.ok(scholarshipService.getChartWeightDistribution(semester)); + } + + @GetMapping("/chart/grade") + @ApiOperation(value = ApiDoc.CHART_SCHOLARSHIP_GRADE) + public ResponseEntity> getChartGradeDistribution(@RequestParam String semester) { + List responses = scholarshipService.getChartGradeDistribution(semester) + .stream() + .map(ChartGradeResponse::of) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } + + @GetMapping("/chart/department") + @ApiOperation(value = ApiDoc.CHART_SCHOLARSHIP_DEPARTMENT) + public ResponseEntity> getChartDepartmentDistribution(@RequestParam String semester) { + List responses = scholarshipService.getChartDepartmentDistribution(semester) + .stream() + .map(ChartDepartmentResponse::of) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDepartmentResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDepartmentResponse.java new file mode 100644 index 0000000..397bfcd --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDepartmentResponse.java @@ -0,0 +1,20 @@ +package com.server.hispath.activity.presentation.response.chart; + +import com.server.hispath.activity.application.dto.ChartDataDto; +import com.server.hispath.activity.application.dto.ChartDepartmentDataDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ChartDepartmentResponse { + private String department; + private Long cnt; + + public static ChartDepartmentResponse of(ChartDepartmentDataDto dto) { + return new ChartDepartmentResponse(dto.getDepartment(), dto.getCnt()); + } +} diff --git a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartGradeResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartGradeResponse.java new file mode 100644 index 0000000..60da603 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartGradeResponse.java @@ -0,0 +1,19 @@ +package com.server.hispath.activity.presentation.response.chart; + +import com.server.hispath.activity.application.dto.ChartGradeDataDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ChartGradeResponse { + private int grade; + private Long cnt; + + public static ChartGradeResponse of(ChartGradeDataDto dto) { + return new ChartGradeResponse(dto.getGrade(), dto.getCnt()); + } +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 1fd408a..63ac1c7 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -36,9 +36,13 @@ public class ApiDoc { /* Chart 관련 API 명세 */ public static final String CHART_MILEAGE_CATEGORY = "카테고리에 따른 학생 마일리지 활동 차트 데이터 조회"; - public static final String CHART_MILEAGE_POPULARITY_CATEGORY = "카테고리에 따른 전체 활동 갯수와 나의 참여수, 평균 참여수 조회"; - public static final String CHART_MILEAGE_RANK = "내 마일리지 총점이 어느정도 위치하는지 조회"; - public static final String CHART_MILEAGE_TIMELINE = "마일리지 활동 Timeline 조회"; + public static final String CHART_MILEAGE_POPULARITY_CATEGORY = "카테고리에 따른 전체 활동 갯수와 나의 참여수, 평균 참여수 차트 데이터 조회"; + public static final String CHART_MILEAGE_RANK = "내 마일리지 총점이 어느정도 위치하는지 차트 데이터 조회"; + public static final String CHART_MILEAGE_TIMELINE = "마일리지 활동 Timeline 차트 데이터 조회"; + public static final String CHART_SCHOLARSHIP_WEIGHT = "학생의 전체 가중치 분포 차트 데이터 조회"; + public static final String CHART_ACTIVITY_CATEGORY = "카테고리 별 활동 갯수 분포 차트 데이터 조회"; + public static final String CHART_SCHOLARSHIP_GRADE = "학년 별 마일리지 수혜 학생 분포 차트 데이터 조회"; + public static final String CHART_SCHOLARSHIP_DEPARTMENT = "학부 별 마일리지 수혜 학생 분포 차트 데이터 조회"; /* Category 관련 API 명세 */ public static final String CATEGORY_READ = "단일 카테고리 조회"; diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index 1370210..a18b53b 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -1,14 +1,9 @@ package com.server.hispath.scholarship.application; -import java.util.Comparator; -import java.util.List; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; -import com.server.hispath.activity.application.dto.ChartRankDto; -import com.server.hispath.activity.application.dto.ChartSearchRequestDto; -import com.server.hispath.activity.application.dto.ChartTimelineDto; +import com.server.hispath.activity.application.dto.*; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.exception.scholarship.ScholarshipDuplicateException; @@ -159,7 +154,7 @@ public List searchScholarshipStudent(SearchRequestDto dto) { public ChartRankDto getRankChartData(Long studentId, ChartSearchRequestDto dto) { Student student = studentService.findById(studentId); int myWeight = scholarshipRepository.findFirstByStudentAndSemester(student, dto.getSemester()) - .orElseThrow(ScholarshipNotFoundException::new) + .orElseGet(() -> Scholarship.builder().totalMileage(0).build()) .getTotalMileage(); Double avgWeight = scholarshipRepositoryCustom.getTotalMileageAvg(dto); int maxWeight = activityRepository.sumActivityWeight(dto.getSemester()); @@ -172,8 +167,43 @@ public List getChartTimelines(Long studentId) { .orElseThrow(StudentNotFoundException::new) .getScholarships() .stream() + .filter(Scholarship::isApproved) .map(ChartTimelineDto::of) .sorted(Comparator.comparing(ChartTimelineDto::getSemester)) .collect(Collectors.toList()); } + + @Transactional(readOnly = true) + public List getChartWeightDistribution(String semester) { + List scholarships = scholarshipRepository.findAllBySemesterAndApprovedTrue(semester); + Long[] chartWeightDistribute = new Long[6]; + scholarships.forEach(scholarship -> { + if (scholarship.getTotalMileage() < 20) + chartWeightDistribute[0]++; + else if (scholarship.getTotalMileage() < 40) + chartWeightDistribute[1]++; + else if (scholarship.getTotalMileage() < 60) + chartWeightDistribute[2]++; + else if (scholarship.getTotalMileage() < 80) + chartWeightDistribute[3]++; + else if (scholarship.getTotalMileage() < 100) + chartWeightDistribute[4]++; + else + chartWeightDistribute[5]++; + }); + + return Arrays.asList(chartWeightDistribute); + } + + @Transactional(readOnly = true) + public List getChartGradeDistribution(String semester) { + List chartGradeDataDtos = scholarshipRepositoryCustom.getCountByGradeAndSemester(semester); + chartGradeDataDtos.sort(Comparator.comparing(ChartGradeDataDto::getGrade)); + return chartGradeDataDtos; + } + + @Transactional(readOnly = true) + public List getChartDepartmentDistribution(String semester) { + return scholarshipRepositoryCustom.getCountByDepartmentAndSemester(semester); + } } diff --git a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java index 581d83e..1c227c0 100644 --- a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java +++ b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java @@ -29,5 +29,7 @@ public interface ScholarshipRepository extends JpaRepository "where s.student.id = :id " + "and s.semester = :semester ") Optional findStudentIdAndSemester(Long id, String semester); + + List findAllBySemesterAndApprovedTrue(String semester); } diff --git a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java index 47bc84f..113154b 100644 --- a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java +++ b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepositoryCustom.java @@ -7,7 +7,7 @@ import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; -import com.server.hispath.activity.application.dto.ChartSearchRequestDto; +import com.server.hispath.activity.application.dto.*; import com.server.hispath.scholarship.application.dto.SearchRequestDto; import com.server.hispath.scholarship.domain.Scholarship; @@ -44,6 +44,22 @@ public Double getTotalMileageAvg(ChartSearchRequestDto dto) { .fetchOne(); } + public List getCountByGradeAndSemester(String semester) { + return queryFactory.select(new QChartGradeDataDto(scholarship.studentSemester, scholarship.count())) + .from(scholarship) + .where(scholarship.semester.eq(semester).and(scholarship.approved.eq(true))) + .groupBy(scholarship.studentSemester) + .fetch(); + } + + public List getCountByDepartmentAndSemester(String semester) { + return queryFactory.select(new QChartDepartmentDataDto(scholarship.sDepartment.name, scholarship.count())) + .from(scholarship) + .where(scholarship.semester.eq(semester).and(scholarship.approved.eq(true))) + .groupBy(scholarship.sDepartment) + .fetch(); + } + public BooleanBuilder totalMileageAvgCondition(ChartSearchRequestDto dto) { BooleanBuilder booleanBuilder = new BooleanBuilder(); diff --git a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java index ce3e455..ba73716 100644 --- a/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java +++ b/src/main/java/com/server/hispath/student/domain/repository/StudentRepository.java @@ -41,6 +41,6 @@ public interface StudentRepository extends JpaRepository { @Query("select s from Student s " + "left join fetch s.scholarships " + - "where s.id = :id") + "where s.id = :id ") Optional findStudentWithScholarships(Long id); } From ca07904c48ca5ff1d4de57521f8575448c665a95 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Mon, 14 Nov 2022 00:38:28 +0900 Subject: [PATCH 103/148] =?UTF-8?q?feat[#102]=20:=20=ED=95=99=EC=83=9D?= =?UTF-8?q?=EC=9D=98=20=ED=99=9C=EB=8F=99=20=EC=82=AD=EC=A0=9C=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#103)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/application/ActivityService.java | 22 +++++++++++++++++-- .../presentation/ActivityController.java | 5 +++-- .../java/com/server/hispath/docs/ApiDoc.java | 2 +- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index 4bbea79..21cb890 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -68,8 +68,26 @@ public ActivityDto update(Long id, Long categoryId, ActivityContentDto dto) { } @Transactional - public void delete(Long id) { - activityRepository.deleteById(id); + public void delete(Long activityId) { + activityRepository.deleteById(activityId); + } + + @Transactional + public void deleteStudentActivity(Long studentId, Long activityId) { + Activity activity = activityRepository.findActivityWithStudents(activityId) + .orElseThrow(ActivityNotFoundException::new); + Student student = studentRepository.findById(studentId) + .orElseThrow(StudentNotFoundException::new); + if (activity.isPersonal()) { + activityRepository.deleteById(activityId); + return; + } + activity.getParticipants() + .stream() + .filter(participant -> participant.isSameStudent(student)) + .findFirst() + .orElseThrow(ParticipantNotFoundException::new) + .deleteContent(); } @Transactional(readOnly = true) diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index b9ad75d..91a6770 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -67,10 +67,11 @@ public ResponseEntity update(@PathVariable Long id, @RequestBo return ResponseEntity.ok(response); } - @DeleteMapping("/activity/{id}") + @DeleteMapping("/activity/student/{id}") @ApiOperation(value = ApiDoc.ACTIVITY_DELETE) public ResponseEntity delete(@PathVariable Long id) { - activityService.delete(id); + //Todo 나중에 login 처리하면 그때 ID바꿈 + activityService.deleteStudentActivity(1L, id); return ResponseEntity.ok(id); } diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 63ac1c7..afa362e 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -7,7 +7,7 @@ public class ApiDoc { public static final String ACTIVITY_READ = "단일 활동 조회"; public static final String ACTIVITY_READ_ALL = "모든 활동 조회"; public static final String ACTIVITY_UPDATE = "활동 수정"; - public static final String ACTIVITY_DELETE = "활동 삭제"; + public static final String ACTIVITY_DELETE = "학생 활동 삭제"; public static final String MILEAGE_CREATE = "단일 마일리지 활동 등록"; public static final String MILEAGES_CREATE = "단일 마일리지 다중 등록"; public static final String MILEAGE_UPDATE = "마일리지 활동 수정"; From 0114f5cc3835717943626e6341ef5dd98095e35f Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Mon, 14 Nov 2022 12:21:08 +0900 Subject: [PATCH 104/148] =?UTF-8?q?fix[#104]=20:=20SuperManagerLogin=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20(#105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/auth/application/AuthService.java | 18 ++++++++++-------- .../auth/presentation/LoginInterceptor.java | 13 +++++++------ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/server/hispath/auth/application/AuthService.java b/src/main/java/com/server/hispath/auth/application/AuthService.java index 5101ca0..810f0a4 100644 --- a/src/main/java/com/server/hispath/auth/application/AuthService.java +++ b/src/main/java/com/server/hispath/auth/application/AuthService.java @@ -39,9 +39,10 @@ public class AuthService { public void validateEamil(String email) { String domain = email.split("@")[1]; - if(!Objects.equals(domain, "handong.ac.kr")){ + if (!Objects.equals(domain, "handong.ac.kr")) { throw new NotHandongEmailException(); - }; + } + ; } public OauthUserInfo getUserInfo(LoginRequestDto loginRequestDto) { @@ -65,7 +66,7 @@ public LoginResponseDto managerLogin(LoginRequestDto loginRequestDto) { OauthUserInfo userInfo = getUserInfo(loginRequestDto); String email = userInfo.getEmail(); Optional manager = managerRepository.findByEmail(email); - return manager.map(value -> new LoginResponseDto(value.isApproved(), + return manager.map(value -> new LoginResponseDto(!value.isApproved(), jwtProvider.createToken(String.valueOf(value.getId()), Member.MANAGER))) .orElseGet(() -> new LoginResponseDto(true, null)); @@ -96,28 +97,29 @@ public LoginManager findManagerByToken(String token) { } - @Transactional(readOnly = true) public void checkSuperManagerByToken(String token) { Manager manager = findSuperManagerByToken(token); - if(!manager.isSuperManager()) throw new ManagerNoAuthorizationException(); + if (!manager.isSuperManager()) + throw new ManagerNoAuthorizationException(); } @Transactional(readOnly = true) - public LoginManager getSuperManagerId(String token){ + public LoginManager getSuperManagerId(String token) { Manager manager = findSuperManagerByToken(token); return new LoginManager(manager.getId()); } @Transactional(readOnly = true) - public Manager findSuperManagerByToken(String token){ + public Manager findSuperManagerByToken(String token) { if (!jwtProvider.isValidToken(token, Member.SUPER_MANAGER)) { throw new InvalidTokenException(); } String payLoad = jwtProvider.getPayLoad(token, Member.SUPER_MANAGER); Long id = Long.parseLong(payLoad); Manager manager = managerService.findById(id); - if(!manager.isSuperManager()) throw new ManagerNoAuthorizationException(); + if (!manager.isSuperManager()) + throw new ManagerNoAuthorizationException(); return manager; } } diff --git a/src/main/java/com/server/hispath/auth/presentation/LoginInterceptor.java b/src/main/java/com/server/hispath/auth/presentation/LoginInterceptor.java index bdc7d5d..ef81759 100644 --- a/src/main/java/com/server/hispath/auth/presentation/LoginInterceptor.java +++ b/src/main/java/com/server/hispath/auth/presentation/LoginInterceptor.java @@ -36,19 +36,20 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons jwtProvider.validateToken(token, Member.STUDENT); } else if (handlerMethod.hasMethodAnnotation(RequiredManagerLogin.class)) { jwtProvider.validateToken(token, Member.MANAGER); - } else if (handlerMethod.hasMethodAnnotation(RequiredLogin.class)){ + } else if (handlerMethod.hasMethodAnnotation(RequiredLogin.class)) { jwtProvider.validateBothToken(token); - } else if (handlerMethod.hasMethodAnnotation(RequiredSuperManagerLogin.class)){ + } else if (handlerMethod.hasMethodAnnotation(RequiredSuperManagerLogin.class)) { authService.checkSuperManagerByToken(token); } return true; } - private boolean hasAnnotation(HandlerMethod handlerMethod){ - return handlerMethod.hasMethodAnnotation(RequiredLogin.class) - || handlerMethod.hasMethodAnnotation(RequiredStudentLogin.class) - || handlerMethod.hasMethodAnnotation(RequiredManagerLogin.class); + private boolean hasAnnotation(HandlerMethod handlerMethod) { + return handlerMethod.hasMethodAnnotation(RequiredLogin.class) + || handlerMethod.hasMethodAnnotation(RequiredStudentLogin.class) + || handlerMethod.hasMethodAnnotation(RequiredManagerLogin.class) + || handlerMethod.hasMethodAnnotation(RequiredSuperManagerLogin.class); } private boolean isPreflight(HttpServletRequest request) { From 9540b98da1d3de05120a3908e520d6c78f7a470d Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Tue, 15 Nov 2022 12:11:19 +0900 Subject: [PATCH 105/148] =?UTF-8?q?[#106]=20:=20=EC=A0=84=EC=B2=B4=20API?= =?UTF-8?q?=20=EA=B6=8C=ED=95=9C=20=EB=B6=80=EC=97=AC=20(=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8,=20=EA=B4=80=EB=A6=AC=EC=9E=90,=20=EC=8A=88?= =?UTF-8?q?=ED=8D=BC=EA=B4=80=EB=A6=AC=EC=9E=90)=20(#107)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix[#106] : Acitivity Apply 관련 예외 처리 * feat[#106] : Activity Controller API 권한 부여 * feat[#106] : Category Controller API 권한 부여 * feat[#106] : Chart Controller API 권한 부여 * feat[#106] : department Controller api 권한 부여 * feat[#106] : Major Controller API 권한 부여 * feat[#106] : MActivity Controller 관련 API 권한 부여 * feat[#106] : Manager Controller API 권한 부여 * feat[#106] : Notice Controller API 권한 부여 * feat[#106] : Resume Controller API 권한 부여 * feat[#106] : Scholarship 관련 API 권한 부여 * feat[#106] : Student Controller API 권한 부여 * feat[#106] : API 경로 겹침 수정 --- .../activity/application/ActivityService.java | 4 +- .../hispath/activity/domain/Activity.java | 3 + .../presentation/ActivityController.java | 57 +++++++++++++------ .../presentation/ChartController.java | 41 +++++++++---- .../presentation/MActivityController.java | 48 +++++++++++----- .../presentation/CategoryController.java | 7 +++ .../presentation/DepartmentController.java | 10 ++++ .../activity/ActivityApplyException.java | 12 ++++ .../major/presentation/MajorController.java | 7 +++ .../presentation/MajorTestController.java | 39 ------------- .../presentation/ManagerController.java | 8 +++ .../notice/presentation/NoticeController.java | 8 +++ .../resume/presentation/ResumeController.java | 31 ++++++---- .../presentation/ScholarshipController.java | 22 ++++--- .../presentation/StudentController.java | 37 +++++++++--- 15 files changed, 219 insertions(+), 115 deletions(-) create mode 100644 src/main/java/com/server/hispath/exception/activity/ActivityApplyException.java delete mode 100644 src/main/java/com/server/hispath/major/presentation/MajorTestController.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index 21cb890..a72664a 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -129,8 +129,8 @@ public ActivityParticipantDto updateStudentActivity(Long activityId, Long studen } @Transactional(readOnly = true) - public List findAllParticipantActivites(Long id, String semester, String section) { - Student student = studentRepository.findStudentWithActivities(id).orElseThrow(StudentNotFoundException::new); + public List findAllParticipantActivites(Long studentId, String semester, String section) { + Student student = studentRepository.findStudentWithActivities(studentId).orElseThrow(StudentNotFoundException::new); return student.getParticipants() .stream() .filter(participant -> participant.isSameSemester(semester)) diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 440810a..890b33d 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -12,6 +12,7 @@ import com.server.hispath.activity.application.dto.StudentActivityContentDto; import com.server.hispath.category.domain.Category; import com.server.hispath.common.BaseEntity; +import com.server.hispath.exception.activity.ActivityApplyException; import com.server.hispath.exception.activity.ParticipantDuplicateException; import com.server.hispath.student.domain.Participant; import com.server.hispath.student.domain.Section; @@ -165,6 +166,8 @@ public boolean isSameCategory(String category) { } public void apply(){ + if(this.requestStatus != 3) + throw new ActivityApplyException(); this.requestStatus = 0; } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index 91a6770..967511f 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -13,6 +13,10 @@ import com.server.hispath.activity.presentation.response.ActivityParticipantResponse; import com.server.hispath.activity.presentation.response.ActivityResponse; import com.server.hispath.activity.presentation.response.SemesterResponse; +import com.server.hispath.auth.domain.LoginStudent; +import com.server.hispath.auth.domain.RequiredLogin; +import com.server.hispath.auth.domain.RequiredManagerLogin; +import com.server.hispath.auth.domain.StudentLogin; import com.server.hispath.docs.ApiDoc; import com.server.hispath.student.domain.Section; @@ -69,9 +73,9 @@ public ResponseEntity update(@PathVariable Long id, @RequestBo @DeleteMapping("/activity/student/{id}") @ApiOperation(value = ApiDoc.ACTIVITY_DELETE) - public ResponseEntity delete(@PathVariable Long id) { - //Todo 나중에 login 처리하면 그때 ID바꿈 - activityService.deleteStudentActivity(1L, id); + @RequiredLogin + public ResponseEntity delete(@PathVariable Long id, @StudentLogin LoginStudent loginStudent) { + activityService.deleteStudentActivity(loginStudent.getId(), id); return ResponseEntity.ok(id); } @@ -87,6 +91,7 @@ public ResponseEntity> findAllBySemester() { @GetMapping("/sections") @ApiOperation(value = ApiDoc.SECTION_READ_ALL) + @RequiredLogin public ResponseEntity> getSections() { List sections = Arrays.stream(Section.values()) .map(Section::getName) @@ -94,39 +99,49 @@ public ResponseEntity> getSections() { return ResponseEntity.ok(sections); } - @PostMapping("/student-activity/{id}") + @PostMapping("/student-activity") @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_CREATE) - public ResponseEntity createStudentActivity(@PathVariable Long id, @RequestBody StudentActivityCURequest request) { - Long response = activityService.createStudentActivity(id, StudentActivityContentDto.of(request), ParticipantContentDto.of(request)); + @RequiredLogin + public ResponseEntity createStudentActivity(@StudentLogin LoginStudent loginStudent, @RequestBody StudentActivityCURequest request) { + Long response = activityService.createStudentActivity(loginStudent.getId(), StudentActivityContentDto.of(request), ParticipantContentDto.of(request)); return ResponseEntity.ok(response); } @PutMapping("/student-activity/{id}") @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_UPDATE) - public ResponseEntity updateStudentActivity(@PathVariable Long id, @RequestBody StudentActivityCURequest request) { - ActivityParticipantDto activityParticipantDto = activityService.updateStudentActivity(id, 1L, StudentActivityContentDto.of(request), ParticipantContentDto.of(request)); + @RequiredLogin + public ResponseEntity updateStudentActivity(@PathVariable Long id + , @RequestBody StudentActivityCURequest request + , @StudentLogin LoginStudent loginStudent + ) { + ActivityParticipantDto activityParticipantDto = activityService.updateStudentActivity(id, loginStudent.getId(), StudentActivityContentDto.of(request), ParticipantContentDto.of(request)); return ResponseEntity.ok(ActivityParticipantResponse.of(activityParticipantDto)); } - @GetMapping("/student-activities/{id}") + @GetMapping("/student-activities") @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_READ_SEMESTER) - public ResponseEntity> findParticipatedActivities(@PathVariable Long id, @RequestParam String semester, @RequestParam String section) { - // ToDo Student ID 관련해서는 나중에 Login 처리하기 - List responses = activityService.findAllParticipantActivites(id, semester, section) + @RequiredLogin + public ResponseEntity> findParticipatedActivities( + @StudentLogin LoginStudent loginStudent, + @RequestParam String semester, + @RequestParam String section) { + List responses = activityService.findAllParticipantActivites(loginStudent.getId(), semester, section) .stream() .map(ActivityParticipantResponse::of) .collect(Collectors.toList()); return ResponseEntity.ok(responses); } - @GetMapping("/studentactivity/{id}") + @GetMapping("/studentactivity") @ApiOperation(value = ApiDoc.STUDENT_MILEAGE_READ) - public ResponseEntity findActivtyByStudentId(@PathVariable Long id) { - return ResponseEntity.ok(mActivityService.findActivitiesByStudent(id)); + @RequiredLogin + public ResponseEntity findActivtyByStudentId(@StudentLogin LoginStudent loginStudent) { + return ResponseEntity.ok(mActivityService.findActivitiesByStudent(loginStudent.getId())); } @PutMapping("/activity/apply/{id}") @ApiOperation(value = ApiDoc.ACTIVITY_APPLY) + @RequiredLogin public ResponseEntity applyActivity(@PathVariable Long id) { activityService.apply(id); return ResponseEntity.ok(null); @@ -134,6 +149,7 @@ public ResponseEntity applyActivity(@PathVariable Long id) { @PutMapping("/activity/approve/{id}") @ApiOperation(value = ApiDoc.ACTIVITY_APPROVE) + @RequiredManagerLogin public ResponseEntity approveActivity(@PathVariable Long id, @RequestBody ActivityApproveRequest request) { activityService.approve(id, request.getWeight()); return ResponseEntity.ok(null); @@ -141,6 +157,7 @@ public ResponseEntity approveActivity(@PathVariable Long id, @RequestBody @PutMapping("/activity/reject/{id}") @ApiOperation(value = ApiDoc.ACTIVITY_REJECT) + @RequiredManagerLogin public ResponseEntity rejectActivity(@PathVariable Long id) { activityService.reject(id); return ResponseEntity.ok(null); @@ -149,9 +166,13 @@ public ResponseEntity rejectActivity(@PathVariable Long id) { @GetMapping("/activity-detail/{activityId}") @ApiOperation(value = ApiDoc.ACTIVITY_STUDENT_DETAIL) - public ResponseEntity findParticipantActivityById(@PathVariable Long activityId) { - // ToDo StudentId 는 나중에 로그인으로 바꿈 - return ResponseEntity.ok(ActivityParticipantResponse.of(activityService.findParticipantActivityById(1L, activityId))); + @RequiredLogin + public ResponseEntity findParticipantActivityById( + @PathVariable Long activityId, + @StudentLogin LoginStudent loginStudent) { + + ActivityParticipantDto dto = activityService.findParticipantActivityById(loginStudent.getId(), activityId); + return ResponseEntity.ok(ActivityParticipantResponse.of(dto)); } } diff --git a/src/main/java/com/server/hispath/activity/presentation/ChartController.java b/src/main/java/com/server/hispath/activity/presentation/ChartController.java index d42cbe1..9503f15 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ChartController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ChartController.java @@ -6,6 +6,10 @@ import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.dto.ChartSearchRequestDto; import com.server.hispath.activity.presentation.response.chart.*; +import com.server.hispath.auth.domain.LoginStudent; +import com.server.hispath.auth.domain.RequiredLogin; +import com.server.hispath.auth.domain.RequiredManagerLogin; +import com.server.hispath.auth.domain.StudentLogin; import com.server.hispath.docs.ApiDoc; import com.server.hispath.scholarship.application.ScholarshipService; @@ -29,14 +33,16 @@ public class ChartController { @GetMapping("/chart/mileage") @ApiOperation(value = ApiDoc.CHART_MILEAGE_CATEGORY) + @RequiredLogin public ResponseEntity> getChartMileageData( String semester, @RequestParam(required = false) Integer grade, - @RequestParam(required = false) String department + @RequestParam(required = false) String department, + @StudentLogin LoginStudent loginStudent ) { + ChartSearchRequestDto chartSearchRequestDto = new ChartSearchRequestDto(semester, grade, department); - // ToDo 지금은 1L로 하지만 나중에 바꿀 예정 - List responses = activityService.getChartDatasByCategory(1L, chartSearchRequestDto) + List responses = activityService.getChartDatasByCategory(loginStudent.getId(), chartSearchRequestDto) .stream() .map(ChartDataResponse::of) .collect(Collectors.toList()); @@ -45,14 +51,16 @@ public ResponseEntity> getChartMileageData( @GetMapping("/chart/popularity") @ApiOperation(value = ApiDoc.CHART_MILEAGE_POPULARITY_CATEGORY) + @RequiredLogin public ResponseEntity> getChartMileagePopularity( String semester, @RequestParam(required = false) Integer grade, - @RequestParam(required = false) String department + @RequestParam(required = false) String department, + @StudentLogin LoginStudent loginStudent ) { + ChartSearchRequestDto chartSearchRequestDto = new ChartSearchRequestDto(semester, grade, department); - // ToDo 지금은 1L로 하지만 나중에 바꿀 예정 - List responses = activityService.getChartTotalDatasByCategory(1L, chartSearchRequestDto) + List responses = activityService.getChartTotalDatasByCategory(loginStudent.getId(), chartSearchRequestDto) .stream() .map(ChartCategoryResponse::of) .collect(Collectors.toList()); @@ -61,21 +69,24 @@ public ResponseEntity> getChartMileagePopularity( @GetMapping("/chart/rank") @ApiOperation(value = ApiDoc.CHART_MILEAGE_RANK) + @RequiredLogin public ResponseEntity getChartMileageRank( String semester, @RequestParam(required = false) Integer grade, - @RequestParam(required = false) String department + @RequestParam(required = false) String department, + @StudentLogin LoginStudent loginStudent ) { + ChartSearchRequestDto chartSearchRequestDto = new ChartSearchRequestDto(semester, grade, department); - // ToDo 지금은 1L로 하지만 나중에 바꿀 예정 - return ResponseEntity.ok(ChartRankResponse.of(scholarshipService.getRankChartData(1L, chartSearchRequestDto))); + return ResponseEntity.ok(ChartRankResponse.of(scholarshipService.getRankChartData(loginStudent.getId(), chartSearchRequestDto))); } @GetMapping("/chart/timeline") @ApiOperation(value = ApiDoc.CHART_MILEAGE_TIMELINE) - public ResponseEntity> getChartMileageTimeline() { - // ToDo 지금은 1L로 하지만 나중에 바꿀 예정 - List responses = scholarshipService.getChartTimelines(1L) + @RequiredLogin + public ResponseEntity> getChartMileageTimeline(@StudentLogin LoginStudent loginStudent) { + + List responses = scholarshipService.getChartTimelines(loginStudent.getId()) .stream() .map(ChartTimelineResponse::of) .collect(Collectors.toList()); @@ -84,13 +95,17 @@ public ResponseEntity> getChartMileageTimeline() { @GetMapping("/chart/weight") @ApiOperation(value = ApiDoc.CHART_SCHOLARSHIP_WEIGHT) + @RequiredManagerLogin public ResponseEntity> getChartWeightDistribution(@RequestParam String semester) { + return ResponseEntity.ok(scholarshipService.getChartWeightDistribution(semester)); } @GetMapping("/chart/grade") @ApiOperation(value = ApiDoc.CHART_SCHOLARSHIP_GRADE) + @RequestMapping public ResponseEntity> getChartGradeDistribution(@RequestParam String semester) { + List responses = scholarshipService.getChartGradeDistribution(semester) .stream() .map(ChartGradeResponse::of) @@ -100,7 +115,9 @@ public ResponseEntity> getChartGradeDistribution(@Reque @GetMapping("/chart/department") @ApiOperation(value = ApiDoc.CHART_SCHOLARSHIP_DEPARTMENT) + @RequiredManagerLogin public ResponseEntity> getChartDepartmentDistribution(@RequestParam String semester) { + List responses = scholarshipService.getChartDepartmentDistribution(semester) .stream() .map(ChartDepartmentResponse::of) diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 7ead274..9e016a2 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -14,6 +14,7 @@ import com.server.hispath.activity.presentation.response.AllMActivityParticipantResponse; import com.server.hispath.activity.presentation.response.MActivityParticipantResponse; import com.server.hispath.activity.presentation.response.SemesterResponse; +import com.server.hispath.auth.domain.*; import com.server.hispath.docs.ApiDoc; import com.server.hispath.student.application.StudentService; import com.server.hispath.student.application.dto.StudentSimpleRefDto; @@ -38,6 +39,7 @@ public class MActivityController { @PostMapping("/mileage") @ApiOperation(value = ApiDoc.MILEAGE_CREATE) + @RequiredSuperManagerLogin public ResponseEntity create(@RequestBody MActivityCURequest request) { Long id = mActivityService.create(MActivityContentDto.of(request)); return ResponseEntity.ok(id); @@ -45,6 +47,7 @@ public ResponseEntity create(@RequestBody MActivityCURequest request) { @PostMapping("/mileages") @ApiOperation(value = ApiDoc.MILEAGES_CREATE) + @RequiredSuperManagerLogin public ResponseEntity createMActivites(MultipartFile file) throws Exception { mActivityService.createAll(ExcelManager.getMActivities(ExcelManager.extract(file))); return ResponseEntity.ok(null); @@ -52,6 +55,7 @@ public ResponseEntity createMActivites(MultipartFile file) throws Exceptio @PutMapping("/mileage/{id}") @ApiOperation(value = ApiDoc.MILEAGE_UPDATE) + @RequiredSuperManagerLogin public ResponseEntity update(@PathVariable Long id, @RequestBody MActivityCURequest request) { ActivityDto dto = mActivityService.update(id, MActivityContentDto.of(request)); ActivityResponse response = ActivityResponse.from(dto); @@ -61,6 +65,7 @@ public ResponseEntity update(@PathVariable Long id, @RequestBo @DeleteMapping("/mileage/{id}") @ApiOperation(value = ApiDoc.MILEAGE_DELETE) + @RequiredSuperManagerLogin public ResponseEntity delete(@PathVariable Long id) { activityService.delete(id); return ResponseEntity.ok(id); @@ -68,6 +73,7 @@ public ResponseEntity delete(@PathVariable Long id) { @GetMapping("/mileage/semester") @ApiOperation(value = ApiDoc.MILEAGE_READ_SEMESTER) + @RequiredManagerLogin public ResponseEntity> findAllBySemester(@RequestParam String semester) { List activityDtos = mActivityService.findAllBySemester(semester); List responses = activityDtos.stream() @@ -78,6 +84,7 @@ public ResponseEntity> findAllBySemester(@RequestParam St @GetMapping("/mileages") @ApiOperation(value = ApiDoc.MILEAGE_READ_ALL) + @RequiredManagerLogin public ResponseEntity> findAll() { List responses = mActivityService.findAll() @@ -89,6 +96,7 @@ public ResponseEntity> findAll() { @PostMapping("/mileage/students") @ApiOperation(value = ApiDoc.MILEAGE_REGISTER_STUDENTS) + @RequiredManagerLogin public ResponseEntity registerStudents(@RequestPart(value = "file", required = false) MultipartFile file, @RequestPart(value = "activityId") Long activityId) throws Exception { @@ -99,6 +107,7 @@ public ResponseEntity registerStudents(@RequestPart(value = "file", requir @PostMapping("/mileage/student") @ApiOperation(value = ApiDoc.MILEAGE_REGISTER_STUDENT) + @RequiredManagerLogin public ResponseEntity registerStudent(@RequestBody MStudentRegisterRequest request) { studentService.registerParticipant(request.getActivityId(), StudentSimpleRefDto.of(request)); @@ -107,6 +116,7 @@ public ResponseEntity registerStudent(@RequestBody MStudentRegisterRequest @DeleteMapping("/mileage/student") @ApiOperation(value = ApiDoc.ACTIVITY_STUDENT_DELETE) + @RequiredManagerLogin public ResponseEntity deleteParticipant(@RequestBody MParticipantRequest request) { mActivityService.deleteParticipant(request.getStudentId(), request.getActivityId()); return ResponseEntity.ok(null); @@ -118,16 +128,18 @@ public ResponseEntity findMileageActivityById(@PathVariable return ResponseEntity.ok(mActivityService.findDetailActivityInfo(id)); } - @GetMapping("/studentmileage/{id}") + @GetMapping("/studentmileage") @ApiOperation(value = ApiDoc.STUDENT_MILEAGE_READ) - public ResponseEntity findActivtyByStudentId(@PathVariable Long id) { - return ResponseEntity.ok(mActivityService.findActivitiesByStudent(id)); + @RequiredLogin + public ResponseEntity findActivtyByStudentId(@StudentLogin LoginStudent loginStudent) { + return ResponseEntity.ok(mActivityService.findActivitiesByStudent(loginStudent.getId())); } - @GetMapping("/semester/{id}") + @GetMapping("/student/semester") @ApiOperation(value = ApiDoc.STUDENT_READ_SEMESTER) - public ResponseEntity> findSemestersById(@PathVariable Long id) { - List semesters = mActivityService.findSemestersById(id); + @RequiredLogin + public ResponseEntity> findSemestersById(@StudentLogin LoginStudent loginStudent) { + List semesters = mActivityService.findSemestersById(loginStudent.getId()); List responses = semesters.stream() .map(SemesterResponse::from) .collect(Collectors.toList()); @@ -135,10 +147,14 @@ public ResponseEntity> findSemestersById(@PathVariable Lo } - @GetMapping("/student-mactivities/{id}") + @GetMapping("/student-mactivities") @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_READ_SEMESTER) - public ResponseEntity> findParticipatedActivities(@PathVariable Long id, @RequestParam String semester, @RequestParam String category) { - List responses = mActivityService.findAllParticipantActivities(id, semester, category) + @RequiredLogin + public ResponseEntity> findParticipatedActivities( + @StudentLogin LoginStudent loginStudent, + @RequestParam String semester, + @RequestParam String category) { + List responses = mActivityService.findAllParticipantActivities(loginStudent.getId(), semester, category) .stream() .map(MActivityParticipantResponse::of) .collect(Collectors.toList()); @@ -147,19 +163,23 @@ public ResponseEntity> findParticipatedActivi } - @GetMapping("/student-allmactivities/{id}") + @GetMapping("/student-allmactivities") @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_READ_PARTICIPATE) - public ResponseEntity> findAllParticipatedActivities(@PathVariable Long id, @RequestParam String semester, @RequestParam String category) { + @RequiredLogin + public ResponseEntity> findAllParticipatedActivities( + @StudentLogin LoginStudent loginStudent, + @RequestParam String semester, + @RequestParam String category) { List responses; if (Objects.equals(category, "참여여부")) { - responses = mActivityService.findParticipatedActivities(id, semester, "ALL") + responses = mActivityService.findParticipatedActivities(loginStudent.getId(), semester, "ALL") .stream() - .filter(example -> example.isParticipated()) + .filter(AllMActivityParticipantDto::isParticipated) .map(AllMActivityParticipantResponse::of) .collect(Collectors.toList()); } else { - responses = mActivityService.findParticipatedActivities(id, semester, category) + responses = mActivityService.findParticipatedActivities(loginStudent.getId(), semester, category) .stream() .map(AllMActivityParticipantResponse::of) .collect(Collectors.toList()); diff --git a/src/main/java/com/server/hispath/category/presentation/CategoryController.java b/src/main/java/com/server/hispath/category/presentation/CategoryController.java index 35cb52c..8cec7a0 100644 --- a/src/main/java/com/server/hispath/category/presentation/CategoryController.java +++ b/src/main/java/com/server/hispath/category/presentation/CategoryController.java @@ -3,6 +3,8 @@ import java.util.List; import java.util.stream.Collectors; +import com.server.hispath.auth.domain.RequiredLogin; +import com.server.hispath.auth.domain.RequiredManagerLogin; import com.server.hispath.category.application.CategoryService; import com.server.hispath.category.application.dto.CategoryCUDto; import com.server.hispath.category.application.dto.CategoryContentDto; @@ -27,6 +29,7 @@ public class CategoryController { @PostMapping("/category") @ApiOperation(value = ApiDoc.CATEGORY_CREATE) + @RequiredManagerLogin public ResponseEntity create(@RequestBody CategoryCURequest request) { Long savedId = categoryService.create(CategoryCUDto.of(request)); return ResponseEntity.ok(savedId); @@ -35,6 +38,7 @@ public ResponseEntity create(@RequestBody CategoryCURequest request) { @GetMapping("/category/{id}") @ApiOperation(value = ApiDoc.CATEGORY_READ) + @RequiredLogin public ResponseEntity find(@PathVariable Long id) { CategoryContentDto dto = categoryService.find(id); CategoryResponse response = CategoryResponse.from(dto); @@ -43,6 +47,7 @@ public ResponseEntity find(@PathVariable Long id) { @GetMapping("/categories") @ApiOperation(value = ApiDoc.CATEGORY_READ_ALL) + @RequiredLogin public ResponseEntity> findAll() { List dtos = categoryService.findAll(); List responses = dtos.stream() @@ -53,6 +58,7 @@ public ResponseEntity> findAll() { @PutMapping("/category/{id}") @ApiOperation(value = ApiDoc.CATEGORY_UPDATE) + @RequiredManagerLogin public ResponseEntity update(@PathVariable Long id, @RequestBody CategoryCURequest request) { CategoryContentDto dto = categoryService.update(id, CategoryCUDto.of(request)); CategoryResponse response = CategoryResponse.from(dto); @@ -62,6 +68,7 @@ public ResponseEntity update(@PathVariable Long id, @RequestBo @DeleteMapping("/category/{id}") @ApiOperation(value = ApiDoc.CATEGORY_DELETE) + @RequiredManagerLogin public ResponseEntity delete(@PathVariable Long id) { categoryService.delete(id); return ResponseEntity.ok(id); diff --git a/src/main/java/com/server/hispath/department/presentation/DepartmentController.java b/src/main/java/com/server/hispath/department/presentation/DepartmentController.java index 7f152bc..33d595d 100644 --- a/src/main/java/com/server/hispath/department/presentation/DepartmentController.java +++ b/src/main/java/com/server/hispath/department/presentation/DepartmentController.java @@ -1,5 +1,7 @@ package com.server.hispath.department.presentation; +import com.server.hispath.auth.domain.RequiredLogin; +import com.server.hispath.auth.domain.RequiredManagerLogin; import com.server.hispath.department.application.DepartmentService; import com.server.hispath.department.application.dto.DepartmentDto; import com.server.hispath.department.presentation.request.DepartmentCRRequest; @@ -21,14 +23,18 @@ public class DepartmentController { @PostMapping("/department") @ApiOperation(value = ApiDoc.DEPARTMENT_CREATE) + @RequiredManagerLogin public ResponseEntity create(@RequestBody DepartmentCRRequest request) { + Long savedId = departmentService.create(DepartmentDto.of(request)); return ResponseEntity.ok(savedId); } @GetMapping("/department/{id}") @ApiOperation(value = ApiDoc.DEPARTMENT_READ) + @RequiredLogin public ResponseEntity find(@PathVariable Long id) { + DepartmentDto dto = departmentService.find(id); DepartmentResponse response = DepartmentResponse.from(dto); return ResponseEntity.ok(response); @@ -36,7 +42,9 @@ public ResponseEntity find(@PathVariable Long id) { @GetMapping("/departments") @ApiOperation(value = ApiDoc.DEPARTMENT_READ_ALL) + @RequiredLogin public ResponseEntity> findAll() { + List dtos = departmentService.findAll(); List responses = dtos.stream() .map(DepartmentResponse::from) @@ -46,6 +54,7 @@ public ResponseEntity> findAll() { @PatchMapping("/department/{id}") @ApiOperation(value = ApiDoc.DEPARTMENT_UPDATE) + @RequiredManagerLogin public ResponseEntity update(@PathVariable Long id, @RequestBody DepartmentCRRequest request) { DepartmentDto dto = departmentService.update(id, DepartmentDto.of(request)); DepartmentResponse response = DepartmentResponse.from(dto); @@ -54,6 +63,7 @@ public ResponseEntity update(@PathVariable Long id, @Request @DeleteMapping("/department/{id}") @ApiOperation(value = ApiDoc.DEPARTMENT_DELETE) + @RequiredManagerLogin public ResponseEntity delete(@PathVariable Long id) { departmentService.delete(id); return ResponseEntity.ok(id); diff --git a/src/main/java/com/server/hispath/exception/activity/ActivityApplyException.java b/src/main/java/com/server/hispath/exception/activity/ActivityApplyException.java new file mode 100644 index 0000000..68fdd6f --- /dev/null +++ b/src/main/java/com/server/hispath/exception/activity/ActivityApplyException.java @@ -0,0 +1,12 @@ +package com.server.hispath.exception.activity; + +import com.server.hispath.exception.HisPathException; + +import org.springframework.http.HttpStatus; + +public class ActivityApplyException extends ActivityException { + public ActivityApplyException() { + super("이미 처리된 활동은 다시 신청할 수 없습니다.", HttpStatus.BAD_REQUEST); + } +} + diff --git a/src/main/java/com/server/hispath/major/presentation/MajorController.java b/src/main/java/com/server/hispath/major/presentation/MajorController.java index 81c1d4d..0fcca8e 100644 --- a/src/main/java/com/server/hispath/major/presentation/MajorController.java +++ b/src/main/java/com/server/hispath/major/presentation/MajorController.java @@ -3,6 +3,8 @@ import java.util.List; import java.util.stream.Collectors; +import com.server.hispath.auth.domain.RequiredLogin; +import com.server.hispath.auth.domain.RequiredManagerLogin; import com.server.hispath.docs.ApiDoc; import com.server.hispath.major.application.MajorService; import com.server.hispath.major.application.dto.MajorContentDto; @@ -26,6 +28,7 @@ public class MajorController { @PostMapping("/major") @ApiOperation(value = ApiDoc.MAJOR_CREATE) + @RequiredManagerLogin public ResponseEntity create(@RequestBody MajorCURequest request) { Long id = majorService.create(MajorContentDto.from(request)); return ResponseEntity.ok(id); @@ -34,6 +37,7 @@ public ResponseEntity create(@RequestBody MajorCURequest request) { @GetMapping("/major/{id}") @ApiOperation(value = ApiDoc.MAJOR_READ) + @RequiredLogin public ResponseEntity find(@PathVariable Long id) { MajorResponse response = MajorResponse.from(majorService.find(id)); return ResponseEntity.ok(response); @@ -41,6 +45,7 @@ public ResponseEntity find(@PathVariable Long id) { @PatchMapping("/major/{id}") @ApiOperation(value = ApiDoc.MAJOR_UPDATE) + @RequiredManagerLogin public ResponseEntity update(@PathVariable Long id, @RequestBody MajorCURequest request) { MajorDto dto = majorService.update(id, MajorContentDto.from(request)); MajorResponse response = MajorResponse.from(dto); @@ -49,6 +54,7 @@ public ResponseEntity update(@PathVariable Long id, @RequestBody @DeleteMapping("/major/{id}") @ApiOperation(value = ApiDoc.MAJOR_DELETE) + @RequiredManagerLogin public ResponseEntity delete(@PathVariable Long id) { majorService.delete(id); return ResponseEntity.ok(id); @@ -56,6 +62,7 @@ public ResponseEntity delete(@PathVariable Long id) { @GetMapping("/majors") @ApiOperation(value = ApiDoc.MAJOR_READ_ALL) + @RequiredLogin public ResponseEntity> findAll() { List responses = majorService.findAll() .stream() diff --git a/src/main/java/com/server/hispath/major/presentation/MajorTestController.java b/src/main/java/com/server/hispath/major/presentation/MajorTestController.java deleted file mode 100644 index 359041d..0000000 --- a/src/main/java/com/server/hispath/major/presentation/MajorTestController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.server.hispath.major.presentation; - - -import com.server.hispath.major.domain.Major; -import com.server.hispath.major.domain.repository.MajorRepository; -import lombok.Builder; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - - - -@RestController -@RequiredArgsConstructor -@RequestMapping("/major") -public class MajorTestController { - - private final MajorRepository majorRepository; - - @GetMapping("/init") - public ResponseEntity testInit() { - - majorRepository.save(Major.builder().name("AI컴퓨터공학심화").build()); - majorRepository.save(Major.builder().name("전자공학심화").build()); - majorRepository.save(Major.builder().name("국제지역학").build()); - majorRepository.save(Major.builder().name("국제관계학").build()); - majorRepository.save(Major.builder().name("경영학").build()); - majorRepository.save(Major.builder().name("언론정보학").build()); - majorRepository.save(Major.builder().name("법학").build()); - majorRepository.save(Major.builder().name("ICT융합전공").build()); - majorRepository.save(Major.builder().name("생명과학").build()); - majorRepository.save(Major.builder().name("경제학").build()); - - return ResponseEntity.ok(null); - } -} diff --git a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java index 729aec5..1aa8f0c 100644 --- a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java +++ b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java @@ -3,6 +3,8 @@ import java.util.List; import java.util.stream.Collectors; +import com.server.hispath.auth.domain.RequiredManagerLogin; +import com.server.hispath.auth.domain.RequiredSuperManagerLogin; import com.server.hispath.docs.ApiDoc; import com.server.hispath.manager.application.ManagerService; import com.server.hispath.manager.application.dto.ManagerCUDto; @@ -26,6 +28,7 @@ public class ManagerController { @PostMapping("/manager") @ApiOperation(value = ApiDoc.MANAGER_CREATE) + @RequiredSuperManagerLogin public ResponseEntity create(@RequestBody ManagerCURequest request) { Long savedId = managerService.create(ManagerCUDto.of(request)); return ResponseEntity.ok(savedId); @@ -33,6 +36,7 @@ public ResponseEntity create(@RequestBody ManagerCURequest request) { @GetMapping("/manager/{id}") @ApiOperation(value = ApiDoc.MANAGER_READ) + @RequiredManagerLogin public ResponseEntity find(@PathVariable Long id) { ManagerResponse response = ManagerResponse.of(managerService.findManager(id)); return ResponseEntity.ok(response); @@ -40,6 +44,7 @@ public ResponseEntity find(@PathVariable Long id) { @GetMapping("/managers") @ApiOperation(value = ApiDoc.MANAGER_READ_ALL) + @RequiredManagerLogin public ResponseEntity> findAll() { List responses = managerService.findManagers() .stream() @@ -50,6 +55,7 @@ public ResponseEntity> findAll() { @PutMapping("/manager/{id}") @ApiOperation(value = ApiDoc.MANAGER_UPDATE) + @RequiredSuperManagerLogin public ResponseEntity update(@PathVariable Long id, @RequestBody ManagerCURequest request) { ManagerResponse response = ManagerResponse.of(managerService.update(id, ManagerCUDto.of(request))); return ResponseEntity.ok(response); @@ -57,6 +63,7 @@ public ResponseEntity update(@PathVariable Long id, @RequestBod @PutMapping("/manager/approve") @ApiOperation(value = ApiDoc.MANAGER_APPROVE) + @RequiredSuperManagerLogin public ResponseEntity approve(@RequestBody ManagerApproveRequest request) { Long response = managerService.approve(request.getManagerId(), request.getLevel()); return ResponseEntity.ok(response); @@ -64,6 +71,7 @@ public ResponseEntity approve(@RequestBody ManagerApproveRequest request) @DeleteMapping("/manager/{id}") @ApiOperation(value = ApiDoc.MANAGER_DELETE) + @RequiredSuperManagerLogin public ResponseEntity delete(@PathVariable Long id) { Long response = managerService.delete(id); return ResponseEntity.ok(response); diff --git a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java index 3131718..4bf5893 100644 --- a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java +++ b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java @@ -1,5 +1,7 @@ package com.server.hispath.notice.presentation; +import com.server.hispath.auth.domain.RequiredLogin; +import com.server.hispath.auth.domain.RequiredManagerLogin; import com.server.hispath.docs.ApiDoc; import com.server.hispath.notice.application.dto.DashboardNoticeDto; import com.server.hispath.notice.application.dto.NoticeContentDto; @@ -31,6 +33,7 @@ public class NoticeController { @CrossOrigin(origins = "http://localhost:3000") @PostMapping("/notice/add") @ApiOperation(value= ApiDoc.NOTICE_CREATE) + @RequiredManagerLogin public ResponseEntity create(@RequestBody NoticeRequest request){ Long id = noticeService.create(request.getManagerId(), NoticeContentDto.from(request)); return ResponseEntity.ok(id); @@ -38,6 +41,7 @@ public ResponseEntity create(@RequestBody NoticeRequest request){ @CrossOrigin(origins = "http://localhost:3000") @GetMapping("/notice") + @RequiredLogin @ApiOperation(value = ApiDoc.NOTICE_READ_ALL) public ResponseEntity> findAll() { List responses = noticeService.findAll().stream().sorted(Comparator.comparing(NoticeDto::getRegDate).reversed()).map(NoticeResponse::from).collect(Collectors.toList()); @@ -47,6 +51,7 @@ public ResponseEntity> findAll() { @CrossOrigin(origins = "http://localhost:3000") @GetMapping("/notice/imp") @ApiOperation(value = ApiDoc.NOTICE_READ_IMP) + @RequiredLogin public ResponseEntity> findImp() { List responses = noticeService.findImp().stream().sorted(Comparator.comparing(DashboardNoticeDto::getPubDate).reversed()).map(NoticeDashboardResponse::of).collect(Collectors.toList()); return ResponseEntity.ok(responses); @@ -55,6 +60,7 @@ public ResponseEntity> findImp() { @CrossOrigin(origins = "http://localhost:3000") @GetMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_READ) + @RequiredLogin public ResponseEntity find(@PathVariable Long id){ // noticeService.increaseViewCnt(id); NoticeResponse response = NoticeResponse.from(noticeService.find(id)); @@ -65,6 +71,7 @@ public ResponseEntity find(@PathVariable Long id){ @CrossOrigin(origins = "http://localhost:3000") @PatchMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_UPDATE) + @RequiredManagerLogin public ResponseEntity update(@PathVariable Long id, @RequestBody NoticeRequest request){ NoticeDto dto = noticeService.update(id, request.getManagerId(), NoticeContentDto.from(request)); NoticeResponse response = NoticeResponse.from(dto); @@ -74,6 +81,7 @@ public ResponseEntity update(@PathVariable Long id, @RequestBody @CrossOrigin(origins = "http://localhost:3000") @DeleteMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_DELETE) + @RequiredManagerLogin public ResponseEntity delete(@PathVariable Long id){ noticeService.delete(id); return ResponseEntity.ok(id); diff --git a/src/main/java/com/server/hispath/resume/presentation/ResumeController.java b/src/main/java/com/server/hispath/resume/presentation/ResumeController.java index 7c9c473..15f1aea 100644 --- a/src/main/java/com/server/hispath/resume/presentation/ResumeController.java +++ b/src/main/java/com/server/hispath/resume/presentation/ResumeController.java @@ -5,6 +5,9 @@ import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.application.dto.ActivityParticipantDto; +import com.server.hispath.auth.domain.LoginStudent; +import com.server.hispath.auth.domain.RequiredLogin; +import com.server.hispath.auth.domain.StudentLogin; import com.server.hispath.docs.ApiDoc; import com.server.hispath.resume.application.ResumeService; import com.server.hispath.resume.application.dto.ResumeDto; @@ -31,15 +34,17 @@ public class ResumeController { @PostMapping("/resume") @ApiOperation(value = ApiDoc.RESUME_CREATE) - public ResponseEntity create(@RequestBody ResumeCURequest request) { - // Todo @Login 을 통해 API 를 호출 할 수 있도록 하기 - // Todo 현재는 그냥 단순 테스트를 위해 1번에 넣기 - Long response = resumeService.create(1L, new ResumeDto(request)); + @RequiredLogin + public ResponseEntity create( + @StudentLogin LoginStudent loginStudent, + @RequestBody ResumeCURequest request) { + Long response = resumeService.create(loginStudent.getId(), new ResumeDto(request)); return ResponseEntity.ok(response); } @PutMapping("/resume/{id}") @ApiOperation(value = ApiDoc.RESUME_UPDATE) + @RequiredLogin public ResponseEntity update(@PathVariable Long id, @RequestBody ResumeCURequest request) { ResumeResponse response = ResumeResponse.of(resumeService.update(new ResumeDto(id, request))); return ResponseEntity.ok(response); @@ -47,6 +52,7 @@ public ResponseEntity update(@PathVariable Long id, @RequestBody @DeleteMapping("/resume/{id}") @ApiOperation(value = ApiDoc.RESUME_DELETE) + @RequiredLogin public ResponseEntity delete(@PathVariable Long id) { resumeService.delete(id); return ResponseEntity.ok(null); @@ -54,16 +60,17 @@ public ResponseEntity delete(@PathVariable Long id) { @GetMapping("/resume") @ApiOperation(value = ApiDoc.RESUME_READ) + @RequiredLogin public ResponseEntity find(@RequestParam Long resumeId) { return ResponseEntity.ok(ResumeResponse.of(resumeService.find(resumeId))); } @GetMapping("/resumes") @ApiOperation(value = ApiDoc.RESUME_READ_ALL) - public ResponseEntity> findALl() { - // Todo @Login 을 통해 API 를 호출 할 수 있도록 하기 - // Todo 현재는 그냥 단순 테스트를 위해 1번에 넣기 - List responses = resumeService.findAllStudentResumes(1L) + @RequiredLogin + public ResponseEntity> findALl(@StudentLogin LoginStudent loginStudent) { + + List responses = resumeService.findAllStudentResumes(loginStudent.getId()) .stream() .map(ResumeResponse::of) .collect(Collectors.toList()); @@ -73,10 +80,10 @@ public ResponseEntity> findALl() { @GetMapping("/resume/info") @ApiOperation(value = ApiDoc.RESUME_INFO) - public ResponseEntity findStudentActivityInfo() { - // Todo @Login 을 통해 API 를 호출 할 수 있도록 하기 - // Todo 현재는 그냥 단순 테스트를 위해 1번에 넣기 - StudentDto studentDto = studentService.find(1L); + @RequiredLogin + public ResponseEntity findStudentActivityInfo(@StudentLogin LoginStudent loginStudent) { + + StudentDto studentDto = studentService.find(loginStudent.getId()); List activities = activityService.findAllParticipantActivites(studentDto.getId(), "ALL", "ALL"); return ResponseEntity.ok(new ResumeStudentInfo(studentDto, activities)); } diff --git a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java index b6bfda3..735b2f4 100644 --- a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java +++ b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java @@ -4,10 +4,10 @@ import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; - -import java.util.List; -import java.util.stream.Collectors; - +import com.server.hispath.auth.domain.LoginStudent; +import com.server.hispath.auth.domain.RequiredLogin; +import com.server.hispath.auth.domain.RequiredManagerLogin; +import com.server.hispath.auth.domain.StudentLogin; import com.server.hispath.docs.ApiDoc; import com.server.hispath.scholarship.application.ScholarshipService; import com.server.hispath.scholarship.application.dto.ScholarshipDto; @@ -22,7 +22,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; - import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -37,16 +36,18 @@ public class ScholarshipController { @PostMapping("/scholarship") @ApiOperation(value = ApiDoc.SCHOLARSHIP_CREATE) - public ResponseEntity create(@RequestBody ScholarshipCURequest request) { - // Todo @Login 을 통해 API 를 호출 할 수 있도록 하기 - // Todo 현재는 그냥 단순 테스트를 위해 1번에 넣기 - Long response = scholarshipService.create(1L, request.getSemester()); + @RequiredLogin + public ResponseEntity create(@StudentLogin LoginStudent loginStudent, + @RequestBody ScholarshipCURequest request) { + + Long response = scholarshipService.create(loginStudent.getId(), request.getSemester()); return ResponseEntity.ok(response); } @GetMapping("/scholarships") @ApiOperation(value = ApiDoc.SCHOLARSHIP_READ_ALL) + @RequiredManagerLogin public ResponseEntity> getScholarshipStudents(@RequestParam boolean approved, @RequestParam String semester) { List responses = scholarshipService.findAllScholarshipStudent(approved, semester) .stream() @@ -57,6 +58,7 @@ public ResponseEntity> getScholarshipStudents(@Request @GetMapping("/scholarship/activities") @ApiOperation(value = ApiDoc.SCHOLARSHIP_ACTIVITIES) + @RequiredManagerLogin public ResponseEntity getScholarshipDetailInfo(@RequestParam Long studentId, @RequestParam String semester) { List scholarshipActivityResponses = activityService.findAllByStudentAndSemster(studentId, semester) .stream() @@ -69,6 +71,7 @@ public ResponseEntity getScholarshipDetailInfo(@Reque @PutMapping("/scholarship/approval") @ApiOperation(value = ApiDoc.APPROVE_SCHOLARSHIPS) + @RequiredManagerLogin public ResponseEntity approveAll(@RequestPart(value = "file", required = false) MultipartFile file, @RequestPart(value = "semester") String semester) throws Exception { scholarshipService.approveAll(ExcelManager.getScholarshipApproveDatas(ExcelManager.extract(file)), semester); @@ -77,6 +80,7 @@ public ResponseEntity approveAll(@RequestPart(value = "file", required = f @GetMapping("/scholarship/students") @ApiOperation(value = ApiDoc.SCHOLARSHIP_SEARCH_STUDENT) + @RequiredManagerLogin public ResponseEntity> searchScholarshipStudents( @RequestParam(required = false) String semester, @RequestParam(required = false) String studentSemester, diff --git a/src/main/java/com/server/hispath/student/presentation/StudentController.java b/src/main/java/com/server/hispath/student/presentation/StudentController.java index a40c268..13e2f8f 100644 --- a/src/main/java/com/server/hispath/student/presentation/StudentController.java +++ b/src/main/java/com/server/hispath/student/presentation/StudentController.java @@ -6,6 +6,10 @@ import com.server.hispath.activity.application.ActivityService; import com.server.hispath.activity.presentation.response.ActivityParticipantStatusResponse; import com.server.hispath.activity.presentation.response.SemesterResponse; +import com.server.hispath.auth.domain.LoginStudent; +import com.server.hispath.auth.domain.RequiredLogin; +import com.server.hispath.auth.domain.RequiredManagerLogin; +import com.server.hispath.auth.domain.StudentLogin; import com.server.hispath.docs.ApiDoc; import com.server.hispath.notice.application.NoticeService; import com.server.hispath.notice.application.dto.DashboardNoticeDto; @@ -36,6 +40,7 @@ public class StudentController { @PostMapping("/student") @ApiOperation(value = ApiDoc.STUDENT_CREATE) + @RequiredManagerLogin public ResponseEntity create(@RequestBody StudentCURequest request) { Long savedId = studentService.create(StudentCUDto.of(request)); return ResponseEntity.ok(savedId); @@ -43,6 +48,7 @@ public ResponseEntity create(@RequestBody StudentCURequest request) { @PostMapping("/students") @ApiOperation(value = ApiDoc.STUDENTS_CREATE) + @RequiredManagerLogin public ResponseEntity createStudents(MultipartFile file) throws Exception { studentService.createAll(ExcelManager.getStudentDatas(ExcelManager.extract(file))); return ResponseEntity.ok(null); @@ -50,6 +56,7 @@ public ResponseEntity createStudents(MultipartFile file) throws Exception @GetMapping("/student/{id}") @ApiOperation(value = ApiDoc.STUDENT_READ) + @RequiredManagerLogin public ResponseEntity find(@PathVariable Long id) { StudentDto dto = studentService.find(id); StudentResponse response = StudentResponse.from(dto); @@ -58,6 +65,7 @@ public ResponseEntity find(@PathVariable Long id) { @GetMapping("/students") @ApiOperation(value = ApiDoc.STUDENT_READ_ALL) + @RequiredManagerLogin public ResponseEntity> findAll() { List dtos = studentService.findAll(); List responses = dtos.stream() @@ -68,6 +76,7 @@ public ResponseEntity> findAll() { @PutMapping("/student/{id}") @ApiOperation(value = ApiDoc.STUDENT_UPDATE) + @RequiredLogin public ResponseEntity update(@PathVariable Long id, @RequestBody StudentCURequest request) { StudentDto dto = studentService.update(id, request.getDepartmentId(), request.getMajor1Id(), request.getMajor2Id(), StudentCUDto.of(request)); StudentResponse response = StudentResponse.from(dto); @@ -76,23 +85,31 @@ public ResponseEntity update(@PathVariable Long id, @RequestBod @DeleteMapping("/student/{id}") @ApiOperation(value = ApiDoc.STUDENT_DELETE) + @RequiredManagerLogin public ResponseEntity delete(@PathVariable Long id) { + studentService.delete(id); return ResponseEntity.ok(id); } - @GetMapping("/student/dashboard/{id}") + @GetMapping("/student/dashboard") @ApiOperation(value = ApiDoc.DASHBOARD) - public ResponseEntity getDashboardInfo(@PathVariable Long id) { - StudentDto studentDto = studentService.find(id); + @RequiredLogin + public ResponseEntity getDashboardInfo(@StudentLogin LoginStudent loginStudent) { + + StudentDto studentDto = studentService.find(loginStudent.getId()); List dashboardNoticeDtos = noticeService.findRecentNotice(); return ResponseEntity.ok(DashboardResponse.from(studentDto, dashboardNoticeDtos)); } @GetMapping("/student-activities/status") @ApiOperation(value = ApiDoc.STUDENT_ACTIVITY_READ_SEMESTER_SECTION_STATUS) - public ResponseEntity> findStudentActivitiesWithStatus(@RequestParam String semester, @RequestParam String section) { - // ToDo Student ID 관련해서는 나중에 Login 처리하기 현재는 1L로 되어있음 + @RequiredLogin + public ResponseEntity> findStudentActivitiesWithStatus( + @StudentLogin LoginStudent loginStudent, + @RequestParam String semester, + @RequestParam String section) { + List responses = activityService.findAllPersonalParticipantActivites(1L, semester, section) .stream() .map(ActivityParticipantStatusResponse::of) @@ -102,10 +119,12 @@ public ResponseEntity> findStudentActivi @GetMapping("/student/semesters") @ApiOperation(value = ApiDoc.STUDENT_SEMESTER) - public ResponseEntity> getStudentSemeters() { - // Todo @Login 을 통해 API 를 호출 할 수 있도록 하기 - // Todo 현재는 그냥 단순 테스트를 위해 1번에 넣기 - List responses = studentService.getStudentSemesters(1L) + @RequiredLogin + public ResponseEntity> getStudentSemeters( + @StudentLogin LoginStudent loginStudent + ) { + + List responses = studentService.getStudentSemesters(loginStudent.getId()) .stream() .map(SemesterResponse::from) .collect(Collectors.toList()); From 7bf4eae505c009ad01b59cbd1adeaaa63f53e470 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Wed, 16 Nov 2022 00:24:37 +0900 Subject: [PATCH 106/148] =?UTF-8?q?feat[#108]=20:=20=ED=95=99=EC=83=9D?= =?UTF-8?q?=EC=9A=A9=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20API=20=EA=B5=AC=ED=98=84=20(#109)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/StudentController.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/student/presentation/StudentController.java b/src/main/java/com/server/hispath/student/presentation/StudentController.java index 13e2f8f..20442c8 100644 --- a/src/main/java/com/server/hispath/student/presentation/StudentController.java +++ b/src/main/java/com/server/hispath/student/presentation/StudentController.java @@ -63,6 +63,15 @@ public ResponseEntity find(@PathVariable Long id) { return ResponseEntity.ok(response); } + @GetMapping("/student") + @ApiOperation(value = ApiDoc.STUDENT_READ) + @RequiredLogin + public ResponseEntity find(@StudentLogin LoginStudent loginStudent) { + StudentDto dto = studentService.find(loginStudent.getId()); + StudentResponse response = StudentResponse.from(dto); + return ResponseEntity.ok(response); + } + @GetMapping("/students") @ApiOperation(value = ApiDoc.STUDENT_READ_ALL) @RequiredManagerLogin @@ -76,13 +85,25 @@ public ResponseEntity> findAll() { @PutMapping("/student/{id}") @ApiOperation(value = ApiDoc.STUDENT_UPDATE) - @RequiredLogin + @RequiredManagerLogin public ResponseEntity update(@PathVariable Long id, @RequestBody StudentCURequest request) { StudentDto dto = studentService.update(id, request.getDepartmentId(), request.getMajor1Id(), request.getMajor2Id(), StudentCUDto.of(request)); StudentResponse response = StudentResponse.from(dto); return ResponseEntity.ok(response); } + @PutMapping("/student") + @ApiOperation(value = ApiDoc.STUDENT_UPDATE) + @RequiredLogin + public ResponseEntity update( + @StudentLogin LoginStudent loginStudent, + @RequestBody StudentCURequest request) { + StudentDto dto = studentService.update(loginStudent.getId(), request.getDepartmentId(), + request.getMajor1Id(), request.getMajor2Id(), StudentCUDto.of(request)); + StudentResponse response = StudentResponse.from(dto); + return ResponseEntity.ok(response); + } + @DeleteMapping("/student/{id}") @ApiOperation(value = ApiDoc.STUDENT_DELETE) @RequiredManagerLogin From aa1fe1721b5f23f4c2315c033df2f3ec30977e3c Mon Sep 17 00:00:00 2001 From: gomster Date: Wed, 16 Nov 2022 22:29:56 +0900 Subject: [PATCH 107/148] =?UTF-8?q?hotfix=20:=20Required=20Login=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=95=88=EB=90=98=EB=8A=94=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/server/hispath/auth/infrastructure/JwtProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/auth/infrastructure/JwtProvider.java b/src/main/java/com/server/hispath/auth/infrastructure/JwtProvider.java index f8e83eb..f4272af 100644 --- a/src/main/java/com/server/hispath/auth/infrastructure/JwtProvider.java +++ b/src/main/java/com/server/hispath/auth/infrastructure/JwtProvider.java @@ -54,7 +54,7 @@ public boolean validateBothToken(String token){ try{ validateToken(token, Member.STUDENT); return true; - } catch (JwtException | IllegalArgumentException e){ + } catch (InvalidTokenException | JwtException | IllegalArgumentException e){ try{ validateToken(token, Member.MANAGER); return true; From 11207883c9c27f06e28622498c795fd8bda09028 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sat, 19 Nov 2022 00:35:34 +0900 Subject: [PATCH 108/148] =?UTF-8?q?[#110]=20:=20=ED=95=99=EC=83=9D,=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EB=B0=B0=ED=8F=AC=EC=8B=9C=20?= =?UTF-8?q?=EB=8B=A4=EB=A5=B8=20URL=20=EB=A1=9C=20redirect=20=EB=90=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84=20(#111)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#110] : 사용 가능한 CORS URL 추가 * refactor[#110] : 중복되는 코드 삭제 * refactor[#110] : 필요없는 파일 삭제 * feat[#110] : Manager, Student 에 따라 Oauth 통신 구현 --- .../hispath/auth/application/AuthService.java | 17 +++++++---- .../hispath/auth/domain/OauthProperties.java | 3 +- .../hispath/auth/domain/OauthProvider.java | 6 ++-- .../auth/infrastructure/ApiRequester.java | 28 +++++++++++++------ .../auth/infrastructure/OauthHandler.java | 5 ++-- .../com/server/hispath/config/WebConfig.java | 2 +- .../notice/presentation/NoticeController.java | 6 ---- .../server/hispath/student/domain/Inhyok.java | 24 ---------------- 8 files changed, 40 insertions(+), 51 deletions(-) delete mode 100644 src/main/java/com/server/hispath/student/domain/Inhyok.java diff --git a/src/main/java/com/server/hispath/auth/application/AuthService.java b/src/main/java/com/server/hispath/auth/application/AuthService.java index 810f0a4..315f6ec 100644 --- a/src/main/java/com/server/hispath/auth/application/AuthService.java +++ b/src/main/java/com/server/hispath/auth/application/AuthService.java @@ -37,7 +37,7 @@ public class AuthService { private final ManagerRepository managerRepository; private final ManagerService managerService; - public void validateEamil(String email) { + public void validateEmail(String email) { String domain = email.split("@")[1]; if (!Objects.equals(domain, "handong.ac.kr")) { throw new NotHandongEmailException(); @@ -45,16 +45,21 @@ public void validateEamil(String email) { ; } - public OauthUserInfo getUserInfo(LoginRequestDto loginRequestDto) { + public OauthUserInfo getStudentInfo(LoginRequestDto loginRequestDto) { String oauthProvider = loginRequestDto.getOauthProvider(); - return oauthHandler.getUserInfoFromCode(oauthProvider, loginRequestDto.getCode()); + return oauthHandler.getUserInfoFromCode(oauthProvider, loginRequestDto.getCode(), Member.STUDENT); + } + + public OauthUserInfo getManagerInfo(LoginRequestDto loginRequestDto) { + String oauthProvider = loginRequestDto.getOauthProvider(); + return oauthHandler.getUserInfoFromCode(oauthProvider, loginRequestDto.getCode(), Member.MANAGER); } @Transactional(readOnly = true) public LoginResponseDto studentLogin(LoginRequestDto loginRequestDto) { - OauthUserInfo userInfo = getUserInfo(loginRequestDto); + OauthUserInfo userInfo = getStudentInfo(loginRequestDto); String email = userInfo.getEmail(); - validateEamil(email); + validateEmail(email); Optional student = studentRepository.findByEmail(email); return student.map(value -> new LoginResponseDto(false, jwtProvider.createToken(String.valueOf(value.getId()), Member.STUDENT))) @@ -63,7 +68,7 @@ public LoginResponseDto studentLogin(LoginRequestDto loginRequestDto) { @Transactional(readOnly = true) public LoginResponseDto managerLogin(LoginRequestDto loginRequestDto) { - OauthUserInfo userInfo = getUserInfo(loginRequestDto); + OauthUserInfo userInfo = getManagerInfo(loginRequestDto); String email = userInfo.getEmail(); Optional manager = managerRepository.findByEmail(email); return manager.map(value -> new LoginResponseDto(!value.isApproved(), diff --git a/src/main/java/com/server/hispath/auth/domain/OauthProperties.java b/src/main/java/com/server/hispath/auth/domain/OauthProperties.java index b92c663..f1d579e 100644 --- a/src/main/java/com/server/hispath/auth/domain/OauthProperties.java +++ b/src/main/java/com/server/hispath/auth/domain/OauthProperties.java @@ -20,7 +20,8 @@ public class OauthProperties { public static class User { private String clientId; private String clientSecret; - private String redirectUri; + private String studentRedirectUri; + private String managerRedirectUri; } @Getter diff --git a/src/main/java/com/server/hispath/auth/domain/OauthProvider.java b/src/main/java/com/server/hispath/auth/domain/OauthProvider.java index eacee41..57f6e2e 100644 --- a/src/main/java/com/server/hispath/auth/domain/OauthProvider.java +++ b/src/main/java/com/server/hispath/auth/domain/OauthProvider.java @@ -8,11 +8,13 @@ public class OauthProvider { private final String clientId; private final String clientSecret; - private final String redirectUrl; + private final String studentRedirectUrl; + private final String managerRedirectUrl; private final String tokenUrl; private final String userInfoUrl; public OauthProvider(OauthProperties.User user, OauthProperties.Provider provider) { - this(user.getClientId(), user.getClientSecret(), user.getRedirectUri(), provider.getTokenUri(), provider.getUserInfoUri()); + this(user.getClientId(), user.getClientSecret(), user.getStudentRedirectUri(), user.getManagerRedirectUri(), + provider.getTokenUri(), provider.getUserInfoUri()); } } diff --git a/src/main/java/com/server/hispath/auth/infrastructure/ApiRequester.java b/src/main/java/com/server/hispath/auth/infrastructure/ApiRequester.java index c5d9873..29810a8 100644 --- a/src/main/java/com/server/hispath/auth/infrastructure/ApiRequester.java +++ b/src/main/java/com/server/hispath/auth/infrastructure/ApiRequester.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.Map; +import com.server.hispath.auth.domain.Member; import com.server.hispath.auth.domain.OauthProvider; import com.server.hispath.exception.oauth.GetAccessTokenException; import com.server.hispath.exception.oauth.GetUserInfoException; @@ -20,12 +21,12 @@ public class ApiRequester { - public Map getUserInfo(String code, OauthProvider oauthProvider) { - String token = getToken(code, oauthProvider); + public Map getUserInfo(String code, OauthProvider oauthProvider, Member member) { + String token = getToken(code, oauthProvider, member); return getUserInfoByToken(token, oauthProvider.getUserInfoUrl()); } - private String getToken(String code, OauthProvider oauthProvider) { + private String getToken(String code, OauthProvider oauthProvider, Member member) { Map responseBody = WebClient.create() .post() .uri(oauthProvider.getTokenUrl()) @@ -34,7 +35,7 @@ private String getToken(String code, OauthProvider oauthProvider) { header.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); header.setAcceptCharset(Collections.singletonList(StandardCharsets.UTF_8)); }) - .bodyValue(tokenRequest(code, oauthProvider)) + .bodyValue(tokenRequest(code, oauthProvider, member)) .retrieve() .onStatus(HttpStatus::isError, response -> response.bodyToMono(String.class) @@ -49,11 +50,20 @@ private String getToken(String code, OauthProvider oauthProvider) { return responseBody.get("access_token").toString(); } - private MultiValueMap tokenRequest(String code, OauthProvider oauthProvider) { + private String getRedirectUrlByMember(Member member, OauthProvider oauthProvider) { + + if (Member.isStudent(member)) { + return oauthProvider.getStudentRedirectUrl(); + } + return oauthProvider.getManagerRedirectUrl(); + + } + + private MultiValueMap tokenRequest(String code, OauthProvider oauthProvider, Member member) { MultiValueMap formData = new LinkedMultiValueMap<>(); formData.add("code", code); formData.add("grant_type", "authorization_code"); - formData.add("redirect_uri", oauthProvider.getRedirectUrl()); + formData.add("redirect_uri", getRedirectUrlByMember(member, oauthProvider)); formData.add("client_id", oauthProvider.getClientId()); formData.add("client_secret", oauthProvider.getClientSecret()); return formData; @@ -73,10 +83,10 @@ private static Map getUserInfoByToken(String token, String userI .headers(httpHeaders -> httpHeaders.setBearerAuth(token)) .retrieve() .onStatus(HttpStatus::isError, response -> - response.bodyToMono(String.class) - .flatMap(error -> Mono.error(new UnableToGetOauthResponseException(error)))) + response.bodyToMono(String.class) + .flatMap(error -> Mono.error(new UnableToGetOauthResponseException(error)))) .bodyToMono(new ParameterizedTypeReference>() { - }) + }) .flux() .toStream() .findFirst() diff --git a/src/main/java/com/server/hispath/auth/infrastructure/OauthHandler.java b/src/main/java/com/server/hispath/auth/infrastructure/OauthHandler.java index 1a50217..9403270 100644 --- a/src/main/java/com/server/hispath/auth/infrastructure/OauthHandler.java +++ b/src/main/java/com/server/hispath/auth/infrastructure/OauthHandler.java @@ -2,6 +2,7 @@ import java.util.Map; +import com.server.hispath.auth.domain.Member; import com.server.hispath.auth.domain.OauthAttributes; import com.server.hispath.auth.domain.OauthProvider; import com.server.hispath.auth.domain.OauthUserInfo; @@ -14,9 +15,9 @@ public class OauthHandler { private final Map oauthProviders; private final ApiRequester apiRequester; - public OauthUserInfo getUserInfoFromCode(String oauthProvider, String code) { + public OauthUserInfo getUserInfoFromCode(String oauthProvider, String code, Member member) { OauthProvider oauth = getOauthProvider(oauthProvider); - Map attributes = apiRequester.getUserInfo(code, oauth); + Map attributes = apiRequester.getUserInfo(code, oauth, member); return OauthAttributes.extract(oauthProvider, attributes); } diff --git a/src/main/java/com/server/hispath/config/WebConfig.java b/src/main/java/com/server/hispath/config/WebConfig.java index ca7bf79..f32ea09 100644 --- a/src/main/java/com/server/hispath/config/WebConfig.java +++ b/src/main/java/com/server/hispath/config/WebConfig.java @@ -25,7 +25,7 @@ public class WebConfig implements WebMvcConfigurer { public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedMethods("*") - .allowedOrigins("http://localhost:3000", "http://localhost:8080"); + .allowedOrigins("http://localhost:3000", "http://localhost:8080", "https://hispath.kro.kr", "https://hispath-manager.kro.kr", "https://hispath-server.kro.kr"); } @Override diff --git a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java index 4bf5893..dd18fa5 100644 --- a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java +++ b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java @@ -30,7 +30,6 @@ public class NoticeController { private final NoticeService noticeService; - @CrossOrigin(origins = "http://localhost:3000") @PostMapping("/notice/add") @ApiOperation(value= ApiDoc.NOTICE_CREATE) @RequiredManagerLogin @@ -39,7 +38,6 @@ public ResponseEntity create(@RequestBody NoticeRequest request){ return ResponseEntity.ok(id); } - @CrossOrigin(origins = "http://localhost:3000") @GetMapping("/notice") @RequiredLogin @ApiOperation(value = ApiDoc.NOTICE_READ_ALL) @@ -48,7 +46,6 @@ public ResponseEntity> findAll() { return ResponseEntity.ok(responses); } - @CrossOrigin(origins = "http://localhost:3000") @GetMapping("/notice/imp") @ApiOperation(value = ApiDoc.NOTICE_READ_IMP) @RequiredLogin @@ -57,7 +54,6 @@ public ResponseEntity> findImp() { return ResponseEntity.ok(responses); } - @CrossOrigin(origins = "http://localhost:3000") @GetMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_READ) @RequiredLogin @@ -68,7 +64,6 @@ public ResponseEntity find(@PathVariable Long id){ } - @CrossOrigin(origins = "http://localhost:3000") @PatchMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_UPDATE) @RequiredManagerLogin @@ -78,7 +73,6 @@ public ResponseEntity update(@PathVariable Long id, @RequestBody return ResponseEntity.ok(response); } - @CrossOrigin(origins = "http://localhost:3000") @DeleteMapping("/notice/{id}") @ApiOperation(value = ApiDoc.NOTICE_DELETE) @RequiredManagerLogin diff --git a/src/main/java/com/server/hispath/student/domain/Inhyok.java b/src/main/java/com/server/hispath/student/domain/Inhyok.java deleted file mode 100644 index 58f326a..0000000 --- a/src/main/java/com/server/hispath/student/domain/Inhyok.java +++ /dev/null @@ -1,24 +0,0 @@ -//package com.server.hispath.student.domain; -// -//import com.server.hispath.activity.domain.Activity; -//import com.server.hispath.category.application.dto.CategoryDto; -//import lombok.AllArgsConstructor; -//import lombok.Getter; -//import lombok.NoArgsConstructor; -// -//@Getter -//@NoArgsConstructor -//@AllArgsConstructor -//public class Inhyok { -// private Long id; -// private String semester; -// private String name; -// private String remark; -// private CategoryDto category; -// private boolean participated; -// -// public Inhyok(Activity activity, boolean participated) { -// return new Inhyok(activity.getId(), activity.getSemester(), activity.getName(), CategoryDto.from(activity.getCategory()), -// , participated); -// } -//} From 9e1fb10516eda0e1fdbb7b12d51c0bf34c3b734c Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sat, 19 Nov 2022 01:53:57 +0900 Subject: [PATCH 109/148] =?UTF-8?q?[#112]=20:=20Login=20Count=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=ED=95=98=EB=8F=84=EB=A1=9D=20API=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20(#113)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#112] : login 횟수를 저장하는 DailyInfo 클래스 생성 * feat[#112] : 학생 Login 시 Login Count 저장하도록 API 구현 --- .../hispath/auth/application/AuthService.java | 25 +++++++++++-- .../hispath/manager/domain/DailyInfo.java | 36 +++++++++++++++++++ .../repository/DailyInfoRepository.java | 12 +++++++ 3 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/server/hispath/manager/domain/DailyInfo.java create mode 100644 src/main/java/com/server/hispath/manager/domain/repository/DailyInfoRepository.java diff --git a/src/main/java/com/server/hispath/auth/application/AuthService.java b/src/main/java/com/server/hispath/auth/application/AuthService.java index 315f6ec..cc2f22a 100644 --- a/src/main/java/com/server/hispath/auth/application/AuthService.java +++ b/src/main/java/com/server/hispath/auth/application/AuthService.java @@ -1,5 +1,6 @@ package com.server.hispath.auth.application; +import java.time.LocalDate; import java.util.Objects; import java.util.Optional; @@ -15,7 +16,9 @@ import com.server.hispath.exception.oauth.InvalidTokenException; import com.server.hispath.exception.oauth.NotHandongEmailException; import com.server.hispath.manager.application.ManagerService; +import com.server.hispath.manager.domain.DailyInfo; import com.server.hispath.manager.domain.Manager; +import com.server.hispath.manager.domain.repository.DailyInfoRepository; import com.server.hispath.manager.domain.repository.ManagerRepository; import com.server.hispath.student.application.StudentService; import com.server.hispath.student.domain.Student; @@ -36,6 +39,7 @@ public class AuthService { private final StudentService studentService; private final ManagerRepository managerRepository; private final ManagerService managerService; + private final DailyInfoRepository dailyInfoRepository; public void validateEmail(String email) { String domain = email.split("@")[1]; @@ -55,14 +59,18 @@ public OauthUserInfo getManagerInfo(LoginRequestDto loginRequestDto) { return oauthHandler.getUserInfoFromCode(oauthProvider, loginRequestDto.getCode(), Member.MANAGER); } - @Transactional(readOnly = true) + @Transactional public LoginResponseDto studentLogin(LoginRequestDto loginRequestDto) { OauthUserInfo userInfo = getStudentInfo(loginRequestDto); String email = userInfo.getEmail(); validateEmail(email); Optional student = studentRepository.findByEmail(email); - return student.map(value -> new LoginResponseDto(false, - jwtProvider.createToken(String.valueOf(value.getId()), Member.STUDENT))) + + return student.map(value -> { + addLoginCount(); + return new LoginResponseDto(false, + jwtProvider.createToken(String.valueOf(value.getId()), Member.STUDENT)); + }) .orElseGet(() -> new LoginResponseDto(true, null)); } @@ -127,4 +135,15 @@ public Manager findSuperManagerByToken(String token) { throw new ManagerNoAuthorizationException(); return manager; } + + private void addLoginCount() { + System.out.println("aaaa"); + Optional dailyInfo = dailyInfoRepository.findFirstByDate(LocalDate.now()); + if (dailyInfo.isPresent()) { + dailyInfo.get().login(); + return; + } + DailyInfo newDailyInfo = new DailyInfo(); + dailyInfoRepository.save(newDailyInfo); + } } diff --git a/src/main/java/com/server/hispath/manager/domain/DailyInfo.java b/src/main/java/com/server/hispath/manager/domain/DailyInfo.java new file mode 100644 index 0000000..0736443 --- /dev/null +++ b/src/main/java/com/server/hispath/manager/domain/DailyInfo.java @@ -0,0 +1,36 @@ +package com.server.hispath.manager.domain; + +import java.time.LocalDate; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +import com.server.hispath.common.BaseEntity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Entity +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Where(clause = "deleted = false") +@SQLDelete(sql = "UPDATE dailyInfo SET deleted = true Where id = ?") +public class DailyInfo extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + LocalDate date = LocalDate.now(); + + Long loginCnt = 1L; + + public void login(){ + loginCnt++; + } +} diff --git a/src/main/java/com/server/hispath/manager/domain/repository/DailyInfoRepository.java b/src/main/java/com/server/hispath/manager/domain/repository/DailyInfoRepository.java new file mode 100644 index 0000000..f93ef7e --- /dev/null +++ b/src/main/java/com/server/hispath/manager/domain/repository/DailyInfoRepository.java @@ -0,0 +1,12 @@ +package com.server.hispath.manager.domain.repository; + +import java.time.LocalDate; +import java.util.Optional; + +import com.server.hispath.manager.domain.DailyInfo; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface DailyInfoRepository extends JpaRepository { + Optional findFirstByDate(LocalDate date); +} From 75b559590030196105543afb375b5aa6d68aea71 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Sat, 19 Nov 2022 02:36:45 +0900 Subject: [PATCH 110/148] =?UTF-8?q?[#114]=20:=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=20=EB=8C=80=EC=8B=9C=EB=B3=B4=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84,=20=ED=95=99=EC=83=9D=20=EB=8C=80=EC=8B=9C=EB=B3=B4?= =?UTF-8?q?=EB=93=9C=20API=20=EC=88=98=EC=A0=95,=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix[#114] : 학생 대시보드 API 수정 content 추가 * fix[#114] : manager profile 추가 * feat[#114] : 관리자 대시보드 API 구현 --- .../java/com/server/hispath/docs/ApiDoc.java | 1 + .../manager/application/ManagerService.java | 18 +++++++++++++ .../manager/application/dto/ManagerCUDto.java | 3 ++- .../application/dto/ManagerDashboardDto.java | 27 +++++++++++++++++++ .../manager/application/dto/ManagerDto.java | 3 ++- .../hispath/manager/domain/Manager.java | 3 +++ .../repository/DailyInfoRepository.java | 8 ++++++ .../presentation/ManagerController.java | 10 +++++++ .../request/ManagerCURequest.java | 1 + .../response/ManagerResponse.java | 3 ++- .../application/dto/DashboardNoticeDto.java | 3 ++- .../response/NoticeDashboardResponse.java | 3 ++- 12 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/server/hispath/manager/application/dto/ManagerDashboardDto.java diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index afa362e..b6f2a06 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -83,6 +83,7 @@ public class ApiDoc { public static final String MANAGER_UPDATE = "관리자 수정"; public static final String MANAGER_APPROVE = "관리자 승인"; public static final String MANAGER_DELETE = "관리자 삭제"; + public static final String MANAGER_DASHBOARD = "관리자 대시보드 조회"; /* Department 관련 API 명세 */ public static final String DEPARTMENT_READ = "단일 학부 조회"; diff --git a/src/main/java/com/server/hispath/manager/application/ManagerService.java b/src/main/java/com/server/hispath/manager/application/ManagerService.java index b7d2264..c194ea1 100644 --- a/src/main/java/com/server/hispath/manager/application/ManagerService.java +++ b/src/main/java/com/server/hispath/manager/application/ManagerService.java @@ -1,12 +1,16 @@ package com.server.hispath.manager.application; +import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; import com.server.hispath.exception.manager.ManagerNotFoundException; import com.server.hispath.manager.application.dto.ManagerCUDto; +import com.server.hispath.manager.application.dto.ManagerDashboardDto; import com.server.hispath.manager.application.dto.ManagerDto; +import com.server.hispath.manager.domain.DailyInfo; import com.server.hispath.manager.domain.Manager; +import com.server.hispath.manager.domain.repository.DailyInfoRepository; import com.server.hispath.manager.domain.repository.ManagerRepository; import org.springframework.stereotype.Service; @@ -19,6 +23,7 @@ public class ManagerService { private final ManagerRepository managerRepository; + private final DailyInfoRepository dailyInfoRepository; @Transactional public Long create(ManagerCUDto dto) { @@ -63,4 +68,17 @@ public Long approve(Long managerId, int level) { public Manager findById(Long id) { return managerRepository.findById(id).orElseThrow(ManagerNotFoundException::new); } + + @Transactional(readOnly = true) + public ManagerDashboardDto getDashboard(Long managerId) { + Manager manager = this.findById(managerId); + List dailyInfos = dailyInfoRepository.findDailyInfoByDateBetweenOrderByDateAsc(LocalDate.now() + .minusDays(7), LocalDate.now()); + Long[] loginCounts = dailyInfos.stream() + .map(DailyInfo::getLoginCnt) + .toArray(Long[]::new); + Long totalLoginCnt = dailyInfoRepository.getTotalLoginCnt(); + + return ManagerDashboardDto.of(manager, loginCounts, totalLoginCnt); + } } diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java index e2e2192..8a70910 100644 --- a/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java +++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java @@ -12,12 +12,13 @@ public class ManagerCUDto { private String name; + private String profile; private int power; private String email; private String department; public static ManagerCUDto of(ManagerCURequest request) { - return new ManagerCUDto(request.getName(), request.getPower(), request.getEmail(), request.getDepartment()); + return new ManagerCUDto(request.getName(), request.getProfile(), request.getPower(), request.getEmail(), request.getDepartment()); } } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerDashboardDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerDashboardDto.java new file mode 100644 index 0000000..64aba69 --- /dev/null +++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerDashboardDto.java @@ -0,0 +1,27 @@ +package com.server.hispath.manager.application.dto; + +import com.server.hispath.manager.domain.Manager; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ManagerDashboardDto { + private Long id; + private String profile; + private String name; + private String department; + private boolean approved; + private String email; + private int power; + private Long[] loginCounts; + private Long totalCounts; + + public static ManagerDashboardDto of(Manager manager, Long[] loginCounts, Long totalCounts) { + return new ManagerDashboardDto(manager.getId(), manager.getProfile(), manager.getName(), manager.getDepartment(), + manager.isApproved(), manager.getEmail(), manager.getPower(), loginCounts, totalCounts); + } +} diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java index e4828f3..8bf1496 100644 --- a/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java +++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java @@ -17,13 +17,14 @@ public class ManagerDto { private Long id; private String name; private String email; + private String profile; private String department; private int power; private boolean approved; public static ManagerDto of(Manager manager) { return new ManagerDto(manager.getId(), manager.getName(), manager.getEmail(), - manager.getDepartment(), manager.getPower(), manager.isApproved()); + manager.getProfile(), manager.getDepartment(), manager.getPower(), manager.isApproved()); } diff --git a/src/main/java/com/server/hispath/manager/domain/Manager.java b/src/main/java/com/server/hispath/manager/domain/Manager.java index af3280c..b2b6cdf 100644 --- a/src/main/java/com/server/hispath/manager/domain/Manager.java +++ b/src/main/java/com/server/hispath/manager/domain/Manager.java @@ -30,6 +30,7 @@ public class Manager extends BaseEntity { private int power; private String name; private String email; + private String profile; private String department; private boolean approved; @@ -39,6 +40,7 @@ public static Manager of(ManagerCUDto dto) { .power(dto.getPower()) .name(dto.getName()) .email(dto.getEmail()) + .profile(dto.getProfile()) .department(dto.getDepartment()) .approved(false) .build(); @@ -47,6 +49,7 @@ public static Manager of(ManagerCUDto dto) { public void update(ManagerCUDto dto) { this.email = dto.getEmail(); this.name = dto.getName(); + this.profile = dto.getProfile(); this.department = dto.getDepartment(); this.power = dto.getPower(); } diff --git a/src/main/java/com/server/hispath/manager/domain/repository/DailyInfoRepository.java b/src/main/java/com/server/hispath/manager/domain/repository/DailyInfoRepository.java index f93ef7e..5c5d54e 100644 --- a/src/main/java/com/server/hispath/manager/domain/repository/DailyInfoRepository.java +++ b/src/main/java/com/server/hispath/manager/domain/repository/DailyInfoRepository.java @@ -1,12 +1,20 @@ package com.server.hispath.manager.domain.repository; import java.time.LocalDate; +import java.util.List; import java.util.Optional; import com.server.hispath.manager.domain.DailyInfo; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; public interface DailyInfoRepository extends JpaRepository { Optional findFirstByDate(LocalDate date); + + List findDailyInfoByDateBetweenOrderByDateAsc(LocalDate start, LocalDate end); + + @Query("select sum(d.loginCnt) from DailyInfo d ") + Long getTotalLoginCnt(); + } diff --git a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java index 1aa8f0c..f8de972 100644 --- a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java +++ b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java @@ -3,11 +3,14 @@ import java.util.List; import java.util.stream.Collectors; +import com.server.hispath.auth.domain.LoginManager; +import com.server.hispath.auth.domain.ManagerLogin; import com.server.hispath.auth.domain.RequiredManagerLogin; import com.server.hispath.auth.domain.RequiredSuperManagerLogin; import com.server.hispath.docs.ApiDoc; import com.server.hispath.manager.application.ManagerService; import com.server.hispath.manager.application.dto.ManagerCUDto; +import com.server.hispath.manager.application.dto.ManagerDashboardDto; import com.server.hispath.manager.presentation.request.ManagerApproveRequest; import com.server.hispath.manager.presentation.request.ManagerCURequest; import com.server.hispath.manager.presentation.response.ManagerResponse; @@ -76,4 +79,11 @@ public ResponseEntity delete(@PathVariable Long id) { Long response = managerService.delete(id); return ResponseEntity.ok(response); } + + @GetMapping("/manager/dashboard") + @ApiOperation(value = ApiDoc.MANAGER_READ) + @RequiredManagerLogin + public ResponseEntity getDashboard(@ManagerLogin LoginManager loginManager) { + return ResponseEntity.ok(managerService.getDashboard(loginManager.getId())); + } } diff --git a/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java b/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java index 8dd225f..b33ec24 100644 --- a/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java +++ b/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java @@ -10,6 +10,7 @@ public class ManagerCURequest { private String name; + private String profile; private int power; private String email; private String department; diff --git a/src/main/java/com/server/hispath/manager/presentation/response/ManagerResponse.java b/src/main/java/com/server/hispath/manager/presentation/response/ManagerResponse.java index b83d644..b967442 100644 --- a/src/main/java/com/server/hispath/manager/presentation/response/ManagerResponse.java +++ b/src/main/java/com/server/hispath/manager/presentation/response/ManagerResponse.java @@ -14,13 +14,14 @@ public class ManagerResponse { private int power; private String name; private String email; + private String profile; private String department; private boolean approved; public static ManagerResponse of(ManagerDto dto) { return new ManagerResponse(dto.getId(), dto.getPower(), dto.getName(), - dto.getEmail(), dto.getDepartment(), dto.isApproved()); + dto.getEmail(), dto.getProfile(), dto.getDepartment(), dto.isApproved()); } } diff --git a/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java b/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java index 1934e80..b21421d 100644 --- a/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java +++ b/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java @@ -14,11 +14,12 @@ public class DashboardNoticeDto { private Long id; private String title; + private String content; private LocalDate pubDate; private LocalDate expDate; private LocalDate regDate; public static DashboardNoticeDto of(Notice notice) { - return new DashboardNoticeDto(notice.getId(), notice.getTitle(), notice.getPubDate(), notice.getExpDate(), notice.getCreatedAt().toLocalDate()); + return new DashboardNoticeDto(notice.getId(), notice.getTitle(), notice.getContent(), notice.getPubDate(), notice.getExpDate(), notice.getCreatedAt().toLocalDate()); } } diff --git a/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java b/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java index 0c06b5c..ea3ad12 100644 --- a/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java +++ b/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java @@ -14,11 +14,12 @@ public class NoticeDashboardResponse { private Long noticeId; private String title; + private String content; private LocalDate pubDate; private LocalDate expDate; private LocalDate regDate; static public NoticeDashboardResponse of(DashboardNoticeDto dto) { - return new NoticeDashboardResponse(dto.getId(), dto.getTitle(), dto.getPubDate(), dto.getExpDate(), dto.getRegDate()); + return new NoticeDashboardResponse(dto.getId(), dto.getTitle(), dto.getContent(), dto.getPubDate(), dto.getExpDate(), dto.getRegDate()); } } From cd4d487dd6d6ba6053229e9fb6f2f8e65b1da433 Mon Sep 17 00:00:00 2001 From: davidpiao Date: Sun, 20 Nov 2022 21:39:55 +0900 Subject: [PATCH 111/148] =?UTF-8?q?fix:=20=ED=95=99=EB=B6=80,=20=EC=A0=84?= =?UTF-8?q?=EA=B3=B5=20Test=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/hispath/common/TestController.java | 155 +++++++++--------- .../application/ScholarshipService.java | 1 + 2 files changed, 77 insertions(+), 79 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index ddc1b19..ffdaaa5 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -316,7 +316,7 @@ private void saveManager() { managerRepository.save(Manager.builder() .name("이인혁") .email("Bruse@handong.ac.kr") - .department("ICT융합학부") + .department("ICT 융합학부") .approved(true).build()); managerRepository.save(Manager.builder() @@ -371,7 +371,7 @@ private void saveNotice() { noticeRepository.save(Notice.builder() .manager(l.get(3)) .title("2022-2 사전 학점인정 안내(타대학 교환·학점교류)") - .content("

22-2학기 타대학 교환·학점교류를 통해 전산전자공학부의 컴퓨터공학(심화), 전자공학(심화) 전공 학점으로 인정받고자 하는 학생은, 아래의 내용을 확인하시고 사전학점인정원 제출하시기 바랍니다.



1. 신청기간: ~2022.8.14.

     * 각 대학마다 수강신청기간이 다르므로, 본인 대학 수강신청기간 전에 신청 바람



2. 제출서류: 사전학점인정원, 해당 과목 강의계획서



3. 제출방법: csee@handong.edu로 온라인 제출



4. 사전학점인정 절차

  가. 학생이 학부사무실로 사전학점인정원 제출

  나. 해당 전공의 프로그램위원회에서 제출된 자료 검토하여 학점인정 여부 판단

  다. 검토완료 된 사전학점인정원을 학부사무실에서 학생 메일로 송부



5. 유의사항

  가. 각 대학마다 수강신청기간이 다르므로, 사전학점인정 승인 받은 후 수강신청 할 수 있도록 시간 여유를 두고 미리 신청 바람

  나. 본인서명 필수 /  담당교수 확인란은 비워 제출

  다. '해당전공'란은 컴퓨터공학 or 전자공학을 기입

  라. 이전 학기에 학점교류를 통해 전공 인정받은 학생의 경우 아래 내용 함께 제출

    1) 이전 교류대학명: 

    2) 인정 과목명:

    3) 총 인정학점:

  마. 사전학점인정원 승인을 받았더라도, 다른 수강 교과목과 내용이 중복되는 경우 추후 학점인정을 받지 못할 수 있음





문의 : 260-1414 / csee@handong.edu

") + .content("

22-2학기 타대학 교환·학점교류를 통해 전산전자공학부공학부의 컴퓨터공학(심화), 전자공학(심화) 전공 학점으로 인정받고자 하는 학생은, 아래의 내용을 확인하시고 사전학점인정원 제출하시기 바랍니다.



1. 신청기간: ~2022.8.14.

     * 각 대학마다 수강신청기간이 다르므로, 본인 대학 수강신청기간 전에 신청 바람



2. 제출서류: 사전학점인정원, 해당 과목 강의계획서



3. 제출방법: csee@handong.edu로 온라인 제출



4. 사전학점인정 절차

  가. 학생이 학부사무실로 사전학점인정원 제출

  나. 해당 전공의 프로그램위원회에서 제출된 자료 검토하여 학점인정 여부 판단

  다. 검토완료 된 사전학점인정원을 학부사무실에서 학생 메일로 송부



5. 유의사항

  가. 각 대학마다 수강신청기간이 다르므로, 사전학점인정 승인 받은 후 수강신청 할 수 있도록 시간 여유를 두고 미리 신청 바람

  나. 본인서명 필수 /  담당교수 확인란은 비워 제출

  다. '해당전공'란은 컴퓨터공학 or 전자공학을 기입

  라. 이전 학기에 학점교류를 통해 전공 인정받은 학생의 경우 아래 내용 함께 제출

    1) 이전 교류대학명: 

    2) 인정 과목명:

    3) 총 인정학점:

  마. 사전학점인정원 승인을 받았더라도, 다른 수강 교과목과 내용이 중복되는 경우 추후 학점인정을 받지 못할 수 있음





문의 : 260-1414 / csee@handong.edu

") .viewCnt(0) .importance(false) .pubDate(LocalDate.of(2022, Month.JUNE, 2)) @@ -381,7 +381,7 @@ private void saveNotice() { noticeRepository.save(Notice.builder() .manager(l.get(4)) .title("2022년 8월 졸업생 학위증 및 상장 교부 안내") - .content("

9/2(금) 15시까지 신청 건 우편 발송되었습니다. 

 

---------------------------------------------------------------------------

 

안녕하세요?

전산전자공학부입니다.



졸업을 진심으로 축하드립니다.\uD83C\uDF89



학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.



우편(착불 4500원 정도)으로 받고자 하는 학생은 

9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.



이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.



<유의사항>

1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.

2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.



감사합니다:D



문의) 전산전자공학부사무실 260-1414

") + .content("

9/2(금) 15시까지 신청 건 우편 발송되었습니다. 

 

---------------------------------------------------------------------------

 

안녕하세요?

전산전자공학부공학부입니다.



졸업을 진심으로 축하드립니다.\uD83C\uDF89



학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.



우편(착불 4500원 정도)으로 받고자 하는 학생은 

9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.



이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.



<유의사항>

1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.

2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.



감사합니다:D



문의) 전산전자공학부공학부사무실 260-1414

") .viewCnt(0) .importance(true) .pubDate(LocalDate.of(2022, Month.JUNE, 7)) @@ -391,7 +391,7 @@ private void saveNotice() { noticeRepository.save(Notice.builder() .manager(l.get(4)) .title("2022년 8월 졸업생 학위증 및 상장 교부 안내") - .content("

9/2(금) 15시까지 신청 건 우편 발송되었습니다. 

 

---------------------------------------------------------------------------

 

안녕하세요?

전산전자공학부입니다.



졸업을 진심으로 축하드립니다.\uD83C\uDF89



학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.



우편(착불 4500원 정도)으로 받고자 하는 학생은 

9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.



이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.



<유의사항>

1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.

2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.



감사합니다:D



문의) 전산전자공학부사무실 260-1414

") + .content("

9/2(금) 15시까지 신청 건 우편 발송되었습니다. 

 

---------------------------------------------------------------------------

 

안녕하세요?

전산전자공학부공학부입니다.



졸업을 진심으로 축하드립니다.\uD83C\uDF89



학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.



우편(착불 4500원 정도)으로 받고자 하는 학생은 

9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.



이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.



<유의사항>

1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.

2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.



감사합니다:D



문의) 전산전자공학부공학부사무실 260-1414

") .viewCnt(0) .importance(true) .pubDate(LocalDate.of(2022, Month.JUNE, 21)) @@ -401,7 +401,7 @@ private void saveNotice() { noticeRepository.save(Notice.builder() .manager(l.get(3)) .title("[BK21 인공지능 교육연구단] 2022-2 참여대학원생 등록서류 제출 및 연구장학금 신청 안내") - .content("

한동대학교 BK21 인공지능 사업단

2022학년도 2학기 참여대학원생 등록서류 제출 및 연구장학금 신청 안내

 

 

한동대학교 전산전자공학과 4단계 BK21 ‘산업혁신을 위한 AI 고급 인재교육연구단’ (BK21 인공지능사업단)에서 다음과 같이 등록 서류를 제출하여주시기 바랍니다.

 


1. 4단계 BK21 참여대학원생 기준 (다음의 조건을 모두 충족한 자)

BK21 참여교수의 지도학생 중 전일제(4대보험에 가입되어 있지 않은 학생)로 등록(연구생 등록 포함)한 석·박사과정 대학원생으로 다음 각 호에 해당하는 자

-입학한 지 2년이 지나지 않은 석사과정생

-입학한 지 4년이 지나지 않은 박사과정생 및 박사 수료생

-입학한 지 6년이 지나지 않은 석박통합과정생 및 석박통합과정 수료생

(위의 기간 기산 시 휴학 및 군복무 기간은 제외함).

 

위의 자격을 충족한 경우 ‘참여대학원생’으로 등록되어 ‘지원대학원생’ 선발 기회 등 BK21 사업의 지원을 받을 수 있음.

 

2. 지원대학원생 선발 및 연구장학금 지급

1) 참여대학원생으로 등록된 학생 중 70% 이내의 대학원생을 ‘지원대학원생’으로 선발해 연구장학금을 지급함.

2) 지원기간: 2022.09.01.~2023.02.28. (6개월 단위로 선발)

3) 선발기준: 지도교수 추천을 받은 참여대학원생 중 연구/프로젝트 성과 평가에 의해 선발

4) 역할 및 임무

- BK21 참여교수 연구실에서 논문 연구 및 산학 프로젝트를 성실히 수행 (주 40시간 이상)

- 사업단이 주관하는 각종 세미나, 포럼 등의 학술 활동에 참여

- 사업단이 요구하는 성과 자료 보고

 


3. 참여대학원생 등록서류 제출안내(등록서류는 단순참여, 장학금 지원 받는 학생 모두 제출해주세요.)

1) 첨부된 제출서류 다운 및 작성 후 BK21 사업단 사무실로 서류 제출.

2) 지도교수로부터 지원대학원생(장학금 받는 학생)으로 추천받은 대학원생은 5.제출서류 함께 제출

 

4. 서류 제출 기간: 2022년 8월 29일(월) 13:00 - 9월 7일(수) 17:00 (제출기한 엄수)




5. 제출서류

- 연구자등록번호 발급 방법

: KRI(한국연구업적통합정보시스템 http://www.kri.go.kr)에 접속 회원가입→연구자등록번호 발급 

  (가입 시 소속을 반드시 ‘한동대학교’로 가입) 



1) 재학증명서 1부. 연구생등록자의 경우 연구생등록증 1부(2022년 9월 1일자 기준으로 제출)

2) 개인정보 수집 이용 제공 동의서 1부. (BK사업에 처음 참여하는 학생만 제출)

3) 참여인력 서약서 1부. 

4) 참여대학원생 확약서 1부.

5) BK21 연구장학금 신청서 1부. (지원대학원생-BK장학금 받는 학생만 제출)

6) 전산전자공학과 학기 보고서 1부.

7) 재학증명서 1부.(9월 1일 기준)

 

8) 연구재단 필수 제출 서류 '4대 보험 가입 증명서' 1부. (22.10.1일 기준일로하여 메일로 회신)

(**10월1일 기준으로 출력 후 제출 바랍니다. 9월에는 제출하지 않아도 됩니다!)

- 출력 방법: 4대 사회보험 포털서비스(http://www.4insure.or.kr) 로그인(회원가입, 공인인증서 필요) → 상단 메뉴 증명서발급(가입내역확인) 클릭 후 출력

 

9) 대학원 성적표 1부. (신입생은 제출X)

 

<한국연구재단 필수 수강!!-참여기간 중 1회 수강 후 수료증 제출해야함, 교육 미이수자 및  22-2학기 신입생만 수강하면 됩니다.>

10) 온라인 교육 수료증 (http://alpha-campus.kr/) 에 접속하여 로그인 후 상단 메뉴의 '탐색'->'온라인교육' -> '건강한 연구환경 조성을 위한 인권침해예방교육'클릭 ->'수강신청' 클릭 후 팝업창에서 수강신청 정보 확인 및 '신청완료'-> '학습'-> '학습중과정'-> '건강한 연구환경 조성을 위한 인권침해예방교육' 순서대로 클릭 후 '학습하기'

컨텐츠 수강 후 ‘MY'-> '학습이력'클릭 후 수료증 발급 및 보관) 

*수료증은 메일로 회신부탁합니다. 

 

11) 통장사본 및 신분증 사본 각 1부.

 

※ 외국인 참여대학원생의 경우 외국인 등록증 앞, 뒤 사본(D-2비자 여부 및 만료기한 확인) 제출.

※ 기존 참여대학원생이 지원할 경우: 2)개인정보 수집 이용 제공 동의서, 10)온라인 교육 수료증 제출 생략.

 

6. 서류 제출 및 문의처

1) BK21사업단 사무실: 뉴턴홀 309호 전산전자공학부 사무실 담당자 고라경(Tel: 260-3150)

2) 신청 시 모든 서류는 위 제출서류 순서대로 정리하여 원본 제출 바랍니다.

 

7. 유의사항: 제출된 서류는 반환하지 않으며, 허위사실 기재 시 선발을 취소함.

") + .content("

한동대학교 BK21 인공지능 사업단

2022학년도 2학기 참여대학원생 등록서류 제출 및 연구장학금 신청 안내

 

 

한동대학교 전산전자공학부공학과 4단계 BK21 ‘산업혁신을 위한 AI 고급 인재교육연구단’ (BK21 인공지능사업단)에서 다음과 같이 등록 서류를 제출하여주시기 바랍니다.

 


1. 4단계 BK21 참여대학원생 기준 (다음의 조건을 모두 충족한 자)

BK21 참여교수의 지도학생 중 전일제(4대보험에 가입되어 있지 않은 학생)로 등록(연구생 등록 포함)한 석·박사과정 대학원생으로 다음 각 호에 해당하는 자

-입학한 지 2년이 지나지 않은 석사과정생

-입학한 지 4년이 지나지 않은 박사과정생 및 박사 수료생

-입학한 지 6년이 지나지 않은 석박통합과정생 및 석박통합과정 수료생

(위의 기간 기산 시 휴학 및 군복무 기간은 제외함).

 

위의 자격을 충족한 경우 ‘참여대학원생’으로 등록되어 ‘지원대학원생’ 선발 기회 등 BK21 사업의 지원을 받을 수 있음.

 

2. 지원대학원생 선발 및 연구장학금 지급

1) 참여대학원생으로 등록된 학생 중 70% 이내의 대학원생을 ‘지원대학원생’으로 선발해 연구장학금을 지급함.

2) 지원기간: 2022.09.01.~2023.02.28. (6개월 단위로 선발)

3) 선발기준: 지도교수 추천을 받은 참여대학원생 중 연구/프로젝트 성과 평가에 의해 선발

4) 역할 및 임무

- BK21 참여교수 연구실에서 논문 연구 및 산학 프로젝트를 성실히 수행 (주 40시간 이상)

- 사업단이 주관하는 각종 세미나, 포럼 등의 학술 활동에 참여

- 사업단이 요구하는 성과 자료 보고

 


3. 참여대학원생 등록서류 제출안내(등록서류는 단순참여, 장학금 지원 받는 학생 모두 제출해주세요.)

1) 첨부된 제출서류 다운 및 작성 후 BK21 사업단 사무실로 서류 제출.

2) 지도교수로부터 지원대학원생(장학금 받는 학생)으로 추천받은 대학원생은 5.제출서류 함께 제출

 

4. 서류 제출 기간: 2022년 8월 29일(월) 13:00 - 9월 7일(수) 17:00 (제출기한 엄수)




5. 제출서류

- 연구자등록번호 발급 방법

: KRI(한국연구업적통합정보시스템 http://www.kri.go.kr)에 접속 회원가입→연구자등록번호 발급 

  (가입 시 소속을 반드시 ‘한동대학교’로 가입) 



1) 재학증명서 1부. 연구생등록자의 경우 연구생등록증 1부(2022년 9월 1일자 기준으로 제출)

2) 개인정보 수집 이용 제공 동의서 1부. (BK사업에 처음 참여하는 학생만 제출)

3) 참여인력 서약서 1부. 

4) 참여대학원생 확약서 1부.

5) BK21 연구장학금 신청서 1부. (지원대학원생-BK장학금 받는 학생만 제출)

6) 전산전자공학부공학과 학기 보고서 1부.

7) 재학증명서 1부.(9월 1일 기준)

 

8) 연구재단 필수 제출 서류 '4대 보험 가입 증명서' 1부. (22.10.1일 기준일로하여 메일로 회신)

(**10월1일 기준으로 출력 후 제출 바랍니다. 9월에는 제출하지 않아도 됩니다!)

- 출력 방법: 4대 사회보험 포털서비스(http://www.4insure.or.kr) 로그인(회원가입, 공인인증서 필요) → 상단 메뉴 증명서발급(가입내역확인) 클릭 후 출력

 

9) 대학원 성적표 1부. (신입생은 제출X)

 

<한국연구재단 필수 수강!!-참여기간 중 1회 수강 후 수료증 제출해야함, 교육 미이수자 및  22-2학기 신입생만 수강하면 됩니다.>

10) 온라인 교육 수료증 (http://alpha-campus.kr/) 에 접속하여 로그인 후 상단 메뉴의 '탐색'->'온라인교육' -> '건강한 연구환경 조성을 위한 인권침해예방교육'클릭 ->'수강신청' 클릭 후 팝업창에서 수강신청 정보 확인 및 '신청완료'-> '학습'-> '학습중과정'-> '건강한 연구환경 조성을 위한 인권침해예방교육' 순서대로 클릭 후 '학습하기'

컨텐츠 수강 후 ‘MY'-> '학습이력'클릭 후 수료증 발급 및 보관) 

*수료증은 메일로 회신부탁합니다. 

 

11) 통장사본 및 신분증 사본 각 1부.

 

※ 외국인 참여대학원생의 경우 외국인 등록증 앞, 뒤 사본(D-2비자 여부 및 만료기한 확인) 제출.

※ 기존 참여대학원생이 지원할 경우: 2)개인정보 수집 이용 제공 동의서, 10)온라인 교육 수료증 제출 생략.

 

6. 서류 제출 및 문의처

1) BK21사업단 사무실: 뉴턴홀 309호 전산전자공학부공학부 사무실 담당자 고라경(Tel: 260-3150)

2) 신청 시 모든 서류는 위 제출서류 순서대로 정리하여 원본 제출 바랍니다.

 

7. 유의사항: 제출된 서류는 반환하지 않으며, 허위사실 기재 시 선발을 취소함.

") .viewCnt(0) .importance(false) .pubDate(LocalDate.of(2022, Month.JULY, 1)) @@ -419,8 +419,8 @@ private void saveNotice() { .build()); noticeRepository.save(Notice.builder() .manager(l.get(1)) - .title("[전산전자공학부] 2022 CSEE Lab Week에 초대합니다.") - .content("

안녕하세요? \"\uD83D\uDCBB\"

전산전자공학부, 일반대학원 전산전자공학과가 9주차 10/24(월)~10/28(금)에 각 연구실에 대해 알아가고 다양한 연구의 내용을 공유하는 시간을 가지려고 합니다. 



저희 전산전자공학부, 일반대학원 전산전자공학과에서 어떤 주제의 연구들을 진행하고 있는지 Lab설명회, 포스터세션을 통해 이야기를 듣고 싶은 학생들의 많은 참여 바랍니다. 



행사에 참석하면 입시관련된 정보 또한 얻을 수 있으니 AI를 포함한 ICT관련 분야 진학에 관심있는 모든 학부생들의 참여를 환영합니다. 



\"d24;\"온라인 Lab 멘토링 실시 (기간: 10/24(월)~10/28(금))

(아래 링크접속 후 각 Lab의 오픈카톡방을 통한 자유로운 상담 가능)


https://docs.google.com/document/d/1vPNIac3vfuBxzr3-IsqVqEAFwJtA-6dXiE_RvKhXJHo/edit#

 

 

\"d24;\" Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성

제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.

https://forms.gle/a8XWyqXcTec8vdwq5

 

 

\"d24;\" CSEE Lab Week 행사 참석 희망자(만찬 참여 포함)는 아래 설문지 필수 작성


https://docs.google.com/forms/d/1wkUWbYgcPFFTfrI-M3aOonQYRd_Oq6VHugJx6rVkuRE/edit?pli=1



**10/28(금)** 포스터세션이 종료되고 만찬(오후 5시 예정)이 있을 예정입니다.

만찬은 인원수 제한으로 선착순으로 신청을 받습니다.






\"\uD83C\uDF81\"event\"\uD83C\uDF81\" CSEE Lab Week 참가자 커피쿠폰 증정 

 

 

* 문의: 전산전자공학과 고라경 선생님 (전화: 054-260-3150)

") + .title("[전산전자공학부공학부] 2022 CSEE Lab Week에 초대합니다.") + .content("

안녕하세요? \"\uD83D\uDCBB\"

전산전자공학부공학부, 일반대학원 전산전자공학부공학과가 9주차 10/24(월)~10/28(금)에 각 연구실에 대해 알아가고 다양한 연구의 내용을 공유하는 시간을 가지려고 합니다. 



저희 전산전자공학부공학부, 일반대학원 전산전자공학부공학과에서 어떤 주제의 연구들을 진행하고 있는지 Lab설명회, 포스터세션을 통해 이야기를 듣고 싶은 학생들의 많은 참여 바랍니다. 



행사에 참석하면 입시관련된 정보 또한 얻을 수 있으니 AI를 포함한 ICT 관련 분야 진학에 관심있는 모든 학부생들의 참여를 환영합니다. 



\"d24;\"온라인 Lab 멘토링 실시 (기간: 10/24(월)~10/28(금))

(아래 링크접속 후 각 Lab의 오픈카톡방을 통한 자유로운 상담 가능)


https://docs.google.com/document/d/1vPNIac3vfuBxzr3-IsqVqEAFwJtA-6dXiE_RvKhXJHo/edit#

 

 

\"d24;\" Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성

제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.

https://forms.gle/a8XWyqXcTec8vdwq5

 

 

\"d24;\" CSEE Lab Week 행사 참석 희망자(만찬 참여 포함)는 아래 설문지 필수 작성


https://docs.google.com/forms/d/1wkUWbYgcPFFTfrI-M3aOonQYRd_Oq6VHugJx6rVkuRE/edit?pli=1



**10/28(금)** 포스터세션이 종료되고 만찬(오후 5시 예정)이 있을 예정입니다.

만찬은 인원수 제한으로 선착순으로 신청을 받습니다.






\"\uD83C\uDF81\"event\"\uD83C\uDF81\" CSEE Lab Week 참가자 커피쿠폰 증정 

 

 

* 문의: 전산전자공학부공학과 고라경 선생님 (전화: 054-260-3150)

") .viewCnt(0) .importance(true) .pubDate(LocalDate.of(2022, Month.AUGUST, 5)) @@ -502,7 +502,7 @@ private void saveNotice() { noticeRepository.save(Notice.builder() .manager(l.get(0)) .title("[CSEE Lab Week] Lab 토크쇼 관련 사전 질문") - .content("

안녕하세요. 컴퓨터 공학 전공 주임 안민규 교수입니다.

 

이전 글에 공지된 것처럼 다음 주 9주차에는 전산전자공학부/전산전자공학과가 CSEE Lab Week가 진행됩니다.

관련 글> https://hisnet.handong.edu/myboard/read.php?id=35135&Board=B0029

 

연구실에 관심이 있거나, 2023-1학기 공학프로젝트 기획 수강을 계획하는 학생들에게는 큰 도움이 될 것 같습니다.

 

 

각 연구실에 대하여 궁금한 점은 9주차 동안 진행되는 Lab 멘토링을 통해 문의하고 답변을 받기 바랍니다.

또한, 목요일 18:30에는 CSEE 연구실, 연구실 생활, 졸업 프로젝트, 진로 등에 관하여 이야기를 교수님들과 나눌 수 있는 자리를 마련하였으니 많은 학생들이 참여하여 정보를 얻는 시간이 되길 빕니다.

 

 

관련하여 현재 사전 질문을 받고 있습니다. 아래의 링크를 통하여 묻고 싶은 사항을 남겨주시기 바랍니다.

 

 

\"d24;\" Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성

제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.

https://forms.gle/a8XWyqXcTec8vdwq5

 

 

 

 

안민규 교수.

") + .content("

안녕하세요. 컴퓨터 공학 전공 주임 안민규 교수입니다.

 

이전 글에 공지된 것처럼 다음 주 9주차에는 전산전자공학부공학부/전산전자공학부공학과가 CSEE Lab Week가 진행됩니다.

관련 글> https://hisnet.handong.edu/myboard/read.php?id=35135&Board=B0029

 

연구실에 관심이 있거나, 2023-1학기 공학프로젝트 기획 수강을 계획하는 학생들에게는 큰 도움이 될 것 같습니다.

 

 

각 연구실에 대하여 궁금한 점은 9주차 동안 진행되는 Lab 멘토링을 통해 문의하고 답변을 받기 바랍니다.

또한, 목요일 18:30에는 CSEE 연구실, 연구실 생활, 졸업 프로젝트, 진로 등에 관하여 이야기를 교수님들과 나눌 수 있는 자리를 마련하였으니 많은 학생들이 참여하여 정보를 얻는 시간이 되길 빕니다.

 

 

관련하여 현재 사전 질문을 받고 있습니다. 아래의 링크를 통하여 묻고 싶은 사항을 남겨주시기 바랍니다.

 

 

\"d24;\" Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성

제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.

https://forms.gle/a8XWyqXcTec8vdwq5

 

 

 

 

안민규 교수.

") .viewCnt(0) .importance(true) .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2)) @@ -515,7 +515,7 @@ private void saveStudent() { studentRepository.save(Student.builder() .name("박성진") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("전산전자공학부")) .studentNum("21700266") .semester(8) .major1(majorRepository.findByName("컴퓨터공학심화전공")) @@ -530,7 +530,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("안병웅") - .department(departementRepository.findByName("생명과학")) + .department(departementRepository.findByName("생명과학부")) .studentNum("21600000") .semester(6) .major1(majorRepository.findByName("생명과학전공")) @@ -545,11 +545,11 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("홍성헌") - .department(departementRepository.findByName("커뮤니케이션")) + .department(departementRepository.findByName("커뮤니케이션학부")) .studentNum("21800929") .semester(8) .major1(majorRepository.findByName("공연영상학전공")) - .major2(majorRepository.findByName("언로정보학전공")) + .major2(majorRepository.findByName("언론정보학전공")) .phone("010-1623-3322") .email("hong@handong.ac.kr") .profile("profile.url") @@ -560,7 +560,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("이인혁") - .department(departementRepository.findByName("기계제어")) + .department(departementRepository.findByName("기계제어공학부")) .studentNum("21700032") .semester(5) .major1(majorRepository.findByName("전자제어공학전공")) @@ -575,7 +575,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("정석민") - .department(departementRepository.findByName("콘텐츠융합디자인")) + .department(departementRepository.findByName("콘텐츠융합디자인학부")) .studentNum("22000432") .semester(3) .major1(majorRepository.findByName("시각디자인전공")) @@ -605,7 +605,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("김한동") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("전산전자공학부")) .studentNum("22200000") .semester(5) .major1(majorRepository.findByName("컴퓨터공학전공")) @@ -620,7 +620,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("박한동") - .department(departementRepository.findByName("국제어문")) + .department(departementRepository.findByName("국제어문학부")) .studentNum("22200001") .semester(3) .major1(majorRepository.findByName("국제지역학전공")) @@ -635,7 +635,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("이한동") - .department(departementRepository.findByName("경영경제")) + .department(departementRepository.findByName("경영경제학부")) .studentNum("22200002") .semester(5) .major1(majorRepository.findByName("경영학전공")) @@ -665,7 +665,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("우한동") - .department(departementRepository.findByName("커뮤니케이션")) + .department(departementRepository.findByName("커뮤니케이션학부")) .studentNum("22200004") .semester(6) .major1(majorRepository.findByName("공연영상학전공")) @@ -680,7 +680,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("위한동") - .department(departementRepository.findByName("상담복지")) + .department(departementRepository.findByName("상담심리사회복지학부")) .studentNum("22200005") .semester(6) .major1(majorRepository.findByName("사회복지학전공")) @@ -695,7 +695,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("하한동") - .department(departementRepository.findByName("공간환경시스템")) + .department(departementRepository.findByName("공간환경시스템공학부")) .studentNum("22200006") .semester(8) .major1(majorRepository.findByName("도시환경공학전공")) @@ -710,7 +710,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("마한동") - .department(departementRepository.findByName("콘텐츠융합디자인")) + .department(departementRepository.findByName("콘텐츠융합디자인학부")) .studentNum("22200007") .semester(4) .major1(majorRepository.findByName("컴퓨터공학전공")) @@ -725,7 +725,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("유한동") - .department(departementRepository.findByName("기계제어")) + .department(departementRepository.findByName("기계제어공학부")) .studentNum("22200008") .semester(6) .major1(majorRepository.findByName("기계공학전공")) @@ -740,7 +740,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("진한동") - .department(departementRepository.findByName("ICT창업학부")) + .department(departementRepository.findByName("ICT 창업학부")) .studentNum("22200009") .semester(7) .major1(majorRepository.findByName("ICT 융합전공")) @@ -755,7 +755,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("김건휘") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("전산전자공학부")) .studentNum("21700234") .semester(2) .major1(majorRepository.findByName("컴퓨터공학전공")) @@ -770,7 +770,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("이도경") - .department(departementRepository.findByName("국제어문")) + .department(departementRepository.findByName("국제어문학부")) .studentNum("21200012") .semester(9) .major1(majorRepository.findByName("국제지역학전공")) @@ -785,7 +785,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("정민수") - .department(departementRepository.findByName("경영경제")) + .department(departementRepository.findByName("경영경제학부")) .studentNum("22200032") .semester(5) .major1(majorRepository.findByName("경영학전공")) @@ -815,7 +815,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("김빛나리") - .department(departementRepository.findByName("커뮤니케이션")) + .department(departementRepository.findByName("커뮤니케이션학부")) .studentNum("22200023") .semester(3) .major1(majorRepository.findByName("공연영상학전공")) @@ -830,7 +830,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("김혜린") - .department(departementRepository.findByName("상담복지")) + .department(departementRepository.findByName("상담심리사회복지학부")) .studentNum("21900021") .semester(4) .major1(majorRepository.findByName("사회복지학전공")) @@ -845,7 +845,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("이소희") - .department(departementRepository.findByName("공간환경시스템")) + .department(departementRepository.findByName("공간환경시스템공학부")) .studentNum("21800002") .semester(9) .major1(majorRepository.findByName("도시환경공학전공")) @@ -860,7 +860,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("이소연") - .department(departementRepository.findByName("콘텐츠융합디자인")) + .department(departementRepository.findByName("콘텐츠융합디자인학부")) .studentNum("21400025") .semester(2) .major1(majorRepository.findByName("컴퓨터공학전공")) @@ -875,7 +875,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("이동영") - .department(departementRepository.findByName("기계제어")) + .department(departementRepository.findByName("기계제어공학부")) .studentNum("21100234") .semester(10) .major1(majorRepository.findByName("기계공학전공")) @@ -890,7 +890,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("이연진") - .department(departementRepository.findByName("ICT창업학부")) + .department(departementRepository.findByName("ICT 창업학부")) .studentNum("21800012") .semester(9) .major1(majorRepository.findByName("ICT 융합전공")) @@ -905,7 +905,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("김시온") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("전산전자공학부")) .studentNum("22100032") .semester(2) .major1(majorRepository.findByName("컴퓨터공학전공")) @@ -920,7 +920,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("황유민") - .department(departementRepository.findByName("국제어문")) + .department(departementRepository.findByName("국제어문학부")) .studentNum("21600432") .semester(1) .major1(majorRepository.findByName("국제지역학전공")) @@ -935,7 +935,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("엄서영") - .department(departementRepository.findByName("경영경제")) + .department(departementRepository.findByName("경영경제학부")) .studentNum("22000231") .semester(5) .major1(majorRepository.findByName("경영학전공")) @@ -965,7 +965,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("천그루") - .department(departementRepository.findByName("커뮤니케이션")) + .department(departementRepository.findByName("커뮤니케이션학부")) .studentNum("22200026") .semester(3) .major1(majorRepository.findByName("공연영상학전공")) @@ -980,7 +980,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("이하민") - .department(departementRepository.findByName("상담복지")) + .department(departementRepository.findByName("상담심리사회복지학부")) .studentNum("21910032") .semester(4) .major1(majorRepository.findByName("사회복지학전공")) @@ -995,9 +995,9 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("박관희") - .department(departementRepository.findByName("공간환경시스템")) + .department(departementRepository.findByName("공간환경시스템공학부")) .studentNum("21800232") - .semester(9) + .semester(9) .major1(majorRepository.findByName("도시환경공학전공")) .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-3221-6365") @@ -1010,7 +1010,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("현요섭") - .department(departementRepository.findByName("콘텐츠융합디자인")) + .department(departementRepository.findByName("콘텐츠융합디자인학부")) .studentNum("21400325") .semester(2) .major1(majorRepository.findByName("컴퓨터공학전공")) @@ -1025,7 +1025,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("이찬호") - .department(departementRepository.findByName("기계제어")) + .department(departementRepository.findByName("기계제어공학부")) .studentNum("21100734") .semester(10) .major1(majorRepository.findByName("기계공학전공")) @@ -1040,7 +1040,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("아무개") - .department(departementRepository.findByName("ICT창업학부")) + .department(departementRepository.findByName("ICT 창업학부")) .studentNum("22200012") .semester(9) .major1(majorRepository.findByName("ICT 융합전공")) @@ -1055,7 +1055,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("김요나") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("전산전자공학부")) .studentNum("21100032") .semester(2) .major1(majorRepository.findByName("컴퓨터공학전공")) @@ -1070,7 +1070,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("박도마") - .department(departementRepository.findByName("국제어문")) + .department(departementRepository.findByName("국제어문학부")) .studentNum("21900432") .semester(1) .major1(majorRepository.findByName("국제지역학전공")) @@ -1085,7 +1085,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("이배드로") - .department(departementRepository.findByName("경영경제")) + .department(departementRepository.findByName("경영경제학부")) .studentNum("22000331") .semester(5) .major1(majorRepository.findByName("경영학전공")) @@ -1115,7 +1115,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("기운찬") - .department(departementRepository.findByName("커뮤니케이션")) + .department(departementRepository.findByName("커뮤니케이션학부")) .studentNum("22100027") .semester(3) .major1(majorRepository.findByName("공연영상학전공")) @@ -1130,7 +1130,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("곤잘레스") - .department(departementRepository.findByName("상담복지")) + .department(departementRepository.findByName("상담심리사회복지학부")) .studentNum("21900112") .semester(4) .major1(majorRepository.findByName("사회복지학전공")) @@ -1145,7 +1145,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("다비드") - .department(departementRepository.findByName("공간환경시스템")) + .department(departementRepository.findByName("공간환경시스템공학부")) .studentNum("21800332") .semester(9) .major1(majorRepository.findByName("도시환경공학전공")) @@ -1160,7 +1160,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("도베르만") - .department(departementRepository.findByName("콘텐츠융합디자인")) + .department(departementRepository.findByName("콘텐츠융합디자인학부")) .studentNum("21400425") .semester(2) .major1(majorRepository.findByName("컴퓨터공학전공")) @@ -1175,7 +1175,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("진시황") - .department(departementRepository.findByName("기계제어")) + .department(departementRepository.findByName("기계제어공학부")) .studentNum("21100714") .semester(10) .major1(majorRepository.findByName("기계공학전공")) @@ -1190,7 +1190,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("황유비") - .department(departementRepository.findByName("ICT창업학부")) + .department(departementRepository.findByName("ICT 창업학부")) .studentNum("21900012") .semester(9) .major1(majorRepository.findByName("ICT 융합전공")) @@ -1206,7 +1206,7 @@ private void saveStudent() { studentRepository.save(Student.builder() .name("우요셉") - .department(departementRepository.findByName("전산전자")) + .department(departementRepository.findByName("전산전자공학부")) .studentNum("21900032") .semester(2) .major1(majorRepository.findByName("컴퓨터공학전공")) @@ -1221,7 +1221,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("홍아담") - .department(departementRepository.findByName("국제어문")) + .department(departementRepository.findByName("국제어문학부")) .studentNum("21901132") .semester(1) .major1(majorRepository.findByName("국제지역학전공")) @@ -1236,7 +1236,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("김이브") - .department(departementRepository.findByName("경영경제")) + .department(departementRepository.findByName("경영경제학부")) .studentNum("22000131") .semester(5) .major1(majorRepository.findByName("경영학전공")) @@ -1266,7 +1266,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("기윤호") - .department(departementRepository.findByName("커뮤니케이션")) + .department(departementRepository.findByName("커뮤니케이션학부")) .studentNum("22100088") .semester(3) .major1(majorRepository.findByName("공연영상학전공")) @@ -1281,7 +1281,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("김영찬") - .department(departementRepository.findByName("상담복지")) + .department(departementRepository.findByName("상담심리사회복지학부")) .studentNum("21900232") .semester(4) .major1(majorRepository.findByName("사회복지학전공")) @@ -1296,7 +1296,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("김영헌") - .department(departementRepository.findByName("공간환경시스템")) + .department(departementRepository.findByName("공간환경시스템공학부")) .studentNum("21810232") .semester(9) .major1(majorRepository.findByName("도시환경공학전공")) @@ -1311,7 +1311,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("김하은") - .department(departementRepository.findByName("콘텐츠융합디자인")) + .department(departementRepository.findByName("콘텐츠융합디자인학부")) .studentNum("21400825") .semester(2) .major1(majorRepository.findByName("컴퓨터공학전공")) @@ -1326,7 +1326,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("장유진") - .department(departementRepository.findByName("기계제어")) + .department(departementRepository.findByName("기계제어공학부")) .studentNum("21100114") .semester(10) .major1(majorRepository.findByName("기계공학전공")) @@ -1341,7 +1341,7 @@ private void saveStudent() { .build()); studentRepository.save(Student.builder() .name("정수산나") - .department(departementRepository.findByName("ICT창업학부")) + .department(departementRepository.findByName("ICT 창업학부")) .studentNum("21900312") .semester(9) .major1(majorRepository.findByName("ICT 융합전공")) @@ -1384,42 +1384,41 @@ private void saveCategory() { private void saveDepartment() { departementRepository.save(Department.builder() - .name("전산전자") + .name("전산전자공학부") .build()); departementRepository.save(Department.builder() - .name("국제어문") + .name("국제어문학부") .build()); departementRepository.save(Department.builder() - .name("경영경제") + .name("경영경제학부") .build()); departementRepository.save(Department.builder() .name("법학부") .build()); departementRepository.save(Department.builder() - .name("커뮤니케이션") + .name("커뮤니케이션학부") .build()); departementRepository.save(Department.builder() - .name("상담복지") + .name("상담심리사회복지학부") .build()); departementRepository.save(Department.builder() - .name("공간환경시스템") + .name("공간환경시스템공학부") .build()); departementRepository.save(Department.builder() - .name("콘텐츠융합디자인") + .name("콘텐츠융합디자인학부") .build()); departementRepository.save(Department.builder() - .name("기계제어") + .name("기계제어공학부") .build()); departementRepository.save(Department.builder() - .name("ICT창업학부") + .name("ICT 창업학부") .build()); departementRepository.save(Department.builder() - .name("ICT융합학부") + .name("생명과학부") .build()); departementRepository.save(Department.builder() - .name("생명과학") + .name("글로벌리더쉽학부") .build()); - } @@ -1973,7 +1972,7 @@ private void saveMajor() { majorRepository.save(Major.builder().name("도시환경공학전공").build()); majorRepository.save(Major.builder().name("기계공학전공").build()); majorRepository.save(Major.builder().name("전자제어공학전공").build()); - majorRepository.save(Major.builder().name("생명과학전공").build()); + majorRepository.save(Major.builder().name("부전공").build()); majorRepository.save(Major.builder().name("글로벌융합전공").build()); majorRepository.save(Major.builder().name("수학통계전공").build()); majorRepository.save(Major.builder().name("학생설계융합전공").build()); @@ -1985,9 +1984,9 @@ private void saveMajor() { majorRepository.save(Major.builder().name("전자공학심화전공").build()); majorRepository.save(Major.builder().name("Information Technology").build()); majorRepository.save(Major.builder().name("ICT 융합전공").build()); - majorRepository.save(Major.builder().name("AI Convergence & Entrepreneurship").build()); - majorRepository.save(Major.builder().name("Global Entrepreneurship").build()); - majorRepository.save(Major.builder().name("AI 융합").build()); + majorRepository.save(Major.builder().name("AI Convergence & Entrepreneurship 전공").build()); + majorRepository.save(Major.builder().name("Global Entrepreneurship 전공").build()); + majorRepository.save(Major.builder().name("AI 융합 전공").build()); majorRepository.save(Major.builder().name("데이터 사이언스 전공").build()); majorRepository.save(Major.builder().name("경영학전공").build()); majorRepository.save(Major.builder().name("경제학전공").build()); @@ -1999,9 +1998,7 @@ private void saveMajor() { majorRepository.save(Major.builder().name("상담심리학전공").build()); majorRepository.save(Major.builder().name("사회복지학전공").build()); majorRepository.save(Major.builder().name("공연영상학전공").build()); - majorRepository.save(Major.builder().name("언로정보학전공").build()); - majorRepository.save(Major.builder().name("글로벌융합전공").build()); - majorRepository.save(Major.builder().name("학생설계융합전공").build()); + majorRepository.save(Major.builder().name("언론정보학전공").build()); majorRepository.save(Major.builder().name("글로벌한국학전공").build()); } } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index a18b53b..1d1ec27 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -177,6 +177,7 @@ public List getChartTimelines(Long studentId) { public List getChartWeightDistribution(String semester) { List scholarships = scholarshipRepository.findAllBySemesterAndApprovedTrue(semester); Long[] chartWeightDistribute = new Long[6]; + Arrays.fill(chartWeightDistribute, 0L); scholarships.forEach(scholarship -> { if (scholarship.getTotalMileage() < 20) chartWeightDistribute[0]++; From 30fa83aaf3b625449144bcb2e008cd86ace592e2 Mon Sep 17 00:00:00 2001 From: davidpiao Date: Sun, 20 Nov 2022 21:53:47 +0900 Subject: [PATCH 112/148] =?UTF-8?q?fix:=20readme,=20resume=20=EA=B8=B8?= =?UTF-8?q?=EC=9D=B4=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/server/hispath/student/domain/Participant.java | 1 + src/main/java/com/server/hispath/student/domain/Student.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/com/server/hispath/student/domain/Participant.java b/src/main/java/com/server/hispath/student/domain/Participant.java index 01130ec..fbdc6e6 100644 --- a/src/main/java/com/server/hispath/student/domain/Participant.java +++ b/src/main/java/com/server/hispath/student/domain/Participant.java @@ -32,6 +32,7 @@ public class Participant extends BaseEntity { @Enumerated(EnumType.STRING) private Section section; + @Column(length = 5555) String data; public Participant(Student student, Activity activity, Section section) { diff --git a/src/main/java/com/server/hispath/student/domain/Student.java b/src/main/java/com/server/hispath/student/domain/Student.java index 18ff873..5cfe674 100644 --- a/src/main/java/com/server/hispath/student/domain/Student.java +++ b/src/main/java/com/server/hispath/student/domain/Student.java @@ -61,6 +61,7 @@ public class Student extends BaseEntity { private LocalDateTime lastLoginDate; + @Column(length = 5555) private String readme; @ManyToOne(fetch = FetchType.LAZY) From dca629fcba3f86dd7148d585e65ef9f92d17538f Mon Sep 17 00:00:00 2001 From: gomster Date: Sun, 20 Nov 2022 23:22:40 +0900 Subject: [PATCH 113/148] =?UTF-8?q?test=20:=20test=20Controller=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/hispath/common/TestController.java | 88 +++++++++++-------- 1 file changed, 49 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index ffdaaa5..07042b3 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -158,37 +158,46 @@ public ResponseEntity initScholarship() { private void saveScholarship() { List students = studentRepository.findAll(); - List studentIds2022_2 = students.stream() - .map(Student::getId) - .collect(Collectors.toList()); - Collections.shuffle(studentIds2022_2); - int num2022_2 = getRandomNum(students.size() - 10, students.size()); - studentIds2022_2.subList(0, num2022_2) - .forEach(id -> { - scholarshipService.create(id, "2022-2"); - }); - - - List studentIds2022_1 = students.stream() - .map(Student::getId) - .collect(Collectors.toList()); - Collections.shuffle(studentIds2022_1); - int num2022_1 = getRandomNum(students.size() - 10, students.size()); - studentIds2022_1.subList(0, num2022_1) - .forEach(id -> { - scholarshipService.create(id, "2022-1"); - }); - - - List studentIds2021_2 = students.stream() - .map(Student::getId) - .collect(Collectors.toList()); - Collections.shuffle(studentIds2021_2); - int num2021_2 = getRandomNum(students.size() - 10, students.size()); - studentIds2021_2.subList(0, num2021_2) - .forEach(id -> { - scholarshipService.create(id, "2021-2"); - }); + List studentIds = students.stream() + .map(Student::getId) + .collect(Collectors.toList()); + + studentIds.forEach(id -> scholarshipService.create(id, "2022-2")); + studentIds.forEach(id -> scholarshipService.create(id, "2022-1")); + studentIds.forEach(id -> scholarshipService.create(id, "2019-2")); + + + // List studentIds2022_2 = students.stream() + // .map(Student::getId) + // .collect(Collectors.toList()); + // Collections.shuffle(studentIds2022_2); + // int num2022_2 = getRandomNum(students.size() - 10, students.size()); + // studentIds2022_2.subList(0, num2022_2) + // .forEach(id -> { + // scholarshipService.create(id, "2022-2"); + // }); + // + // + // List studentIds2022_1 = students.stream() + // .map(Student::getId) + // .collect(Collectors.toList()); + // Collections.shuffle(studentIds2022_1); + // int num2022_1 = getRandomNum(students.size() - 10, students.size()); + // studentIds2022_1.subList(0, num2022_1) + // .forEach(id -> { + // scholarshipService.create(id, "2022-1"); + // }); + // + // + // List studentIds2021_2 = students.stream() + // .map(Student::getId) + // .collect(Collectors.toList()); + // Collections.shuffle(studentIds2021_2); + // int num2021_2 = getRandomNum(students.size() - 10, students.size()); + // studentIds2021_2.subList(0, num2021_2) + // .forEach(id -> { + // scholarshipService.create(id, "2021-2"); + // }); } @@ -239,15 +248,16 @@ public void saveParticipant() { activities.forEach(activity -> { - int num = getRandomNum(15, students.size()); + // int num = getRandomNum(15, students.size()); List refStudent = students.stream() - .map(student -> { - return new StudentSimpleRefDto(student.getStudentNum(), student.getName()); - }) - .collect(Collectors.toList()); - - Collections.shuffle(refStudent); - studentService.registerParticipants(activity.getId(), refStudent.subList(0, num)); + .map(student -> { + return new StudentSimpleRefDto(student.getStudentNum(), student.getName()); + }) + .collect(Collectors.toList()); + + studentService.registerParticipants(activity.getId(), refStudent); + // Collections.shuffle(refStudent); + // studentService.registerParticipants(activity.getId(), refStudent.subList(0, num)); activity.updateStudentRegister(); }); From 9976ed218eb3c2453952e07a78ad8befa3798f90 Mon Sep 17 00:00:00 2001 From: davidpiao Date: Mon, 21 Nov 2022 00:16:42 +0900 Subject: [PATCH 114/148] hotfix: added participant comment --- src/main/java/com/server/hispath/common/TestController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 07042b3..32664dc 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -69,7 +69,7 @@ public ResponseEntity initAll() { saveManager(); saveNotice(); saveActivities(); - saveScholarship(); +// saveScholarship(); participant 실행 한 뒤 실행 // saveParticipant(); init all에 포함 금지! 따로 실행 // saveResumes(); return ResponseEntity.ok(null); @@ -164,7 +164,7 @@ private void saveScholarship() { studentIds.forEach(id -> scholarshipService.create(id, "2022-2")); studentIds.forEach(id -> scholarshipService.create(id, "2022-1")); - studentIds.forEach(id -> scholarshipService.create(id, "2019-2")); + studentIds.forEach(id -> scholarshipService.create(id, "2021-2")); // List studentIds2022_2 = students.stream() @@ -1982,7 +1982,7 @@ private void saveMajor() { majorRepository.save(Major.builder().name("도시환경공학전공").build()); majorRepository.save(Major.builder().name("기계공학전공").build()); majorRepository.save(Major.builder().name("전자제어공학전공").build()); - majorRepository.save(Major.builder().name("부전공").build()); + majorRepository.save(Major.builder().name("생명과학전공").build()); majorRepository.save(Major.builder().name("글로벌융합전공").build()); majorRepository.save(Major.builder().name("수학통계전공").build()); majorRepository.save(Major.builder().name("학생설계융합전공").build()); From 3f5dea418979b23a008cf02919faa2a2f242d1e8 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Mon, 21 Nov 2022 19:30:45 +0900 Subject: [PATCH 115/148] =?UTF-8?q?[#117]=20:=20=EC=B0=A8=ED=8A=B8=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20API=20=EB=93=A4=20=EC=88=98=EC=A0=95=20=20?= =?UTF-8?q?(#118)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#117] : 7일만큼 데이터를 가져오도록 API 구현 * fix[#117] : chart grade API 학년마다 나오도록 수정 --- .../activity/application/dto/ChartGradeDataDto.java | 4 ++++ .../activity/presentation/ChartController.java | 4 +++- .../hispath/manager/application/ManagerService.java | 2 +- .../scholarship/application/ScholarshipService.java | 13 ++++++++++++- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartGradeDataDto.java b/src/main/java/com/server/hispath/activity/application/dto/ChartGradeDataDto.java index e0d03f8..2450f2e 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ChartGradeDataDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/ChartGradeDataDto.java @@ -18,4 +18,8 @@ public ChartGradeDataDto(int grade, Long cnt) { this.grade = grade; this.cnt = cnt; } + + public void addCnt(Long cnt) { + this.cnt += cnt; + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/ChartController.java b/src/main/java/com/server/hispath/activity/presentation/ChartController.java index 9503f15..67cbaa6 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ChartController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ChartController.java @@ -4,6 +4,7 @@ import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.application.dto.ChartGradeDataDto; import com.server.hispath.activity.application.dto.ChartSearchRequestDto; import com.server.hispath.activity.presentation.response.chart.*; import com.server.hispath.auth.domain.LoginStudent; @@ -103,13 +104,14 @@ public ResponseEntity> getChartWeightDistribution(@RequestParam Strin @GetMapping("/chart/grade") @ApiOperation(value = ApiDoc.CHART_SCHOLARSHIP_GRADE) - @RequestMapping + @RequiredManagerLogin public ResponseEntity> getChartGradeDistribution(@RequestParam String semester) { List responses = scholarshipService.getChartGradeDistribution(semester) .stream() .map(ChartGradeResponse::of) .collect(Collectors.toList()); + return ResponseEntity.ok(responses); } diff --git a/src/main/java/com/server/hispath/manager/application/ManagerService.java b/src/main/java/com/server/hispath/manager/application/ManagerService.java index c194ea1..5a6f73a 100644 --- a/src/main/java/com/server/hispath/manager/application/ManagerService.java +++ b/src/main/java/com/server/hispath/manager/application/ManagerService.java @@ -73,7 +73,7 @@ public Manager findById(Long id) { public ManagerDashboardDto getDashboard(Long managerId) { Manager manager = this.findById(managerId); List dailyInfos = dailyInfoRepository.findDailyInfoByDateBetweenOrderByDateAsc(LocalDate.now() - .minusDays(7), LocalDate.now()); + .minusDays(6), LocalDate.now()); Long[] loginCounts = dailyInfos.stream() .map(DailyInfo::getLoginCnt) .toArray(Long[]::new); diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index 1d1ec27..94c67b5 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -199,8 +199,19 @@ else if (scholarship.getTotalMileage() < 100) @Transactional(readOnly = true) public List getChartGradeDistribution(String semester) { List chartGradeDataDtos = scholarshipRepositoryCustom.getCountByGradeAndSemester(semester); + chartGradeDataDtos.sort(Comparator.comparing(ChartGradeDataDto::getGrade)); - return chartGradeDataDtos; + ChartGradeDataDto[] chartGradeDatas = new ChartGradeDataDto[4]; + chartGradeDatas[0] = new ChartGradeDataDto(1, 0L); + chartGradeDatas[1] = new ChartGradeDataDto(2, 0L); + chartGradeDatas[2] = new ChartGradeDataDto(3, 0L); + chartGradeDatas[3] = new ChartGradeDataDto(4, 0L); + chartGradeDataDtos.forEach(chartGradeDataDto -> { + int grade = chartGradeDataDto.getGrade()/2 + chartGradeDataDto.getGrade()%2; + chartGradeDatas[grade-1].addCnt(chartGradeDataDto.getCnt()); + }); + + return List.of(chartGradeDatas); } @Transactional(readOnly = true) From 91a1cff45ba3ad69d77cbce0d99da5fdce298439 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Wed, 23 Nov 2022 22:59:01 +0900 Subject: [PATCH 116/148] =?UTF-8?q?[#119]=20:=20=EB=8C=80=EC=8B=9C?= =?UTF-8?q?=EB=B3=B4=EB=93=9C=20=EC=B0=A8=ED=8A=B8=20API=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#120)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix[#119] : gitigonre 수정 * fix[#119] : Dashbaord에 Resume, Activity까지나오도록 구현 * fix[#119] : 차트 ALL 일때는 전체 학기가 되도록 수정 --- .gitignore | 3 ++- .../activity/application/ActivityService.java | 20 ++++++++++++++++++- .../repository/ActivityRepositoryCustom.java | 1 + .../resume/application/ResumeService.java | 9 +++++++++ .../domain/repository/ResumeRepository.java | 2 ++ .../resume/presentation/ResumeController.java | 2 +- .../application/ScholarshipService.java | 1 + .../presentation/StudentController.java | 11 ++++++++-- .../response/DashboardResponse.java | 14 +++++++++++-- 9 files changed, 56 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index ad8b31f..07a0459 100644 --- a/.gitignore +++ b/.gitignore @@ -114,4 +114,5 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk -log/ \ No newline at end of file +log/ +src/main/resources/appender \ No newline at end of file diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index a72664a..c87939c 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -130,7 +130,8 @@ public ActivityParticipantDto updateStudentActivity(Long activityId, Long studen @Transactional(readOnly = true) public List findAllParticipantActivites(Long studentId, String semester, String section) { - Student student = studentRepository.findStudentWithActivities(studentId).orElseThrow(StudentNotFoundException::new); + Student student = studentRepository.findStudentWithActivities(studentId) + .orElseThrow(StudentNotFoundException::new); return student.getParticipants() .stream() .filter(participant -> participant.isSameSemester(semester)) @@ -139,6 +140,23 @@ public List findAllParticipantActivites(Long studentId, .collect(Collectors.toList()); } + @Transactional(readOnly = true) + public List findRecentParticipantActivities(Long studentId) { + + Student student = studentRepository.findStudentWithActivities(studentId) + .orElseThrow(StudentNotFoundException::new); + List dtos = student.getParticipants() + .stream() + .sorted((p1, p2) -> p2.getUpdatedAt() + .compareTo(p1.getUpdatedAt())) + .map(ActivityParticipantDto::of) + .collect(Collectors.toList()); + if(dtos.size() > 6){ + return dtos.subList(0, 6); + } + return dtos; + } + @Transactional(readOnly = true) public List findAllPersonalParticipantActivites(Long id, String semester, String section) { Student student = studentRepository.findStudentWithActivities(id).orElseThrow(StudentNotFoundException::new); diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java index 0e99a41..6e903fc 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java @@ -87,6 +87,7 @@ public BooleanBuilder totalChartCategoryCondition(ChartSearchRequestDto dto) { } public BooleanBuilder semesterCondition(BooleanBuilder booleanBuilder, ChartSearchRequestDto dto) { + if(Objects.equals(dto.getSemester(), "ALL")) return booleanBuilder; if (!Objects.isNull(dto.getSemester())) { booleanBuilder.and(activity.semester.eq(dto.getSemester())); } diff --git a/src/main/java/com/server/hispath/resume/application/ResumeService.java b/src/main/java/com/server/hispath/resume/application/ResumeService.java index 8e61dfb..02fdac5 100644 --- a/src/main/java/com/server/hispath/resume/application/ResumeService.java +++ b/src/main/java/com/server/hispath/resume/application/ResumeService.java @@ -65,4 +65,13 @@ public List findAllStudentResumes(Long studentId) { .map(ResumeDto::of) .collect(Collectors.toList()); } + + @Transactional(readOnly = true) + public List findRecentResumes(Long studentId) { + Student student = studentService.findById(studentId); + return resumeRepository.findTop6ByStudentOrderByUpdatedAtDesc(student) + .stream() + .map(ResumeDto::of) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/server/hispath/resume/domain/repository/ResumeRepository.java b/src/main/java/com/server/hispath/resume/domain/repository/ResumeRepository.java index b1d7510..58a2dad 100644 --- a/src/main/java/com/server/hispath/resume/domain/repository/ResumeRepository.java +++ b/src/main/java/com/server/hispath/resume/domain/repository/ResumeRepository.java @@ -9,4 +9,6 @@ public interface ResumeRepository extends JpaRepository { List findByStudent(Student student); + + List findTop6ByStudentOrderByUpdatedAtDesc(Student student); } diff --git a/src/main/java/com/server/hispath/resume/presentation/ResumeController.java b/src/main/java/com/server/hispath/resume/presentation/ResumeController.java index 15f1aea..d6bcdea 100644 --- a/src/main/java/com/server/hispath/resume/presentation/ResumeController.java +++ b/src/main/java/com/server/hispath/resume/presentation/ResumeController.java @@ -68,7 +68,7 @@ public ResponseEntity find(@RequestParam Long resumeId) { @GetMapping("/resumes") @ApiOperation(value = ApiDoc.RESUME_READ_ALL) @RequiredLogin - public ResponseEntity> findALl(@StudentLogin LoginStudent loginStudent) { + public ResponseEntity> findAll(@StudentLogin LoginStudent loginStudent) { List responses = resumeService.findAllStudentResumes(loginStudent.getId()) .stream() diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index 94c67b5..4fca45d 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -152,6 +152,7 @@ public List searchScholarshipStudent(SearchRequestDto dto) { @Transactional(readOnly = true) public ChartRankDto getRankChartData(Long studentId, ChartSearchRequestDto dto) { + Student student = studentService.findById(studentId); int myWeight = scholarshipRepository.findFirstByStudentAndSemester(student, dto.getSemester()) .orElseGet(() -> Scholarship.builder().totalMileage(0).build()) diff --git a/src/main/java/com/server/hispath/student/presentation/StudentController.java b/src/main/java/com/server/hispath/student/presentation/StudentController.java index 20442c8..403c3e4 100644 --- a/src/main/java/com/server/hispath/student/presentation/StudentController.java +++ b/src/main/java/com/server/hispath/student/presentation/StudentController.java @@ -4,6 +4,7 @@ import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.application.dto.ActivityParticipantDto; import com.server.hispath.activity.presentation.response.ActivityParticipantStatusResponse; import com.server.hispath.activity.presentation.response.SemesterResponse; import com.server.hispath.auth.domain.LoginStudent; @@ -13,6 +14,8 @@ import com.server.hispath.docs.ApiDoc; import com.server.hispath.notice.application.NoticeService; import com.server.hispath.notice.application.dto.DashboardNoticeDto; +import com.server.hispath.resume.application.ResumeService; +import com.server.hispath.resume.application.dto.ResumeDto; import com.server.hispath.student.application.StudentService; import com.server.hispath.student.application.dto.StudentCUDto; import com.server.hispath.student.application.dto.StudentDto; @@ -37,6 +40,7 @@ public class StudentController { private final StudentService studentService; private final NoticeService noticeService; private final ActivityService activityService; + private final ResumeService resumeService; @PostMapping("/student") @ApiOperation(value = ApiDoc.STUDENT_CREATE) @@ -120,7 +124,10 @@ public ResponseEntity getDashboardInfo(@StudentLogin LoginStu StudentDto studentDto = studentService.find(loginStudent.getId()); List dashboardNoticeDtos = noticeService.findRecentNotice(); - return ResponseEntity.ok(DashboardResponse.from(studentDto, dashboardNoticeDtos)); + List resumeDtos = resumeService.findRecentResumes(loginStudent.getId()); + List activityDtos = activityService.findRecentParticipantActivities(loginStudent.getId()); + + return ResponseEntity.ok(DashboardResponse.from(studentDto, dashboardNoticeDtos, resumeDtos, activityDtos)); } @GetMapping("/student-activities/status") @@ -131,7 +138,7 @@ public ResponseEntity> findStudentActivi @RequestParam String semester, @RequestParam String section) { - List responses = activityService.findAllPersonalParticipantActivites(1L, semester, section) + List responses = activityService.findAllPersonalParticipantActivites(loginStudent.getId(), semester, section) .stream() .map(ActivityParticipantStatusResponse::of) .collect(Collectors.toList()); diff --git a/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java b/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java index 87f63b1..534c589 100644 --- a/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java +++ b/src/main/java/com/server/hispath/student/presentation/response/DashboardResponse.java @@ -3,10 +3,12 @@ import java.util.List; import java.util.stream.Collectors; +import com.server.hispath.activity.application.dto.ActivityParticipantDto; import com.server.hispath.department.presentation.response.DepartmentResponse; import com.server.hispath.major.presentation.response.MajorResponse; import com.server.hispath.notice.application.dto.DashboardNoticeDto; import com.server.hispath.notice.presentation.response.NoticeDashboardResponse; +import com.server.hispath.resume.application.dto.ResumeDto; import com.server.hispath.student.application.dto.StudentDto; import lombok.AllArgsConstructor; @@ -31,11 +33,19 @@ public class DashboardResponse { private String blog; private String readme; private List notice; + private List resumes; + private List activities; + + public static DashboardResponse from(StudentDto studentDto, + List noticeDtos, + List resumeDtos, + List activityParticipantDtos) { - public static DashboardResponse from(StudentDto studentDto, List noticeDtos) { return new DashboardResponse(studentDto.getId(), studentDto.getProfile(), studentDto.getName(), studentDto.getStudentNum(), MajorResponse.from(studentDto.getMajor1()), MajorResponse.from(studentDto.getMajor2()), DepartmentResponse.from(studentDto.getDepartmentDto()), studentDto.getSemester(), studentDto.getEmail(), studentDto.getPhone(), studentDto.getGithubId(), studentDto.getBlog(), studentDto.getReadme(), - noticeDtos.stream().map(NoticeDashboardResponse::of).collect(Collectors.toList())); + noticeDtos.stream() + .map(NoticeDashboardResponse::of) + .collect(Collectors.toList()), resumeDtos, activityParticipantDtos); } } From d1ef7c68110080bdce36689c57934c67f7567728 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Fri, 25 Nov 2022 05:44:58 +0900 Subject: [PATCH 117/148] =?UTF-8?q?[#121]=20:=20=ED=95=99=EC=83=9D?= =?UTF-8?q?=ED=99=9C=EB=8F=99=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B0=A8?= =?UTF-8?q?=ED=8A=B8=20API=20=EA=B5=AC=ED=98=84=20(#122)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix[#121] : student section 조회 API에 milage 추가 * feat[#121] :학생활동 차트 API 구현 --- .../activity/application/ActivityService.java | 35 +++++++++++++++---- .../dto/{ => chart}/ChartCategoryDto.java | 3 +- .../dto/{ => chart}/ChartDataDto.java | 3 +- .../dto/{ => chart}/ChartRankDto.java | 2 +- .../dto/chart/ChartSectionCntDto.java | 28 +++++++++++++++ .../repository/ActivityRepositoryCustom.java | 24 +++++++++++-- .../presentation/ChartController.java | 8 +++++ .../response/chart/ChartCategoryResponse.java | 2 +- .../response/chart/ChartDataResponse.java | 2 +- .../chart/ChartDepartmentResponse.java | 1 - .../response/chart/ChartRankResponse.java | 2 +- .../response/chart/ChartSectionResponse.java | 15 ++++++++ .../java/com/server/hispath/docs/ApiDoc.java | 1 + .../application/ScholarshipService.java | 1 + .../hispath/student/domain/Participant.java | 2 ++ 15 files changed, 113 insertions(+), 16 deletions(-) rename src/main/java/com/server/hispath/activity/application/dto/{ => chart}/ChartCategoryDto.java (84%) rename src/main/java/com/server/hispath/activity/application/dto/{ => chart}/ChartDataDto.java (85%) rename src/main/java/com/server/hispath/activity/application/dto/{ => chart}/ChartRankDto.java (81%) create mode 100644 src/main/java/com/server/hispath/activity/application/dto/chart/ChartSectionCntDto.java create mode 100644 src/main/java/com/server/hispath/activity/presentation/response/chart/ChartSectionResponse.java diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index c87939c..e2f4b87 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -1,13 +1,16 @@ package com.server.hispath.activity.application; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; import com.server.hispath.activity.application.dto.*; +import com.server.hispath.activity.application.dto.chart.ChartCategoryDto; +import com.server.hispath.activity.application.dto.chart.ChartDataDto; +import com.server.hispath.activity.application.dto.chart.ChartSectionCntDto; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.activity.domain.repository.ActivityRepositoryCustom; +import com.server.hispath.activity.presentation.response.chart.ChartSectionResponse; import com.server.hispath.category.application.CategoryService; import com.server.hispath.category.domain.Category; import com.server.hispath.category.domain.repository.CategoryRepository; @@ -146,12 +149,12 @@ public List findRecentParticipantActivities(Long student Student student = studentRepository.findStudentWithActivities(studentId) .orElseThrow(StudentNotFoundException::new); List dtos = student.getParticipants() - .stream() - .sorted((p1, p2) -> p2.getUpdatedAt() - .compareTo(p1.getUpdatedAt())) - .map(ActivityParticipantDto::of) - .collect(Collectors.toList()); - if(dtos.size() > 6){ + .stream() + .sorted((p1, p2) -> p2.getUpdatedAt() + .compareTo(p1.getUpdatedAt())) + .map(ActivityParticipantDto::of) + .collect(Collectors.toList()); + if (dtos.size() > 6) { return dtos.subList(0, 6); } return dtos; @@ -247,6 +250,24 @@ public List getChartTotalDatasByCategory(Long studentId, Chart } + @Transactional(readOnly = true) + public List getChartTotalDatasBySections(Long studentId, String semester) { + ChartSearchRequestDto dto = ChartSearchRequestDto.builder().semester(semester).build(); + List studentCnts = activityRepositoryCustom.getPersonalChartSectionCnts(studentId, dto); + List totalCnts = activityRepositoryCustom.getTotalChartSectionCnts(dto); + int totalStudentCnt = activityRepositoryCustom.getTotalStudentCntByChartSearchRequest(dto); + + return totalCnts.stream() + .map(totalCnt -> { + return studentCnts.stream() + .filter(studentCnt -> studentCnt.isSameSection(totalCnt.getSection())) + .findFirst() + .map(studentCntDto -> new ChartSectionResponse(totalCnt.getSection(), studentCntDto.getCnt(), totalCnt.getCnt() / (double) totalStudentCnt)) + .orElseGet(() -> new ChartSectionResponse(totalCnt.getSection(), 0L, totalCnt.getCnt() / (double) totalStudentCnt)); + }) + .collect(Collectors.toList()); + + } private Student findStudentWholeByIdAndSemester(Long studentId, String semester, boolean isMileage) { return studentRepositoryCustom.findStudentWithIdAndSemester(studentId, semester, isMileage) diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartCategoryDto.java b/src/main/java/com/server/hispath/activity/application/dto/chart/ChartCategoryDto.java similarity index 84% rename from src/main/java/com/server/hispath/activity/application/dto/ChartCategoryDto.java rename to src/main/java/com/server/hispath/activity/application/dto/chart/ChartCategoryDto.java index 9467008..84ba70f 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ChartCategoryDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/chart/ChartCategoryDto.java @@ -1,7 +1,8 @@ -package com.server.hispath.activity.application.dto; +package com.server.hispath.activity.application.dto.chart; import java.util.Objects; +import com.server.hispath.activity.application.dto.chart.ChartDataDto; import com.server.hispath.category.application.dto.CategoryDto; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartDataDto.java b/src/main/java/com/server/hispath/activity/application/dto/chart/ChartDataDto.java similarity index 85% rename from src/main/java/com/server/hispath/activity/application/dto/ChartDataDto.java rename to src/main/java/com/server/hispath/activity/application/dto/chart/ChartDataDto.java index 4bda603..ac7a091 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ChartDataDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/chart/ChartDataDto.java @@ -1,5 +1,6 @@ -package com.server.hispath.activity.application.dto; +package com.server.hispath.activity.application.dto.chart; +import com.server.hispath.activity.application.dto.ChartCategoryCntDto; import com.server.hispath.category.application.dto.CategoryDto; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/server/hispath/activity/application/dto/ChartRankDto.java b/src/main/java/com/server/hispath/activity/application/dto/chart/ChartRankDto.java similarity index 81% rename from src/main/java/com/server/hispath/activity/application/dto/ChartRankDto.java rename to src/main/java/com/server/hispath/activity/application/dto/chart/ChartRankDto.java index 07f6e23..4d9ab42 100644 --- a/src/main/java/com/server/hispath/activity/application/dto/ChartRankDto.java +++ b/src/main/java/com/server/hispath/activity/application/dto/chart/ChartRankDto.java @@ -1,4 +1,4 @@ -package com.server.hispath.activity.application.dto; +package com.server.hispath.activity.application.dto.chart; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/server/hispath/activity/application/dto/chart/ChartSectionCntDto.java b/src/main/java/com/server/hispath/activity/application/dto/chart/ChartSectionCntDto.java new file mode 100644 index 0000000..8bfc68c --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/chart/ChartSectionCntDto.java @@ -0,0 +1,28 @@ +package com.server.hispath.activity.application.dto.chart; + +import java.util.Objects; + +import com.querydsl.core.annotations.QueryProjection; +import com.server.hispath.student.domain.Section; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class ChartSectionCntDto { + + private String section; + private Long cnt; + + @QueryProjection + public ChartSectionCntDto(Section section, Long cnt) { + this.section = section.getName(); + this.cnt = cnt; + } + + public boolean isSameSection(String section){ + return Objects.equals(this.section, section); + } +} diff --git a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java index 6e903fc..9c0c55e 100644 --- a/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java +++ b/src/main/java/com/server/hispath/activity/domain/repository/ActivityRepositoryCustom.java @@ -9,6 +9,8 @@ import com.server.hispath.activity.application.dto.ChartCategoryCntDto; import com.server.hispath.activity.application.dto.ChartSearchRequestDto; import com.server.hispath.activity.application.dto.QChartCategoryCntDto; +import com.server.hispath.activity.application.dto.chart.ChartSectionCntDto; +import com.server.hispath.activity.application.dto.chart.QChartSectionCntDto; import com.server.hispath.student.domain.Student; import org.springframework.stereotype.Repository; @@ -49,7 +51,7 @@ public List getTotalCategoryParticipateCnt(ChartSearchReque } public List getActivityCntByCategoryAndSemester(ChartSearchRequestDto dto) { - return queryFactory.select(new QChartCategoryCntDto(category.id, category.name ,activity.count()) ) + return queryFactory.select(new QChartCategoryCntDto(category.id, category.name, activity.count())) .from(activity) .leftJoin(activity.category, category) .where(semesterCondition(new BooleanBuilder(), dto)) @@ -57,6 +59,23 @@ public List getActivityCntByCategoryAndSemester(ChartSearch .fetch(); } + public List getPersonalChartSectionCnts(Long studentId, ChartSearchRequestDto dto) { + return queryFactory.select(new QChartSectionCntDto(participant.section, participant.count())) + .from(participant) + .where(participant.student.id.eq(studentId) + .and(participant.activity.semester.eq(dto.getSemester()))) + .groupBy(participant.section) + .fetch(); + } + + public List getTotalChartSectionCnts(ChartSearchRequestDto dto) { + return queryFactory.select(new QChartSectionCntDto(participant.section, participant.count())) + .from(participant) + .where(participant.activity.semester.eq(dto.getSemester())) + .groupBy(participant.section) + .fetch(); + } + public int getTotalStudentCntByChartSearchRequest(ChartSearchRequestDto dto) { return queryFactory.selectDistinct(participant.student.id) .from(activity) @@ -87,7 +106,8 @@ public BooleanBuilder totalChartCategoryCondition(ChartSearchRequestDto dto) { } public BooleanBuilder semesterCondition(BooleanBuilder booleanBuilder, ChartSearchRequestDto dto) { - if(Objects.equals(dto.getSemester(), "ALL")) return booleanBuilder; + if (Objects.equals(dto.getSemester(), "ALL")) + return booleanBuilder; if (!Objects.isNull(dto.getSemester())) { booleanBuilder.and(activity.semester.eq(dto.getSemester())); } diff --git a/src/main/java/com/server/hispath/activity/presentation/ChartController.java b/src/main/java/com/server/hispath/activity/presentation/ChartController.java index 67cbaa6..7b84261 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ChartController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ChartController.java @@ -126,4 +126,12 @@ public ResponseEntity> getChartDepartmentDistribut .collect(Collectors.toList()); return ResponseEntity.ok(responses); } + + @GetMapping("/chart/activities") + @ApiOperation(value = ApiDoc.CHART_STUDENT_ACTIVITY) +// @RequiredLogin +// public ResponseEntity> getActivityChartDatas(@StudentLogin LoginStudent loginStudent, @RequestParam String semester) { + public ResponseEntity> getActivityChartDatas(@RequestParam String semester) { + return ResponseEntity.ok(activityService.getChartTotalDatasBySections(6L, semester)); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartCategoryResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartCategoryResponse.java index b8b07b0..47dde89 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartCategoryResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartCategoryResponse.java @@ -1,6 +1,6 @@ package com.server.hispath.activity.presentation.response.chart; -import com.server.hispath.activity.application.dto.ChartCategoryDto; +import com.server.hispath.activity.application.dto.chart.ChartCategoryDto; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDataResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDataResponse.java index c203dce..a98b903 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDataResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDataResponse.java @@ -1,6 +1,6 @@ package com.server.hispath.activity.presentation.response.chart; -import com.server.hispath.activity.application.dto.ChartDataDto; +import com.server.hispath.activity.application.dto.chart.ChartDataDto; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDepartmentResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDepartmentResponse.java index 397bfcd..d1eaa31 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDepartmentResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartDepartmentResponse.java @@ -1,6 +1,5 @@ package com.server.hispath.activity.presentation.response.chart; -import com.server.hispath.activity.application.dto.ChartDataDto; import com.server.hispath.activity.application.dto.ChartDepartmentDataDto; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartRankResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartRankResponse.java index 24e9f44..707d999 100644 --- a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartRankResponse.java +++ b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartRankResponse.java @@ -1,6 +1,6 @@ package com.server.hispath.activity.presentation.response.chart; -import com.server.hispath.activity.application.dto.ChartRankDto; +import com.server.hispath.activity.application.dto.chart.ChartRankDto; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartSectionResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartSectionResponse.java new file mode 100644 index 0000000..cc945e2 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/chart/ChartSectionResponse.java @@ -0,0 +1,15 @@ +package com.server.hispath.activity.presentation.response.chart; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ChartSectionResponse { + + private String section; + private Long myCnt; + private Double avgCnt; +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index b6f2a06..b7fab9b 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -41,6 +41,7 @@ public class ApiDoc { public static final String CHART_MILEAGE_TIMELINE = "마일리지 활동 Timeline 차트 데이터 조회"; public static final String CHART_SCHOLARSHIP_WEIGHT = "학생의 전체 가중치 분포 차트 데이터 조회"; public static final String CHART_ACTIVITY_CATEGORY = "카테고리 별 활동 갯수 분포 차트 데이터 조회"; + public static final String CHART_STUDENT_ACTIVITY = "학생들의 전체 섹션 활동 분포 차트 데이터 조회"; public static final String CHART_SCHOLARSHIP_GRADE = "학년 별 마일리지 수혜 학생 분포 차트 데이터 조회"; public static final String CHART_SCHOLARSHIP_DEPARTMENT = "학부 별 마일리지 수혜 학생 분포 차트 데이터 조회"; diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index 4fca45d..211cbd1 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -4,6 +4,7 @@ import java.util.stream.Collectors; import com.server.hispath.activity.application.dto.*; +import com.server.hispath.activity.application.dto.chart.ChartRankDto; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; import com.server.hispath.exception.scholarship.ScholarshipDuplicateException; diff --git a/src/main/java/com/server/hispath/student/domain/Participant.java b/src/main/java/com/server/hispath/student/domain/Participant.java index fbdc6e6..38b4d6b 100644 --- a/src/main/java/com/server/hispath/student/domain/Participant.java +++ b/src/main/java/com/server/hispath/student/domain/Participant.java @@ -58,6 +58,8 @@ public boolean isSameSemester(String semester) { public boolean isSameSection(String section) { if (Objects.equals(section, "ALL")) return true; + if (Objects.equals(section, "마일리지")) + return this.activity.getRequestStatus() == 1; return Objects.equals(this.section.getName(), section); } From cbe67462f7b6103e5e43a5efed5630524b4b5b22 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Fri, 25 Nov 2022 13:37:16 +0900 Subject: [PATCH 118/148] =?UTF-8?q?[#123]=20:=20Manager=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20API=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#124)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix[#123] : chart grade API 변경 * fix[#123] : Manager 수정 power 는 못하도록 변경 * feat[#123] : Manager 프로필 수정 API 구현 * fix[#123] : annotation 잘못한거 수정 * feat[#123] : 로그인 한 관리자 이메일 조회 API 구현 --- .../java/com/server/hispath/docs/ApiDoc.java | 2 ++ .../manager/application/ManagerService.java | 13 ++++++++++ .../manager/application/dto/ManagerCUDto.java | 3 +-- .../application/dto/ManagerUpdateDto.java | 22 ++++++++++++++++ .../hispath/manager/domain/Manager.java | 9 ++++++- .../presentation/ManagerController.java | 26 ++++++++++++++++--- .../request/ManagerCURequest.java | 1 - .../request/ManagerUpdateRequest.java | 18 +++++++++++++ .../response/ManagerEmailResponse.java | 12 +++++++++ .../application/ScholarshipService.java | 1 + 10 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/server/hispath/manager/application/dto/ManagerUpdateDto.java create mode 100644 src/main/java/com/server/hispath/manager/presentation/request/ManagerUpdateRequest.java create mode 100644 src/main/java/com/server/hispath/manager/presentation/response/ManagerEmailResponse.java diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index b7fab9b..593d473 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -82,9 +82,11 @@ public class ApiDoc { public static final String MANAGER_READ_ALL = "모든 관리자 조회"; public static final String MANAGER_CREATE = "관리자 생성"; public static final String MANAGER_UPDATE = "관리자 수정"; + public static final String MANAGER_PROFILE_UPDATE = "관리자 프로필 수정"; public static final String MANAGER_APPROVE = "관리자 승인"; public static final String MANAGER_DELETE = "관리자 삭제"; public static final String MANAGER_DASHBOARD = "관리자 대시보드 조회"; + public static final String MANAGER_EMAIL = "접속한 관리자 이메일 조회"; /* Department 관련 API 명세 */ public static final String DEPARTMENT_READ = "단일 학부 조회"; diff --git a/src/main/java/com/server/hispath/manager/application/ManagerService.java b/src/main/java/com/server/hispath/manager/application/ManagerService.java index 5a6f73a..089259f 100644 --- a/src/main/java/com/server/hispath/manager/application/ManagerService.java +++ b/src/main/java/com/server/hispath/manager/application/ManagerService.java @@ -8,6 +8,7 @@ import com.server.hispath.manager.application.dto.ManagerCUDto; import com.server.hispath.manager.application.dto.ManagerDashboardDto; import com.server.hispath.manager.application.dto.ManagerDto; +import com.server.hispath.manager.application.dto.ManagerUpdateDto; import com.server.hispath.manager.domain.DailyInfo; import com.server.hispath.manager.domain.Manager; import com.server.hispath.manager.domain.repository.DailyInfoRepository; @@ -51,6 +52,13 @@ public ManagerDto update(Long id, ManagerCUDto dto) { return ManagerDto.of(manager); } + @Transactional + public ManagerDto update(Long id, ManagerUpdateDto dto){ + Manager manager = this.findById(id); + manager.update(dto); + return ManagerDto.of(manager); + } + @Transactional public Long delete(Long id) { managerRepository.deleteById(id); @@ -81,4 +89,9 @@ public ManagerDashboardDto getDashboard(Long managerId) { return ManagerDashboardDto.of(manager, loginCounts, totalLoginCnt); } + + @Transactional(readOnly = true) + public String getEmail(Long memberId){ + return this.findById(memberId).getEmail(); + } } diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java index 8a70910..b6df6d5 100644 --- a/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java +++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java @@ -13,12 +13,11 @@ public class ManagerCUDto { private String name; private String profile; - private int power; private String email; private String department; public static ManagerCUDto of(ManagerCURequest request) { - return new ManagerCUDto(request.getName(), request.getProfile(), request.getPower(), request.getEmail(), request.getDepartment()); + return new ManagerCUDto(request.getName(), request.getProfile(), request.getEmail(), request.getDepartment()); } } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerUpdateDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerUpdateDto.java new file mode 100644 index 0000000..f171d65 --- /dev/null +++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerUpdateDto.java @@ -0,0 +1,22 @@ +package com.server.hispath.manager.application.dto; + +import com.server.hispath.manager.presentation.request.ManagerUpdateRequest; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ManagerUpdateDto { + private String name; + private String profile; + private String email; + private String department; + private int power; + + public static ManagerUpdateDto from(ManagerUpdateRequest request){ + return new ManagerUpdateDto(request.getName(), request.getProfile(), request.getEmail(), request.getDepartment(), request.getPower()); + } +} diff --git a/src/main/java/com/server/hispath/manager/domain/Manager.java b/src/main/java/com/server/hispath/manager/domain/Manager.java index b2b6cdf..b3b54eb 100644 --- a/src/main/java/com/server/hispath/manager/domain/Manager.java +++ b/src/main/java/com/server/hispath/manager/domain/Manager.java @@ -7,6 +7,7 @@ import com.server.hispath.common.BaseEntity; import com.server.hispath.manager.application.dto.ManagerCUDto; +import com.server.hispath.manager.application.dto.ManagerUpdateDto; import lombok.AllArgsConstructor; import lombok.Builder; @@ -37,7 +38,6 @@ public class Manager extends BaseEntity { public static Manager of(ManagerCUDto dto) { return Manager.builder() - .power(dto.getPower()) .name(dto.getName()) .email(dto.getEmail()) .profile(dto.getProfile()) @@ -51,6 +51,13 @@ public void update(ManagerCUDto dto) { this.name = dto.getName(); this.profile = dto.getProfile(); this.department = dto.getDepartment(); + } + + public void update(ManagerUpdateDto dto){ + this.email = dto.getEmail(); + this.name = dto.getName(); + this.profile = dto.getProfile(); + this.department = dto.getDepartment(); this.power = dto.getPower(); } diff --git a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java index f8de972..b754262 100644 --- a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java +++ b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java @@ -11,8 +11,11 @@ import com.server.hispath.manager.application.ManagerService; import com.server.hispath.manager.application.dto.ManagerCUDto; import com.server.hispath.manager.application.dto.ManagerDashboardDto; +import com.server.hispath.manager.application.dto.ManagerUpdateDto; import com.server.hispath.manager.presentation.request.ManagerApproveRequest; import com.server.hispath.manager.presentation.request.ManagerCURequest; +import com.server.hispath.manager.presentation.request.ManagerUpdateRequest; +import com.server.hispath.manager.presentation.response.ManagerEmailResponse; import com.server.hispath.manager.presentation.response.ManagerResponse; import org.springframework.http.ResponseEntity; @@ -31,7 +34,7 @@ public class ManagerController { @PostMapping("/manager") @ApiOperation(value = ApiDoc.MANAGER_CREATE) - @RequiredSuperManagerLogin + @RequiredManagerLogin public ResponseEntity create(@RequestBody ManagerCURequest request) { Long savedId = managerService.create(ManagerCUDto.of(request)); return ResponseEntity.ok(savedId); @@ -59,8 +62,16 @@ public ResponseEntity> findAll() { @PutMapping("/manager/{id}") @ApiOperation(value = ApiDoc.MANAGER_UPDATE) @RequiredSuperManagerLogin - public ResponseEntity update(@PathVariable Long id, @RequestBody ManagerCURequest request) { - ManagerResponse response = ManagerResponse.of(managerService.update(id, ManagerCUDto.of(request))); + public ResponseEntity update(@PathVariable Long id, @RequestBody ManagerUpdateRequest request) { + ManagerResponse response = ManagerResponse.of(managerService.update(id, ManagerUpdateDto.from(request))); + return ResponseEntity.ok(response); + } + + @PutMapping("/manager") + @ApiOperation(value = ApiDoc.MANAGER_PROFILE_UPDATE) + @RequiredManagerLogin + public ResponseEntity updateProfile(@ManagerLogin LoginManager loginManager, @RequestBody ManagerCURequest request) { + ManagerResponse response = ManagerResponse.of(managerService.update(loginManager.getId(), ManagerCUDto.of(request))); return ResponseEntity.ok(response); } @@ -81,9 +92,16 @@ public ResponseEntity delete(@PathVariable Long id) { } @GetMapping("/manager/dashboard") - @ApiOperation(value = ApiDoc.MANAGER_READ) + @ApiOperation(value = ApiDoc.MANAGER_DASHBOARD) @RequiredManagerLogin public ResponseEntity getDashboard(@ManagerLogin LoginManager loginManager) { return ResponseEntity.ok(managerService.getDashboard(loginManager.getId())); } + + @GetMapping("/manager/email") + @ApiOperation(value = ApiDoc.MANAGER_EMAIL) + @RequiredManagerLogin + public ResponseEntity getEmail(@ManagerLogin LoginManager loginManager) { + return ResponseEntity.ok(new ManagerEmailResponse(managerService.getEmail(loginManager.getId()))); + } } diff --git a/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java b/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java index b33ec24..d2e58e8 100644 --- a/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java +++ b/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java @@ -11,7 +11,6 @@ public class ManagerCURequest { private String name; private String profile; - private int power; private String email; private String department; diff --git a/src/main/java/com/server/hispath/manager/presentation/request/ManagerUpdateRequest.java b/src/main/java/com/server/hispath/manager/presentation/request/ManagerUpdateRequest.java new file mode 100644 index 0000000..3829524 --- /dev/null +++ b/src/main/java/com/server/hispath/manager/presentation/request/ManagerUpdateRequest.java @@ -0,0 +1,18 @@ +package com.server.hispath.manager.presentation.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class ManagerUpdateRequest { + + private String name; + private String profile; + private String email; + private String department; + private int power; + +} diff --git a/src/main/java/com/server/hispath/manager/presentation/response/ManagerEmailResponse.java b/src/main/java/com/server/hispath/manager/presentation/response/ManagerEmailResponse.java new file mode 100644 index 0000000..a2ededf --- /dev/null +++ b/src/main/java/com/server/hispath/manager/presentation/response/ManagerEmailResponse.java @@ -0,0 +1,12 @@ +package com.server.hispath.manager.presentation.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ManagerEmailResponse { + private String email; +} diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index 211cbd1..2f52cce 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -210,6 +210,7 @@ public List getChartGradeDistribution(String semester) { chartGradeDatas[3] = new ChartGradeDataDto(4, 0L); chartGradeDataDtos.forEach(chartGradeDataDto -> { int grade = chartGradeDataDto.getGrade()/2 + chartGradeDataDto.getGrade()%2; + if(grade >= 4) grade = 4; chartGradeDatas[grade-1].addCnt(chartGradeDataDto.getCnt()); }); From b69318c68927a0945fec553637574517fd58f260 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Fri, 25 Nov 2022 16:12:48 +0900 Subject: [PATCH 119/148] =?UTF-8?q?[#116]=20:=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=9C=20=EB=A1=9C=EA=B9=85=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=99=84=EC=84=B1=20(#126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat[#116] : logback 을 사용한 로깅 기능 구현 * feat[#116] : 필터를 사용하여 로깅 기능 구현 --- build.gradle | 1 + .../exception/GlobalExceptionHandler.java | 22 ++++ .../server/hispath/filters/LoggingFilter.java | 109 ++++++++++++++++++ .../hispath/filters/RequestWrapper.java | 54 +++++++++ .../hispath/filters/ResponseWrapper.java | 11 ++ src/main/resources/logback-spring.xml | 15 +++ 6 files changed, 212 insertions(+) create mode 100644 src/main/java/com/server/hispath/filters/LoggingFilter.java create mode 100644 src/main/java/com/server/hispath/filters/RequestWrapper.java create mode 100644 src/main/java/com/server/hispath/filters/ResponseWrapper.java create mode 100644 src/main/resources/logback-spring.xml diff --git a/build.gradle b/build.gradle index 91f71fc..15028db 100644 --- a/build.gradle +++ b/build.gradle @@ -45,6 +45,7 @@ dependencies { clean { delete file('src/main/generated') } + implementation 'ca.pjer:logback-awslogs-appender:1.6.0' } tasks.named('test') { diff --git a/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java b/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java index d2d92ed..fd7dc9d 100644 --- a/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java @@ -1,15 +1,37 @@ package com.server.hispath.exception; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + @ControllerAdvice public class GlobalExceptionHandler { + private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); + @ExceptionHandler(HisPathException.class) public ResponseEntity hisPathException(HisPathException e) { + + if (e.getHttpStatus().is4xxClientError()) { + logger.info("Client Error : " + e.getMessage()); + } else if (e.getHttpStatus().is5xxServerError()) { + logger.error("Server Error : " + e.getMessage()); + } + return ResponseEntity.status(e.getHttpStatus()) .body(new ExceptionResponse(e.getMessage())); } + + @ExceptionHandler(Exception.class) + public ResponseEntity commonException(Exception e) { + + logger.error("Unknown Exception : " + e.getMessage()); + + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ExceptionResponse(e.getMessage())); + } } diff --git a/src/main/java/com/server/hispath/filters/LoggingFilter.java b/src/main/java/com/server/hispath/filters/LoggingFilter.java new file mode 100644 index 0000000..fe003a8 --- /dev/null +++ b/src/main/java/com/server/hispath/filters/LoggingFilter.java @@ -0,0 +1,109 @@ +package com.server.hispath.filters; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.util.StreamUtils; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.ContentCachingResponseWrapper; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; + +@Component +public class LoggingFilter extends OncePerRequestFilter { + protected static final Logger log = LoggerFactory.getLogger(LoggingFilter.class); + + @Override + public void doFilterInternal( + HttpServletRequest request, + HttpServletResponse response, + FilterChain filterChain + ) throws ServletException, IOException { + + MDC.put("traceId", UUID.randomUUID().toString()); + doFilterWrapped(new RequestWrapper(request), new ResponseWrapper(response), filterChain); + MDC.clear(); + } + + public void doFilterWrapped( + RequestWrapper request, + ContentCachingResponseWrapper response, + FilterChain filterChain + ) throws ServletException, IOException { + + try { + logRequest(request); + filterChain.doFilter(request, response); + } finally { + logResponse(response); + response.copyBodyToResponse(); + } + } + + private static void logRequest(RequestWrapper request) throws IOException { + String queryString = request.getQueryString(); + String requestURI = request.getRequestURI(); + if (!Objects.isNull(queryString)) { + requestURI += queryString; + } + log.info("Request : {} uri=[{}] content-type=[{}]", + request.getMethod(), + requestURI, + request.getContentType() + ); + + logPayload("Request", request.getContentType(), request.getInputStream()); + } + + private static void logResponse(ContentCachingResponseWrapper response) throws IOException { + logPayload("Response", response.getContentType(), response.getContentInputStream()); + } + + private static void logPayload(String prefix, String contentType, InputStream inputStream) throws IOException { + if (Objects.isNull(contentType)) { + contentType = "application/json"; + } + + boolean visible = isVisible(MediaType.valueOf(contentType)); + if (visible) { + logContentPayload(prefix, inputStream); + return; + } + log.info("{} Payload: Binary Content", prefix); + } + + private static void logContentPayload(String prefix, InputStream inputStream) throws IOException { + byte[] content = StreamUtils.copyToByteArray(inputStream); + if (content.length > 0) { + String contentString = new String(content); + log.info("{} Payload: {}", prefix, contentString); + } + } + + private static boolean isVisible(MediaType mediaType) { + final List VISIBLE_TYPES = Arrays.asList( + MediaType.valueOf("text/*"), + MediaType.APPLICATION_FORM_URLENCODED, + MediaType.APPLICATION_JSON, + MediaType.APPLICATION_XML, + MediaType.valueOf("application/*+json"), + MediaType.valueOf("application/*+xml"), + MediaType.MULTIPART_FORM_DATA + ); + + return VISIBLE_TYPES.stream() + .anyMatch(visibleType -> visibleType.includes(mediaType)); + } +} \ No newline at end of file diff --git a/src/main/java/com/server/hispath/filters/RequestWrapper.java b/src/main/java/com/server/hispath/filters/RequestWrapper.java new file mode 100644 index 0000000..339490b --- /dev/null +++ b/src/main/java/com/server/hispath/filters/RequestWrapper.java @@ -0,0 +1,54 @@ +package com.server.hispath.filters; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; + +import org.springframework.util.StreamUtils; + +public class RequestWrapper extends HttpServletRequestWrapper { + + private byte[] cachedInputStream; + + public RequestWrapper(HttpServletRequest request) throws IOException { + super(request); + InputStream requestInputStream = request.getInputStream(); + this.cachedInputStream = StreamUtils.copyToByteArray(requestInputStream); + } + + @Override + public ServletInputStream getInputStream() { + return new ServletInputStream() { + private InputStream cachedBodyInputStream = new ByteArrayInputStream(cachedInputStream); + + @Override + public boolean isFinished() { + try { + return cachedBodyInputStream.available() == 0; + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener readListener) { + throw new UnsupportedOperationException(); + } + + @Override + public int read() throws IOException { + return cachedBodyInputStream.read(); + } + }; + } +} diff --git a/src/main/java/com/server/hispath/filters/ResponseWrapper.java b/src/main/java/com/server/hispath/filters/ResponseWrapper.java new file mode 100644 index 0000000..0c88e01 --- /dev/null +++ b/src/main/java/com/server/hispath/filters/ResponseWrapper.java @@ -0,0 +1,11 @@ +package com.server.hispath.filters; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.util.ContentCachingResponseWrapper; + +public class ResponseWrapper extends ContentCachingResponseWrapper { + public ResponseWrapper(HttpServletResponse response) { + super(response); + } +} \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..4df4d25 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + From 2908de09dd5cd43c0b232f77bc6051b290796451 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Fri, 25 Nov 2022 19:31:56 +0900 Subject: [PATCH 120/148] =?UTF-8?q?feat[#127]=20:=20=EA=B2=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#128)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/presentation/MActivityController.java | 2 +- .../server/hispath/auth/application/AuthService.java | 11 ++++++++++- .../hispath/auth/presentation/AuthController.java | 12 ++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index 9e016a2..d3a0205 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -48,7 +48,7 @@ public ResponseEntity create(@RequestBody MActivityCURequest request) { @PostMapping("/mileages") @ApiOperation(value = ApiDoc.MILEAGES_CREATE) @RequiredSuperManagerLogin - public ResponseEntity createMActivites(MultipartFile file) throws Exception { + public ResponseEntity createMActivites(@RequestPart(value = "file", required = false) MultipartFile file) throws Exception { mActivityService.createAll(ExcelManager.getMActivities(ExcelManager.extract(file))); return ResponseEntity.ok(null); } diff --git a/src/main/java/com/server/hispath/auth/application/AuthService.java b/src/main/java/com/server/hispath/auth/application/AuthService.java index cc2f22a..4e5e288 100644 --- a/src/main/java/com/server/hispath/auth/application/AuthService.java +++ b/src/main/java/com/server/hispath/auth/application/AuthService.java @@ -137,7 +137,6 @@ public Manager findSuperManagerByToken(String token) { } private void addLoginCount() { - System.out.println("aaaa"); Optional dailyInfo = dailyInfoRepository.findFirstByDate(LocalDate.now()); if (dailyInfo.isPresent()) { dailyInfo.get().login(); @@ -146,4 +145,14 @@ private void addLoginCount() { DailyInfo newDailyInfo = new DailyInfo(); dailyInfoRepository.save(newDailyInfo); } + + @Transactional(readOnly = true) + public String getStudentGuestToken(){ + return jwtProvider.createToken(String.valueOf(10L), Member.STUDENT); + } + + @Transactional(readOnly = true) + public String getManagerGuestToken(){ + return jwtProvider.createToken(String.valueOf(10L), Member.MANAGER); + } } diff --git a/src/main/java/com/server/hispath/auth/presentation/AuthController.java b/src/main/java/com/server/hispath/auth/presentation/AuthController.java index 037c3ab..3e4c5aa 100644 --- a/src/main/java/com/server/hispath/auth/presentation/AuthController.java +++ b/src/main/java/com/server/hispath/auth/presentation/AuthController.java @@ -29,4 +29,16 @@ public ResponseEntity loginManager(@PathVariable String oauthProv LoginResponseDto loginResponseDto = authService.managerLogin(new LoginRequestDto(oauthProvider, code)); return ResponseEntity.ok(TokenResponse.from(loginResponseDto)); } + + @GetMapping("/auth/login-student/guest/token") + public ResponseEntity loginGuestStudent() { + + return ResponseEntity.ok(new TokenResponse(false, authService.getStudentGuestToken())); + } + + @GetMapping("/auth/login-manager/guest/token") + public ResponseEntity loginGuestManager() { + + return ResponseEntity.ok(new TokenResponse(false, authService.getManagerGuestToken())); + } } \ No newline at end of file From 89a9c9d68fca772661a7d16e8695c9f97237968c Mon Sep 17 00:00:00 2001 From: gomster Date: Fri, 25 Nov 2022 20:58:09 +0900 Subject: [PATCH 121/148] =?UTF-8?q?feat[]=20:=20Department=20Image=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../department/application/dto/DepartmentDto.java | 10 ++++++++-- .../server/hispath/department/domain/Department.java | 2 ++ .../department/presentation/DepartmentController.java | 4 ++-- .../presentation/response/DepartmentResponse.java | 3 ++- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java b/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java index b32e57f..0307f01 100644 --- a/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java +++ b/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java @@ -14,12 +14,18 @@ public class DepartmentDto { private Long id; private String name; + private String profile; + + public DepartmentDto(Long id, String name) { + this.id = id; + this.name = name; + } public static DepartmentDto from (Department department) { - return new DepartmentDto(department.getId(), department.getName()); + return new DepartmentDto(department.getId(), department.getName(), department.getProfile()); } - public static DepartmentDto of(DepartmentCRRequest request) { + public static DepartmentDto from(DepartmentCRRequest request) { return new DepartmentDto(request.getDepartmentId(), request.getName()); } } diff --git a/src/main/java/com/server/hispath/department/domain/Department.java b/src/main/java/com/server/hispath/department/domain/Department.java index ada9921..9eed012 100644 --- a/src/main/java/com/server/hispath/department/domain/Department.java +++ b/src/main/java/com/server/hispath/department/domain/Department.java @@ -30,6 +30,8 @@ public class Department extends BaseEntity { private String name; + private String profile; + public void update(DepartmentDto dto) { this.name = dto.getName(); } diff --git a/src/main/java/com/server/hispath/department/presentation/DepartmentController.java b/src/main/java/com/server/hispath/department/presentation/DepartmentController.java index 33d595d..6d49e92 100644 --- a/src/main/java/com/server/hispath/department/presentation/DepartmentController.java +++ b/src/main/java/com/server/hispath/department/presentation/DepartmentController.java @@ -26,7 +26,7 @@ public class DepartmentController { @RequiredManagerLogin public ResponseEntity create(@RequestBody DepartmentCRRequest request) { - Long savedId = departmentService.create(DepartmentDto.of(request)); + Long savedId = departmentService.create(DepartmentDto.from(request)); return ResponseEntity.ok(savedId); } @@ -56,7 +56,7 @@ public ResponseEntity> findAll() { @ApiOperation(value = ApiDoc.DEPARTMENT_UPDATE) @RequiredManagerLogin public ResponseEntity update(@PathVariable Long id, @RequestBody DepartmentCRRequest request) { - DepartmentDto dto = departmentService.update(id, DepartmentDto.of(request)); + DepartmentDto dto = departmentService.update(id, DepartmentDto.from(request)); DepartmentResponse response = DepartmentResponse.from(dto); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/server/hispath/department/presentation/response/DepartmentResponse.java b/src/main/java/com/server/hispath/department/presentation/response/DepartmentResponse.java index d1b7d8a..7112792 100644 --- a/src/main/java/com/server/hispath/department/presentation/response/DepartmentResponse.java +++ b/src/main/java/com/server/hispath/department/presentation/response/DepartmentResponse.java @@ -13,8 +13,9 @@ public class DepartmentResponse { private Long departmentId; private String name; + private String profile; public static DepartmentResponse from (DepartmentDto dto) { - return new DepartmentResponse(dto.getId(), dto.getName()); + return new DepartmentResponse(dto.getId(), dto.getName(), dto.getProfile()); } } From 120a77913eb67fd1a618d1ef07650dc58c51dfab Mon Sep 17 00:00:00 2001 From: gomster Date: Fri, 25 Nov 2022 20:58:16 +0900 Subject: [PATCH 122/148] =?UTF-8?q?feat=20:=20Major=20Image=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/server/hispath/auth/application/AuthService.java | 2 +- .../com/server/hispath/major/application/dto/MajorDto.java | 3 ++- src/main/java/com/server/hispath/major/domain/Major.java | 1 + .../hispath/major/presentation/response/MajorResponse.java | 3 ++- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/server/hispath/auth/application/AuthService.java b/src/main/java/com/server/hispath/auth/application/AuthService.java index 4e5e288..6d54bee 100644 --- a/src/main/java/com/server/hispath/auth/application/AuthService.java +++ b/src/main/java/com/server/hispath/auth/application/AuthService.java @@ -63,7 +63,7 @@ public OauthUserInfo getManagerInfo(LoginRequestDto loginRequestDto) { public LoginResponseDto studentLogin(LoginRequestDto loginRequestDto) { OauthUserInfo userInfo = getStudentInfo(loginRequestDto); String email = userInfo.getEmail(); - validateEmail(email); +// validateEmail(email); Optional student = studentRepository.findByEmail(email); return student.map(value -> { diff --git a/src/main/java/com/server/hispath/major/application/dto/MajorDto.java b/src/main/java/com/server/hispath/major/application/dto/MajorDto.java index 306f71f..6e95742 100644 --- a/src/main/java/com/server/hispath/major/application/dto/MajorDto.java +++ b/src/main/java/com/server/hispath/major/application/dto/MajorDto.java @@ -11,7 +11,8 @@ public class MajorDto { private Long id; private String name; + private String profile; public static MajorDto from(Major major) { - return new MajorDto(major.getId(), major.getName()); + return new MajorDto(major.getId(), major.getName(), major.getProfile()); } } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/major/domain/Major.java b/src/main/java/com/server/hispath/major/domain/Major.java index 4d0da31..44afc87 100644 --- a/src/main/java/com/server/hispath/major/domain/Major.java +++ b/src/main/java/com/server/hispath/major/domain/Major.java @@ -30,6 +30,7 @@ public class Major extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; + private String profile; public static Major from(MajorContentDto dto){ return Major.builder() diff --git a/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java b/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java index ba3ac5c..514dbda 100644 --- a/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java +++ b/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java @@ -12,8 +12,9 @@ public class MajorResponse { private Long id; private String name; + private String profile; public static MajorResponse from(MajorDto dto) { - return new MajorResponse(dto.getId(), dto.getName()); + return new MajorResponse(dto.getId(), dto.getName(), dto.getProfile()); } } From 2ea1e21fa010c1293b9f4e3706a1b0650fc3f93a Mon Sep 17 00:00:00 2001 From: lukehongg <79990740+lukehongg@users.noreply.github.com> Date: Fri, 25 Nov 2022 21:18:57 +0900 Subject: [PATCH 123/148] test case (#129) --- .../server/hispath/common/TestController.java | 68 +++++++++---------- .../notice/presentation/NoticeController.java | 6 +- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 32664dc..9a8f479 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -364,18 +364,18 @@ private void saveNotice() { .content("

상담 받기 좋은 계절입니다.

 

질문거리, 고민거리는 있지만 어느 교수님께 물어야 할 지 모르겠다면...

교수님께 상담 요청 이메일, 어떻게 써야 할지 몰라 망설여지신다면...

편하게 이것저것 여쭤보고 싶은데 안면 있는 교수님이 없어 막막하시다면...

 

원클릭 컴공 전공상담신청을 이용해보시기 바랍니다!

 

 https://forms.gle/n8mvzfJ51Ahzaujz8

 

접수한 내용을 바탕으로 가능한 빨리 적절한 교수님을 찾아 매칭해드립니다. 

 

학생 이메일 도메인 변경에 따라 Google Form 주소도 업데이트 했으니

참고하시기 바랍니다.

 

- 홍신

") .viewCnt(0) .importance(true) - .pubDate(LocalDate.of(2022, Month.APRIL, 19)) - .expDate(LocalDate.of(2022, Month.APRIL, 26)) + .pubDate(LocalDate.of(2022, Month.NOVEMBER, 19)) + .expDate(LocalDate.of(2023, Month.APRIL, 26)) .build()); noticeRepository.save(Notice.builder() .manager(l.get(2)) .title("2022 BizFlow M Pre-Contest (신청기간연장 ~6.7(화))") - .content("


                                                                                         

 

 ■  접수기간 : 2022년 5월 25일 (수) ~ 6월 7일 (화)

 

 ■  접수링크 : https://docs.google.com/forms/d/1BR9IKalGSdDPKR4Hi6dvW8dpL57dKhvfz0oliJatRno/edit

         

 ■  참가자격

      한동대학교 재학생으로서 다음 사항 중 1개라도 해당되는 팀 (휴학생 팀원 참여 가능)

      1) 팀원 중 BizFlow Camp 수료자가 있는 경우

      2) 팀원 중 이전 BizFlow AppDev Contest 수상자(참가상 포함)가 있는 경우

      3) 팀원 중 BizFlow AppDev 사용 경험자가 있는 경우

      4) 팀원 모두 BizFlow AppDev 사용 경험은 없지만, 웹사이트 제작 경험이 있는 경우 

 

 ■ 컨테스트 내용   

     。사전 제시된 미션을 BizFlow M을 사용하여 구현한 후, 기한 내에 제출함 

     。미션 링크 : https://www.notion.so/HGU-X-AppDev-2022-Precontest-473e3aed71554cf2899238fd49ca3d6b

     。컨테스트 미션에 대한 설명 영상https://youtu.be/od_lQFIrj7g

     。이번 컨테스트 진행 중 질문답변을 위해 다음 링크를 사용하기 바랍니다.    

       클라썸 입장 링크: www.classum.com/EXSTQA 

 

 ■ 팀 구성 : 1~3인으로 팀 구성 (개인 참가 가능)



 ■ 수상팀에게는 여름방학 중에 진행되는 본 컨테스트 출전 자격이 주어집니다.

    1) 최우수상 : 1팀 60만원

     2) 우수상 : 5팀 내외 40만원

     3) 장려상 : 10팀 내외 20만원

     4) 참가상 : 기념품 지급

 

                    * 지적재산권 동의서 양식 첨부파일 확인 


") + .content("\"

■  접수기간 : 2022년 5월 25일 (수) ~ 6월 7일 (화)

 

 ■  접수링크 : https://docs.google.com/forms/d/1BR9IKalGSdDPKR4Hi6dvW8dpL57dKhvfz0oliJatRno/edit

         

 ■  참가자격

      한동대학교 재학생으로서 다음 사항 중 1개라도 해당되는 팀 (휴학생 팀원 참여 가능)

      1) 팀원 중 BizFlow Camp 수료자가 있는 경우

      2) 팀원 중 이전 BizFlow AppDev Contest 수상자(참가상 포함)가 있는 경우

      3) 팀원 중 BizFlow AppDev 사용 경험자가 있는 경우

      4) 팀원 모두 BizFlow AppDev 사용 경험은 없지만, 웹사이트 제작 경험이 있는 경우 

 

 ■ 컨테스트 내용   

     。사전 제시된 미션을 BizFlow M을 사용하여 구현한 후, 기한 내에 제출함 

     。미션 링크 : https://www.notion.so/HGU-X-AppDev-2022-Precontest-473e3aed71554cf2899238fd49ca3d6b

     。컨테스트 미션에 대한 설명 영상 : https://youtu.be/od_lQFIrj7g

     。이번 컨테스트 진행 중 질문답변을 위해 다음 링크를 사용하기 바랍니다.    

       클라썸 입장 링크www.classum.com/EXSTQA 

 

 ■ 팀 구성 : 1~3인으로 팀 구성 (개인 참가 가능)



 ■ 수상팀에게는 여름방학 중에 진행되는 본 컨테스트 출전 자격이 주어집니다.

    1) 최우수상 : 1팀 60만원

     2) 우수상 : 5팀 내외 40만원

     3) 장려상 : 10팀 내외 20만원

     4) 참가상 : 기념품 지급



\"") .viewCnt(0) .importance(true) - .pubDate(LocalDate.of(2022, Month.MAY, 24)) - .expDate(LocalDate.of(2022, Month.MAY, 30)) + .pubDate(LocalDate.of(2022, Month.NOVEMBER, 24)) + .expDate(LocalDate.of(2023, Month.MAY, 30)) .build()); noticeRepository.save(Notice.builder() @@ -384,8 +384,8 @@ private void saveNotice() { .content("

22-2학기 타대학 교환·학점교류를 통해 전산전자공학부공학부의 컴퓨터공학(심화), 전자공학(심화) 전공 학점으로 인정받고자 하는 학생은, 아래의 내용을 확인하시고 사전학점인정원 제출하시기 바랍니다.



1. 신청기간: ~2022.8.14.

     * 각 대학마다 수강신청기간이 다르므로, 본인 대학 수강신청기간 전에 신청 바람



2. 제출서류: 사전학점인정원, 해당 과목 강의계획서



3. 제출방법: csee@handong.edu로 온라인 제출



4. 사전학점인정 절차

  가. 학생이 학부사무실로 사전학점인정원 제출

  나. 해당 전공의 프로그램위원회에서 제출된 자료 검토하여 학점인정 여부 판단

  다. 검토완료 된 사전학점인정원을 학부사무실에서 학생 메일로 송부



5. 유의사항

  가. 각 대학마다 수강신청기간이 다르므로, 사전학점인정 승인 받은 후 수강신청 할 수 있도록 시간 여유를 두고 미리 신청 바람

  나. 본인서명 필수 /  담당교수 확인란은 비워 제출

  다. '해당전공'란은 컴퓨터공학 or 전자공학을 기입

  라. 이전 학기에 학점교류를 통해 전공 인정받은 학생의 경우 아래 내용 함께 제출

    1) 이전 교류대학명: 

    2) 인정 과목명:

    3) 총 인정학점:

  마. 사전학점인정원 승인을 받았더라도, 다른 수강 교과목과 내용이 중복되는 경우 추후 학점인정을 받지 못할 수 있음





문의 : 260-1414 / csee@handong.edu

") .viewCnt(0) .importance(false) - .pubDate(LocalDate.of(2022, Month.JUNE, 2)) - .expDate(LocalDate.of(2022, Month.JUNE, 15)) + .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2)) + .expDate(LocalDate.of(2023, Month.JUNE, 15)) .build()); noticeRepository.save(Notice.builder() @@ -394,8 +394,8 @@ private void saveNotice() { .content("

9/2(금) 15시까지 신청 건 우편 발송되었습니다. 

 

---------------------------------------------------------------------------

 

안녕하세요?

전산전자공학부공학부입니다.



졸업을 진심으로 축하드립니다.\uD83C\uDF89



학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.



우편(착불 4500원 정도)으로 받고자 하는 학생은 

9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.



이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.



<유의사항>

1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.

2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.



감사합니다:D



문의) 전산전자공학부공학부사무실 260-1414

") .viewCnt(0) .importance(true) - .pubDate(LocalDate.of(2022, Month.JUNE, 7)) - .expDate(LocalDate.of(2022, Month.JUNE, 29)) + .pubDate(LocalDate.of(2022, Month.NOVEMBER, 7)) + .expDate(LocalDate.of(2023, Month.JUNE, 29)) .build()); noticeRepository.save(Notice.builder() @@ -404,8 +404,8 @@ private void saveNotice() { .content("

9/2(금) 15시까지 신청 건 우편 발송되었습니다. 

 

---------------------------------------------------------------------------

 

안녕하세요?

전산전자공학부공학부입니다.



졸업을 진심으로 축하드립니다.\uD83C\uDF89



학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.



우편(착불 4500원 정도)으로 받고자 하는 학생은 

9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.



이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.



<유의사항>

1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.

2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.



감사합니다:D



문의) 전산전자공학부공학부사무실 260-1414

") .viewCnt(0) .importance(true) - .pubDate(LocalDate.of(2022, Month.JUNE, 21)) - .expDate(LocalDate.of(2022, Month.JUNE, 27)) + .pubDate(LocalDate.of(2022, Month.NOVEMBER, 21)) + .expDate(LocalDate.of(2023, Month.JUNE, 27)) .build()); noticeRepository.save(Notice.builder() @@ -430,9 +430,9 @@ private void saveNotice() { noticeRepository.save(Notice.builder() .manager(l.get(1)) .title("[전산전자공학부공학부] 2022 CSEE Lab Week에 초대합니다.") - .content("

안녕하세요? \"\uD83D\uDCBB\"

전산전자공학부공학부, 일반대학원 전산전자공학부공학과가 9주차 10/24(월)~10/28(금)에 각 연구실에 대해 알아가고 다양한 연구의 내용을 공유하는 시간을 가지려고 합니다. 



저희 전산전자공학부공학부, 일반대학원 전산전자공학부공학과에서 어떤 주제의 연구들을 진행하고 있는지 Lab설명회, 포스터세션을 통해 이야기를 듣고 싶은 학생들의 많은 참여 바랍니다. 



행사에 참석하면 입시관련된 정보 또한 얻을 수 있으니 AI를 포함한 ICT 관련 분야 진학에 관심있는 모든 학부생들의 참여를 환영합니다. 



\"d24;\"온라인 Lab 멘토링 실시 (기간: 10/24(월)~10/28(금))

(아래 링크접속 후 각 Lab의 오픈카톡방을 통한 자유로운 상담 가능)


https://docs.google.com/document/d/1vPNIac3vfuBxzr3-IsqVqEAFwJtA-6dXiE_RvKhXJHo/edit#

 

 

\"d24;\" Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성

제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.

https://forms.gle/a8XWyqXcTec8vdwq5

 

 

\"d24;\" CSEE Lab Week 행사 참석 희망자(만찬 참여 포함)는 아래 설문지 필수 작성


https://docs.google.com/forms/d/1wkUWbYgcPFFTfrI-M3aOonQYRd_Oq6VHugJx6rVkuRE/edit?pli=1



**10/28(금)** 포스터세션이 종료되고 만찬(오후 5시 예정)이 있을 예정입니다.

만찬은 인원수 제한으로 선착순으로 신청을 받습니다.






\"\uD83C\uDF81\"event\"\uD83C\uDF81\" CSEE Lab Week 참가자 커피쿠폰 증정 

 

 

* 문의: 전산전자공학부공학과 고라경 선생님 (전화: 054-260-3150)

") + .content("

안녕하세요?

전산전자공학부공학부, 일반대학원 전산전자공학부공학과가 9주차 10/24(월)~10/28(금)에 각 연구실에 대해 알아가고 다양한 연구의 내용을 공유하는 시간을 가지려고 합니다. 



저희 전산전자공학부공학부, 일반대학원 전산전자공학부공학과에서 어떤 주제의 연구들을 진행하고 있는지 Lab설명회, 포스터세션을 통해 이야기를 듣고 싶은 학생들의 많은 참여 바랍니다. 



행사에 참석하면 입시관련된 정보 또한 얻을 수 있으니 AI를 포함한 ICT 관련 분야 진학에 관심있는 모든 학부생들의 참여를 환영합니다. 



\"d24;\"온라인 Lab 멘토링 실시 (기간: 10/24(월)~10/28(금))

(아래 링크접속 후 각 Lab의 오픈카톡방을 통한 자유로운 상담 가능)


https://docs.google.com/document/d/1vPNIac3vfuBxzr3-IsqVqEAFwJtA-6dXiE_RvKhXJHo/edit#

 

 

\"d24;\" Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성

제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.

https://forms.gle/a8XWyqXcTec8vdwq5

 

 

\"d24;\" CSEE Lab Week 행사 참석 희망자(만찬 참여 포함)는 아래 설문지 필수 작성


https://docs.google.com/forms/d/1wkUWbYgcPFFTfrI-M3aOonQYRd_Oq6VHugJx6rVkuRE/edit?pli=1



**10/28(금)** 포스터세션이 종료되고 만찬(오후 5시 예정)이 있을 예정입니다.

만찬은 인원수 제한으로 선착순으로 신청을 받습니다.






\"\uD83C\uDF81\"event\"\uD83C\uDF81\" CSEE Lab Week 참가자 커피쿠폰 증정 

 

 

* 문의: 전산전자공학부공학과 고라경 선생님 (전화: 054-260-3150)

") .viewCnt(0) - .importance(true) + .importance(false) .pubDate(LocalDate.of(2022, Month.AUGUST, 5)) .expDate(LocalDate.of(2022, Month.AUGUST, 25)) .build()); @@ -442,26 +442,26 @@ private void saveNotice() { .content("

안녕하세요?

17학번이후인 1전공 컴퓨터공학/AI·컴퓨터공학심화 학생 중 캡스톤디자인 교과목 수강생 및 2023.2월 졸업예정자에게 안내드립니다.

비교과 졸업요건 만족 여부 확인을 위해 첨부 된 양식 작성하여 구글폼으로 제출해주시기 바랍니다.

   * 비교과 졸업요건은 히즈넷-학생 졸업심사화면의 '학부추가졸업요건'에 해당합니다.

   * 해당 학생들에게는 문자로 안내하였습니다.

<17학번부터 적용되는 비교과 졸업요건>

- 산학프로젝트 1개 이상 수행 (산학R&D프로젝트, 또는 산학연계 교과목프로젝트 (예: 캡스톤디자인))

- 캡스톤프로젝트 결과물 등을 특허, 논문, SW시제품 중 한 가지 형태로 1건 이상 제출하여야 함 (공동 출원자/저자 모두 인정).

- 비교과 졸업요건은 캡스톤디자인 과목을 산학 주제로 수행한 결과를 논문 발표, 특허출원, 또는 SW등록함으로써 자연스럽게 충족 가능함.

1. 제출기한: 16주차 금요일(12/16)까지

2. 제출방법: 구글폼(https://forms.gle/Q7X1VfJL176h2TJ38) 제출

  - 23.2월에 졸업하는 경우, 12/16(금)까지 제출하셔야 졸업 가능합니다.(다음학기 ‘학사학위취득유예’ 학생 포함)

  - 23.2월에 졸업하지 않는 경우, 다음 학기에 제출하실 수 있습니다.(구글폼에 '졸업안함' 제출)

3. 참고사항

  가. 이전에 증빙서류로 제출하였던 사례

    1) 논문: 정식 게재된 목차 및 논문 스캔본, 발표 포스터 스캔본

    2) 특허: 특허청의 공식 문서로 출원번호 또는 등록번호와 발명자 정보(주소지 포함)가 기재되어 있는 서류

                 (특허출원서, 특허증, 공개특허공보, 등록특허공보 중 1개 선택)

    3) 시제품제작 (아래 3개 항목 중 1가지 선택)

      가) SW등록: SW등록증, 프로그램등록신청명세서, 저작권 등록증 등

      나) 앱 출시: 출시 된 앱의 스토어 게시 화면 캡쳐 이미지, 앱 출시 확인서 사본 등

      다) 상용서비스 수준 확인 : 산학프로젝트 참여 기업체의 담당자 또는 기업체 멘토가 작성한 시제품 확인서(첨부 양식)

  나. 자주묻는질문

    1) 비교과 졸업요건을 충족하기 위한 결과물은 꼭 캡스톤디자인의 결과물이어야 하나요?

          - 반드시 캡스톤 결과물이어야 할 필요는 없습니다.

    2) 저작권 등록을 한 학생이 대표로 하게되어 등록증에 한명의 이름만 기재되는데 어떻게 하나요?

          - 등록증에 들어있는 제목과 캡스톤 제목이 일치하면 같은 팀원에게 동일하게 적용됩니다.                                            다만, 서류는 개인별로 제출하셔야 합니다.



문의) csee@handong.edu

") .viewCnt(0) .importance(true) - .pubDate(LocalDate.of(2022, Month.AUGUST, 8)) - .expDate(LocalDate.of(2022, Month.DECEMBER, 16)) + .pubDate(LocalDate.of(2022, Month.DECEMBER, 8)) + .expDate(LocalDate.of(2023, Month.DECEMBER, 16)) .build()); noticeRepository.save(Notice.builder() .manager(l.get(0)) .title("[이랜드이노플] 채용설명회 안내 및 수요조사") .content("

안녕하세요:) 반갑습니다.

이랜드이노플 인사팀입니다.



금번 [이랜드이노플X한동대학교] 채용설명회에 참여해주시는 분들께 감사의 의미로 간식 및 기념품을 제공해드리고자 수요조사를 진행하게 되었습니다. 일정은 아래와 같이 진행되며, 참석을 원하시는 분들께서는 본 설문에 응답해주시기를 부탁드립니다:)

 

1. 채용설명회

  가. 일시: 2022.11.16(수) 12:00~12:50

  나. 장소: 뉴턴홀 310호

  다. 참석 혜택

    - 채용설명회에 발걸음 해주시는 학생분들께 아래와 같은 혜택을 드리고자 합니다.

      1) 서류전형 시 가산점 부여

      2) 기념품 제공

      3) Q&A 시간에 학생분들이 궁금해하시는 포인트들을 최대한 답변해드리고자 합니다.

    + (한동대 Only) 간식 제공> [한동대] 이랜드이노플 채용설명회 참여 신청서: https://forms.gle/s9B5JbDPsviRBEoq5

 

2. 채용 안내

  가. 채용일정: 2022.11.4(금)~11.21(월)

  나. 이랜드이노플 채용 관련 링크

    - 채용사이트: https://careers.eland.co.kr/announce/recruit/hxKeGGXNip4urmc1ZmHDz7PJVJ2-

    - Notion 이노플 공채 블로그: https://elandinnople.oopy.io/38d9b929-de4f-46eb-8234-d5b231973e74

    - 네이버블로그: https://blog.naver.com/elandinnople

 

") .viewCnt(0) - .importance(true) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 6)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 26)) + .importance(false) + .pubDate(LocalDate.of(2023, Month.MARCH, 6)) + .expDate(LocalDate.of(2023, Month.SEPTEMBER, 26)) .build()); noticeRepository.save(Notice.builder() .manager(l.get(1)) .title("[대학원] 세미나(11월 11일, 손현우 교수)-아날로그 연산기 기반의 학습가능한 신경망 시스템") - .content("

정보통신대학원 세미나를 소개합니다.

 

이번 세미나는 온.오프라인(한국어 강의)으로 진행 되며, 학부생, 대학원생, 교직원 누구나 참여 가능합니다. 

 

*특강에 참여한 전전 학부생들에게는(대학원생 제외) 소중대 마일리지를 적립해드리니, 관심있는 학생들의 많은 참여 바랍니다. (ZOOM 접속 후 닉네임을 학번, 이름으로 변경 필수!)

 

 

 

 

▶▶세미나5-정보통신대학원 세미나 2022년 2학기

 

 

 

 아날로그 연산기 기반의 학습가능한 신경망

 

손현우 교수

 

경상국립대학교

 

 

 초록



AI 알고리즘의 발전과 함께 IoT를 위한 에너지 효율적인 AI 하드웨어의 필요성이 증가하고 있다. 최근 BinaryNet 알고리즘을 이용하여 추론 과정에서 더 높은 효율을 위한 아날로그 연산기 기반의 하드웨어 가속기 [1] 가 제안되었지만, 학습과 추론이 가능한 AI 하드웨어는 여전히 상대적으로 높은 정확도의 곱셈과 함께 복잡한 학습 과정을 필요로 한다. 또한 인 메모리 하드웨어 구조는 적은 데이터 이동 및 대규모 병렬 동작으로 인하여 높은 에너지 효율과 낮은 지연 시간을 달성할 수 있지만, 아날로그 연산 특성 때문에 PVT 변화에 취약하여 오프라인으로 학습된 가중치를 사용시 상당한 성능저하를 유발할 수 있다. 최근 보고된 온칩 학습 가능한 오토인코더 [2] 와 서포트 벡터 머신 (SVM) [3] 은 소프트웨어로 입증된 AI 알고리즘의 아날로그 연산이 온칩 학습에 성공적으로 사용될 수 있음을 보여주었지만, 단일 오토인코더 유닛 또는 단일 레이어의 SVM으로 응용이 제한되었다. 본 논문 [4] 은 다층 신경망의 학습을 위해 널리 사용되는 오류 역전파 알고리즘을 수행하는 신경망 시스템을 제안한다 (그림. 1). 제안된 시스템의 한 구성 단위로서, 전류형 곱셈누적 연산 (MAC) 프로세서는 병렬 MAC연산으로 순전파 및 역전파를 모두 수행한다. 지도 학습을 위해, 제안된 시스템은 28nm CMOS 기술로 제작된 두 개의 프로세서 칩과 FPGA를 사용하여 두 레이어의 신경망에서 검증되었다. 제안된 시스템은 아날로그 기반 MAC을 위한 보정 회로 없이 동일한 아날로그 기반 MAC을 통해 학습 데이터를 학습함으로써 칩 대 칩 변화 및 아날로그 동작의 불완전성을 보상하였다. 제안된 시스템은 1-b (+1, 0, -1) 배치 업데이트를 사용하여 22×22의 사이즈로 조정된 MNIST 데이터 셋의 분류에서 약 97%의 인식률을 달성하였다.


 

*일시 11월 11일 (금), 16시~


* 장소 NTH412호

*ZOOM https://handong.zoom.us/j/86244954271

*회의ID 862 4495 4271

*문의 4단계 BK21 AI사업단 (260-3150)



") + .content("

한동대학교 BK21 인공지능 사업단

2022학년도 2학기 참여대학원생 등록서류 제출 및 연구장학금 신청 안내

 

 

한동대학교 전산전자공학과 4단계 BK21 ‘산업혁신을 위한 AI 고급 인재교육연구단’ (BK21 인공지능사업단)에서 다음과 같이 등록 서류를 제출하여주시기 바랍니다.

 


1. 4단계 BK21 참여대학원생 기준 (다음의 조건을 모두 충족한 자)

BK21 참여교수의 지도학생 중 전일제(4대보험에 가입되어 있지 않은 학생)로 등록(연구생 등록 포함)한 석·박사과정 대학원생으로 다음 각 호에 해당하는 자

-입학한 지 2년이 지나지 않은 석사과정생

-입학한 지 4년이 지나지 않은 박사과정생 및 박사 수료생

-입학한 지 6년이 지나지 않은 석박통합과정생 및 석박통합과정 수료생

(위의 기간 기산 시 휴학 및 군복무 기간은 제외함).

 

위의 자격을 충족한 경우 ‘참여대학원생’으로 등록되어 ‘지원대학원생’ 선발 기회 등 BK21 사업의 지원을 받을 수 있음.

 

2. 지원대학원생 선발 및 연구장학금 지급

1) 참여대학원생으로 등록된 학생 중 70% 이내의 대학원생을 ‘지원대학원생’으로 선발해 연구장학금을 지급함.

2) 지원기간: 2022.09.01.~2023.02.28. (6개월 단위로 선발)

3) 선발기준: 지도교수 추천을 받은 참여대학원생 중 연구/프로젝트 성과 평가에 의해 선발

4) 역할 및 임무

- BK21 참여교수 연구실에서 논문 연구 및 산학 프로젝트를 성실히 수행 (주 40시간 이상)

- 사업단이 주관하는 각종 세미나, 포럼 등의 학술 활동에 참여

- 사업단이 요구하는 성과 자료 보고

 


3. 참여대학원생 등록서류 제출안내(등록서류는 단순참여, 장학금 지원 받는 학생 모두 제출해주세요.)

1) 첨부된 제출서류 다운 및 작성 후 BK21 사업단 사무실로 서류 제출.

2) 지도교수로부터 지원대학원생(장학금 받는 학생)으로 추천받은 대학원생은 5.제출서류 함께 제출

 

4. 서류 제출 기간: 2022년 8월 29일(월) 13:00 - 9월 7일(수) 17:00 (제출기한 엄수)




5. 제출서류

- 연구자등록번호 발급 방법

: KRI(한국연구업적통합정보시스템 http://www.kri.go.kr)에 접속 회원가입→연구자등록번호 발급 

  (가입 시 소속을 반드시 ‘한동대학교’로 가입) 



1) 재학증명서 1부. 연구생등록자의 경우 연구생등록증 1부(2022년 9월 1일자 기준으로 제출)

2) 개인정보 수집 이용 제공 동의서 1부. (BK사업에 처음 참여하는 학생만 제출)

3) 참여인력 서약서 1부. 

4) 참여대학원생 확약서 1부.

5) BK21 연구장학금 신청서 1부. (지원대학원생-BK장학금 받는 학생만 제출)

6) 전산전자공학과 학기 보고서 1부.

7) 재학증명서 1부.(9월 1일 기준)

 

8) 연구재단 필수 제출 서류 '4대 보험 가입 증명서' 1부. (22.10.1일 기준일로하여 메일로 회신)

(**10월1일 기준으로 출력 후 제출 바랍니다. 9월에는 제출하지 않아도 됩니다!)

- 출력 방법: 4대 사회보험 포털서비스(http://www.4insure.or.kr) 로그인(회원가입, 공인인증서 필요) → 상단 메뉴 증명서발급(가입내역확인) 클릭 후 출력

 

9) 대학원 성적표 1부. (신입생은 제출X)

 

<한국연구재단 필수 수강!!-참여기간 중 1회 수강 후 수료증 제출해야함, 교육 미이수자 및  22-2학기 신입생만 수강하면 됩니다.>

10) 온라인 교육 수료증 (http://alpha-campus.kr/) 에 접속하여 로그인 후 상단 메뉴의 '탐색'->'온라인교육' -> '건강한 연구환경 조성을 위한 인권침해예방교육'클릭 ->'수강신청' 클릭 후 팝업창에서 수강신청 정보 확인 및 '신청완료'-> '학습'-> '학습중과정'-> '건강한 연구환경 조성을 위한 인권침해예방교육' 순서대로 클릭 후 '학습하기'

컨텐츠 수강 후 ‘MY'-> '학습이력'클릭 후 수료증 발급 및 보관) 

*수료증은 메일로 회신부탁합니다. 

 

11) 통장사본 및 신분증 사본 각 1부.

 

※ 외국인 참여대학원생의 경우 외국인 등록증 앞, 뒤 사본(D-2비자 여부 및 만료기한 확인) 제출.

※ 기존 참여대학원생이 지원할 경우: 2)개인정보 수집 이용 제공 동의서, 10)온라인 교육 수료증 제출 생략.

 

6. 서류 제출 및 문의처

1) BK21사업단 사무실: 뉴턴홀 309호 전산전자공학부 사무실 담당자 고라경(Tel: 260-3150)

2) 신청 시 모든 서류는 위 제출서류 순서대로 정리하여 원본 제출 바랍니다.

 

7. 유의사항: 제출된 서류는 반환하지 않으며, 허위사실 기재 시 선발을 취소함.

") .viewCnt(0) - .importance(true) - .pubDate(LocalDate.of(2022, Month.SEPTEMBER, 9)) - .expDate(LocalDate.of(2022, Month.SEPTEMBER, 15)) + .importance(false) + .pubDate(LocalDate.of(2023, Month.FEBRUARY, 9)) + .expDate(LocalDate.of(2023, Month.SEPTEMBER, 15)) .build()); noticeRepository.save(Notice.builder() .manager(l.get(2)) @@ -475,12 +475,12 @@ private void saveNotice() { noticeRepository.save(Notice.builder() .manager(l.get(3)) - .title("\"일본 IT 강독\" 2022년 2학기 첫번쨰 모임이 이번주 수요일 11월 09일 저녁 8시에 열립니다.") - .content("

 \"일본 IT 강독\"   2022년 2학기 첫번? 모임이 이번주  수요일 11월 09일 저녁 8시에 열립니다.



2022년2학기 일본IT학회 주관 \"일본 IT 강독\"



일본의  IT시스템 개발문서, IT 트렌드 관련 일본어 기사 등을 같이 읽어 나가는 시간입니다. 일본은 IT시스템 개발과정에서 Documentation을 아주 철저히 하고 있습니다. 따라서 일본 IT 취업시 일본어를 읽고 쓰는 능력은 회화능력 이상으로 중요합니다. IT관련 일본어 문서를 읽어나가며 일본어를 더 공부하고 싶게 하고자 합니다.



본 시간은 22년이상 일본에서 IT개발자로서 일본인들과 함께 일해오신 일본 도레이쿠 김종환 대표님이 직접 강의합니다.



참여자격 : 일본어 초급 수준(한동대학교 일본어  I 수강 수준)



일정

제 1 차 모임. 11월 09일(수 저녁 8시) 11주차 

제 2 차 모임. 11월 23일(수 저녁 8시) 13주차 

 

줌 접속 주소

https://handong.zoom.us/j/82808657679



- 참석자에게는 마일리지가 부여됩니다.

- 문의 : 김기석 교수(peterkim@handong.edu) ,박훈성(01043417017 / 21800333@handong.ac.kr) 

") + .title("일본 IT 강독 2022년 2학기 첫번쨰 모임이 이번주 수요일 11월 09일 저녁 8시에 열립니다.") + .content("

 일본 IT 강독   2022년 2학기 첫번? 모임이 이번주  수요일 11월 09일 저녁 8시에 열립니다.



2022년2학기 일본IT학회 주관 \"일본 IT 강독\"



일본의  IT시스템 개발문서, IT 트렌드 관련 일본어 기사 등을 같이 읽어 나가는 시간입니다. 일본은 IT시스템 개발과정에서 Documentation을 아주 철저히 하고 있습니다. 따라서 일본 IT 취업시 일본어를 읽고 쓰는 능력은 회화능력 이상으로 중요합니다. IT관련 일본어 문서를 읽어나가며 일본어를 더 공부하고 싶게 하고자 합니다.



본 시간은 22년이상 일본에서 IT개발자로서 일본인들과 함께 일해오신 일본 도레이쿠 김종환 대표님이 직접 강의합니다.



참여자격 : 일본어 초급 수준(한동대학교 일본어  I 수강 수준)



일정

제 1 차 모임. 11월 09일(수 저녁 8시) 11주차 

제 2 차 모임. 11월 23일(수 저녁 8시) 13주차 

 

줌 접속 주소

https://handong.zoom.us/j/82808657679



- 참석자에게는 마일리지가 부여됩니다.

- 문의 : 김기석 교수(peterkim@handong.edu) ,박훈성(01043417017 / 21800333@handong.ac.kr) 

") .viewCnt(0) .importance(true) - .pubDate(LocalDate.of(2022, Month.NOVEMBER, 1)) - .expDate(LocalDate.of(2022, Month.NOVEMBER, 7)) + .pubDate(LocalDate.of(2023, Month.JANUARY, 1)) + .expDate(LocalDate.of(2023, Month.JULY, 7)) .build()); noticeRepository.save(Notice.builder() .manager(l.get(2)) @@ -493,30 +493,30 @@ private void saveNotice() { .build()); noticeRepository.save(Notice.builder() .manager(l.get(3)) - .title("SW Festival ends") - .content("See you next year!") + .title(" 2022 한동대 C프로그래밍 컨테스트 안내") + .content("
  • 일시 : 2022년 12월 9일 15주차 금요일 오후 8시~10시(120분)

  • 대상 : 전교생 중 1학년 또는 SW관련 전공이 아닌 학생

  • 시험방법 : Replit.com 사이트에 온라인 접속 후 문제를 풀어 제출함(시험 중 구글링 또는 본인의 소스 참조 가능, 타인과 대화, 메시징, 이메일 금지)

  • 출제범위 : C프로그래밍 수업 전반

  • 문제 수 : 10문제 이내



▶ 컨테스트 관련 질문응답 : www.classum.com/EXZRQI 



▶ 시험 서버 접속 및 테스트 문제 풀이 : 2022년 12월 9일(금) 18시까지

  • Replit.com 링크에 접속한다. (Chrome 사용 권장)

  • https://replit.com/teams/join/whodntufxzxetztsmzbadhqtdqrfbzpn-HGUCContest

  • 만일 회원가입이 되어 있지 않다면 가입 후 로그인한다.

  • 본인 Profile에서 반드시 First name에 자신의 한글이름, Last name에 자신의 학번8자리를 기입할 것. (인적사항 확인불가 시 수상 제외)

  • 회원가입 후 이메일주소 인증할 것

  • 테스트용 문제를 확인하고, 문제를 해결하는 코드를 작성하여 실행해본다.

  • 테스트케이스를 실행해본 후, 제출(submit)한다.



▶ 컨테스트 참여 시 주의사항

  • 시험 시작 전에 Replit.com 링크에 접속한다. (Chrome 사용 권장)

  • https://replit.com/teams/join/whodntufxzxetztsmzbadhqtdqrfbzpn-HGUCContest

  • 시작시간이 되면 문제가 공개됩니다. (새로고침 필수)

  • 제한 시간 내에 공개된 문제를 최대한 해결하여 테스트케이스를 실행한 후, 제출(submit)한다. 반드시 순서대로 문제를 풀지 않아도 됨

  • 다음의 경우에는 제출 무효로 처리됨

    • Due date가 지난 후, 제출하는 경우

    • Due date가 지난 후, 문제를 다시 열어 보는 경우

    • Due date가 지난 후, 자신의 코드를 수정한 경우

    • 동일계정으로 동시에 2개 이상의 Replit.com 접속한 경우

▶ 채점 기준

  • 기준 1 : 성공적으로 해결하여 테스트케이스 모두 통과한 후, 제출한 문제 갯수가 많은 순

  • 기준 2 : 해결한 모든 문제의 평균제출시간이 빠른 순

  • 기준 3 : 미완성 제출 경우 통과된 테스트 케이스가 많은 순



▶ 참가자 혜택

  • 1문제 이상을 성공 제출한 모든 참가자에게 소중대 마일리지 적립

  • 우수자에게는 상금 지급 (1학년 또는 SW전공이력이 없는 학생만 수상)

    • 총상금 200만원

    • 대상 1명 : 20만원

    • 최우수상 5명 내외 : 각 15만원

    • 우수상 10명 내외 : 각 10만원

    • 장려상 : 각 5만원

  • 수상 규모는 변동될 수 있음



") .viewCnt(0) .importance(true) .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2)) - .expDate(LocalDate.of(2022, Month.NOVEMBER, 9)) + .expDate(LocalDate.of(2023, Month.NOVEMBER, 9)) .build()); noticeRepository.save(Notice.builder() .manager(l.get(2)) .title("[지역선도대학] 2022 대경권 대학생 AI프로그래밍 경진대회 개최") .content("

2022 대경권 대학생 AI프로그래밍 경진대회 개최 









지역선도대학육성사업에서는 재학생들의 인공지능(AI) 컴퓨팅 사고역량, 프로그래밍 역량 문제해결 역량 강화 등을 위하여 2022 대경권 대학생 AI프로그래밍 경진대회를 개최합니다.





■ 접수기간: 2022. 10. 26.(수) ~ 11. 9.(수) 까지 

■ 접수방법: 대회 홈페이지에서 직접 신청(참가비 무료)



대회 홈페이지 주소 및 자세한 내용은 지역선도대학육성사업 홈페이지 → 온라인신청 → 진행프로그램에서 가능

(https://spoke.knu.ac.kr/03_sub/01_sub.html)



■ 문의 : 안영은 연구원(054-260-3124, aye3384@handong.edu)

") .viewCnt(0) - .importance(true) - .pubDate(LocalDate.of(2022, Month.OCTOBER, 21)) - .expDate(LocalDate.of(2022, Month.OCTOBER, 27)) + .importance(false) + .pubDate(LocalDate.of(2023, Month.OCTOBER, 21)) + .expDate(LocalDate.of(2023, Month.OCTOBER, 27)) .build()); noticeRepository.save(Notice.builder() .manager(l.get(0)) .title("[CSEE Lab Week] Lab 토크쇼 관련 사전 질문") .content("

안녕하세요. 컴퓨터 공학 전공 주임 안민규 교수입니다.

 

이전 글에 공지된 것처럼 다음 주 9주차에는 전산전자공학부공학부/전산전자공학부공학과가 CSEE Lab Week가 진행됩니다.

관련 글> https://hisnet.handong.edu/myboard/read.php?id=35135&Board=B0029

 

연구실에 관심이 있거나, 2023-1학기 공학프로젝트 기획 수강을 계획하는 학생들에게는 큰 도움이 될 것 같습니다.

 

 

각 연구실에 대하여 궁금한 점은 9주차 동안 진행되는 Lab 멘토링을 통해 문의하고 답변을 받기 바랍니다.

또한, 목요일 18:30에는 CSEE 연구실, 연구실 생활, 졸업 프로젝트, 진로 등에 관하여 이야기를 교수님들과 나눌 수 있는 자리를 마련하였으니 많은 학생들이 참여하여 정보를 얻는 시간이 되길 빕니다.

 

 

관련하여 현재 사전 질문을 받고 있습니다. 아래의 링크를 통하여 묻고 싶은 사항을 남겨주시기 바랍니다.

 

 

\"d24;\" Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성

제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.

https://forms.gle/a8XWyqXcTec8vdwq5

 

 

 

 

안민규 교수.

") .viewCnt(0) - .importance(true) + .importance(false) .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2)) - .expDate(LocalDate.of(2022, Month.NOVEMBER, 9)) + .expDate(LocalDate.of(2023, Month.NOVEMBER, 9)) .build()); } diff --git a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java index dd18fa5..deeef36 100644 --- a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java +++ b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java @@ -1,5 +1,7 @@ package com.server.hispath.notice.presentation; +import com.server.hispath.auth.domain.LoginManager; +import com.server.hispath.auth.domain.ManagerLogin; import com.server.hispath.auth.domain.RequiredLogin; import com.server.hispath.auth.domain.RequiredManagerLogin; import com.server.hispath.docs.ApiDoc; @@ -33,8 +35,8 @@ public class NoticeController { @PostMapping("/notice/add") @ApiOperation(value= ApiDoc.NOTICE_CREATE) @RequiredManagerLogin - public ResponseEntity create(@RequestBody NoticeRequest request){ - Long id = noticeService.create(request.getManagerId(), NoticeContentDto.from(request)); + public ResponseEntity create(@ManagerLogin LoginManager loginManager, @RequestBody NoticeRequest request){ + Long id = noticeService.create(loginManager.getId(), NoticeContentDto.from(request)); return ResponseEntity.ok(id); } From f90dac033f9ced1adf6adb8d84d3bcf86093161b Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 29 Nov 2022 01:42:10 +0900 Subject: [PATCH 124/148] =?UTF-8?q?hotfix=20:=20Excel=20upload=20=EB=90=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20API=20Request=20Part=20=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/activity/presentation/MActivityController.java | 2 +- .../server/hispath/student/presentation/StudentController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java index d3a0205..bf7df9a 100644 --- a/src/main/java/com/server/hispath/activity/presentation/MActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/MActivityController.java @@ -48,7 +48,7 @@ public ResponseEntity create(@RequestBody MActivityCURequest request) { @PostMapping("/mileages") @ApiOperation(value = ApiDoc.MILEAGES_CREATE) @RequiredSuperManagerLogin - public ResponseEntity createMActivites(@RequestPart(value = "file", required = false) MultipartFile file) throws Exception { + public ResponseEntity createMActivites(@RequestPart(value = "file") MultipartFile file) throws Exception { mActivityService.createAll(ExcelManager.getMActivities(ExcelManager.extract(file))); return ResponseEntity.ok(null); } diff --git a/src/main/java/com/server/hispath/student/presentation/StudentController.java b/src/main/java/com/server/hispath/student/presentation/StudentController.java index 403c3e4..3166d91 100644 --- a/src/main/java/com/server/hispath/student/presentation/StudentController.java +++ b/src/main/java/com/server/hispath/student/presentation/StudentController.java @@ -53,7 +53,7 @@ public ResponseEntity create(@RequestBody StudentCURequest request) { @PostMapping("/students") @ApiOperation(value = ApiDoc.STUDENTS_CREATE) @RequiredManagerLogin - public ResponseEntity createStudents(MultipartFile file) throws Exception { + public ResponseEntity createStudents(@RequestPart("file") MultipartFile file) throws Exception { studentService.createAll(ExcelManager.getStudentDatas(ExcelManager.extract(file))); return ResponseEntity.ok(null); } From 14a8cae4e106397aabf181184083209e87c7b673 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 29 Nov 2022 13:37:59 +0900 Subject: [PATCH 125/148] =?UTF-8?q?hotfix=20:=20=EC=97=91=EC=85=80=20impor?= =?UTF-8?q?t=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=9C=84=ED=95=B4=20?= =?UTF-8?q?=EB=A1=9C=EA=B9=85=EC=9D=84=20=EB=A9=88=EC=B6=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/GlobalExceptionHandler.java | 14 +- .../server/hispath/filters/LoggingFilter.java | 218 +++++++++--------- .../hispath/filters/RequestWrapper.java | 108 ++++----- .../hispath/filters/ResponseWrapper.java | 22 +- .../resources/{logback-spring.xml => a.txt} | 0 5 files changed, 181 insertions(+), 181 deletions(-) rename src/main/resources/{logback-spring.xml => a.txt} (100%) diff --git a/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java b/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java index fd7dc9d..90d21f3 100644 --- a/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java @@ -11,16 +11,16 @@ @ControllerAdvice public class GlobalExceptionHandler { - private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); +// private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(HisPathException.class) public ResponseEntity hisPathException(HisPathException e) { - if (e.getHttpStatus().is4xxClientError()) { - logger.info("Client Error : " + e.getMessage()); - } else if (e.getHttpStatus().is5xxServerError()) { - logger.error("Server Error : " + e.getMessage()); - } +// if (e.getHttpStatus().is4xxClientError()) { +// logger.info("Client Error : " + e.getMessage()); +// } else if (e.getHttpStatus().is5xxServerError()) { +// logger.error("Server Error : " + e.getMessage()); +// } return ResponseEntity.status(e.getHttpStatus()) .body(new ExceptionResponse(e.getMessage())); @@ -29,7 +29,7 @@ public ResponseEntity hisPathException(HisPathException e) { @ExceptionHandler(Exception.class) public ResponseEntity commonException(Exception e) { - logger.error("Unknown Exception : " + e.getMessage()); +// logger.error("Unknown Exception : " + e.getMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ExceptionResponse(e.getMessage())); diff --git a/src/main/java/com/server/hispath/filters/LoggingFilter.java b/src/main/java/com/server/hispath/filters/LoggingFilter.java index fe003a8..f373485 100644 --- a/src/main/java/com/server/hispath/filters/LoggingFilter.java +++ b/src/main/java/com/server/hispath/filters/LoggingFilter.java @@ -1,109 +1,109 @@ -package com.server.hispath.filters; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.UUID; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.util.StreamUtils; -import org.springframework.web.filter.OncePerRequestFilter; -import org.springframework.web.util.ContentCachingResponseWrapper; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - -@Component -public class LoggingFilter extends OncePerRequestFilter { - protected static final Logger log = LoggerFactory.getLogger(LoggingFilter.class); - - @Override - public void doFilterInternal( - HttpServletRequest request, - HttpServletResponse response, - FilterChain filterChain - ) throws ServletException, IOException { - - MDC.put("traceId", UUID.randomUUID().toString()); - doFilterWrapped(new RequestWrapper(request), new ResponseWrapper(response), filterChain); - MDC.clear(); - } - - public void doFilterWrapped( - RequestWrapper request, - ContentCachingResponseWrapper response, - FilterChain filterChain - ) throws ServletException, IOException { - - try { - logRequest(request); - filterChain.doFilter(request, response); - } finally { - logResponse(response); - response.copyBodyToResponse(); - } - } - - private static void logRequest(RequestWrapper request) throws IOException { - String queryString = request.getQueryString(); - String requestURI = request.getRequestURI(); - if (!Objects.isNull(queryString)) { - requestURI += queryString; - } - log.info("Request : {} uri=[{}] content-type=[{}]", - request.getMethod(), - requestURI, - request.getContentType() - ); - - logPayload("Request", request.getContentType(), request.getInputStream()); - } - - private static void logResponse(ContentCachingResponseWrapper response) throws IOException { - logPayload("Response", response.getContentType(), response.getContentInputStream()); - } - - private static void logPayload(String prefix, String contentType, InputStream inputStream) throws IOException { - if (Objects.isNull(contentType)) { - contentType = "application/json"; - } - - boolean visible = isVisible(MediaType.valueOf(contentType)); - if (visible) { - logContentPayload(prefix, inputStream); - return; - } - log.info("{} Payload: Binary Content", prefix); - } - - private static void logContentPayload(String prefix, InputStream inputStream) throws IOException { - byte[] content = StreamUtils.copyToByteArray(inputStream); - if (content.length > 0) { - String contentString = new String(content); - log.info("{} Payload: {}", prefix, contentString); - } - } - - private static boolean isVisible(MediaType mediaType) { - final List VISIBLE_TYPES = Arrays.asList( - MediaType.valueOf("text/*"), - MediaType.APPLICATION_FORM_URLENCODED, - MediaType.APPLICATION_JSON, - MediaType.APPLICATION_XML, - MediaType.valueOf("application/*+json"), - MediaType.valueOf("application/*+xml"), - MediaType.MULTIPART_FORM_DATA - ); - - return VISIBLE_TYPES.stream() - .anyMatch(visibleType -> visibleType.includes(mediaType)); - } -} \ No newline at end of file +//package com.server.hispath.filters; +// +//import java.io.IOException; +//import java.io.InputStream; +//import java.util.Arrays; +//import java.util.List; +//import java.util.Objects; +//import java.util.UUID; +//import javax.servlet.FilterChain; +//import javax.servlet.ServletException; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +// +//import org.springframework.http.MediaType; +//import org.springframework.stereotype.Component; +//import org.springframework.util.StreamUtils; +//import org.springframework.web.filter.OncePerRequestFilter; +//import org.springframework.web.util.ContentCachingResponseWrapper; +// +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.slf4j.MDC; +// +//@Component +//public class LoggingFilter extends OncePerRequestFilter { +// protected static final Logger log = LoggerFactory.getLogger(LoggingFilter.class); +// +// @Override +// public void doFilterInternal( +// HttpServletRequest request, +// HttpServletResponse response, +// FilterChain filterChain +// ) throws ServletException, IOException { +// MDC.put("traceId", UUID.randomUUID().toString()); +// doFilterWrapped(new RequestWrapper(request), new ResponseWrapper(response), filterChain); +// MDC.clear(); +// } +// +// public void doFilterWrapped( +// RequestWrapper request, +// ContentCachingResponseWrapper response, +// FilterChain filterChain +// ) throws ServletException, IOException { +// +// try { +// logRequest(request); +// filterChain.doFilter(request, response); +// } finally { +// logResponse(response); +// response.copyBodyToResponse(); +// } +// } +// +// private static void logRequest(RequestWrapper request) throws IOException { +// String queryString = request.getQueryString(); +// String requestURI = request.getRequestURI(); +// if (!Objects.isNull(queryString)) { +// requestURI += queryString; +// } +// log.info("Request : {} uri=[{}] content-type=[{}]", +// request.getMethod(), +// requestURI, +// request.getContentType() +// ); +// +// logPayload("Request", request.getContentType(), request.getInputStream()); +// } +// +// private static void logResponse(ContentCachingResponseWrapper response) throws IOException { +// logPayload("Response", response.getContentType(), response.getContentInputStream()); +// } +// +// private static void logPayload(String prefix, String contentType, InputStream inputStream) throws IOException { +// if (Objects.isNull(contentType)) { +// contentType = "application/json"; +// } +// System.out.println("checkContentType"); +// System.out.println(contentType); +// boolean visible = isVisible(MediaType.valueOf(contentType)); +// if (visible) { +// logContentPayload(prefix, inputStream); +// return; +// } +// log.info("{} Payload: Binary Content", prefix); +// } +// +// private static void logContentPayload(String prefix, InputStream inputStream) throws IOException { +// byte[] content = StreamUtils.copyToByteArray(inputStream); +// if (content.length > 0) { +// String contentString = new String(content); +// log.info("{} Payload: {}", prefix, contentString); +// } +// } +// +// private static boolean isVisible(MediaType mediaType) { +// final List VISIBLE_TYPES = Arrays.asList( +// MediaType.valueOf("text/*"), +// MediaType.APPLICATION_FORM_URLENCODED, +// MediaType.APPLICATION_JSON, +// MediaType.APPLICATION_XML, +// MediaType.valueOf("application/*+json"), +// MediaType.valueOf("application/*+xml"), +// MediaType.MULTIPART_FORM_DATA +// ); +// +// return VISIBLE_TYPES.stream() +// .anyMatch(visibleType -> visibleType.includes(mediaType)); +// } +//} \ No newline at end of file diff --git a/src/main/java/com/server/hispath/filters/RequestWrapper.java b/src/main/java/com/server/hispath/filters/RequestWrapper.java index 339490b..88e1033 100644 --- a/src/main/java/com/server/hispath/filters/RequestWrapper.java +++ b/src/main/java/com/server/hispath/filters/RequestWrapper.java @@ -1,54 +1,54 @@ -package com.server.hispath.filters; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import javax.servlet.ReadListener; -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletRequestWrapper; - -import org.springframework.util.StreamUtils; - -public class RequestWrapper extends HttpServletRequestWrapper { - - private byte[] cachedInputStream; - - public RequestWrapper(HttpServletRequest request) throws IOException { - super(request); - InputStream requestInputStream = request.getInputStream(); - this.cachedInputStream = StreamUtils.copyToByteArray(requestInputStream); - } - - @Override - public ServletInputStream getInputStream() { - return new ServletInputStream() { - private InputStream cachedBodyInputStream = new ByteArrayInputStream(cachedInputStream); - - @Override - public boolean isFinished() { - try { - return cachedBodyInputStream.available() == 0; - } catch (IOException e) { - e.printStackTrace(); - } - return false; - } - - @Override - public boolean isReady() { - return true; - } - - @Override - public void setReadListener(ReadListener readListener) { - throw new UnsupportedOperationException(); - } - - @Override - public int read() throws IOException { - return cachedBodyInputStream.read(); - } - }; - } -} +//package com.server.hispath.filters; +// +//import java.io.ByteArrayInputStream; +//import java.io.IOException; +//import java.io.InputStream; +//import javax.servlet.ReadListener; +//import javax.servlet.ServletInputStream; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletRequestWrapper; +// +//import org.springframework.util.StreamUtils; +// +//public class RequestWrapper extends HttpServletRequestWrapper { +// +// private byte[] cachedInputStream; +// +// public RequestWrapper(HttpServletRequest request) throws IOException { +// super(request); +// InputStream requestInputStream = request.getInputStream(); +// this.cachedInputStream = StreamUtils.copyToByteArray(requestInputStream); +// } +// +// @Override +// public ServletInputStream getInputStream() { +// return new ServletInputStream() { +// private InputStream cachedBodyInputStream = new ByteArrayInputStream(cachedInputStream); +// +// @Override +// public boolean isFinished() { +// try { +// return cachedBodyInputStream.available() == 0; +// } catch (IOException e) { +// e.printStackTrace(); +// } +// return false; +// } +// +// @Override +// public boolean isReady() { +// return true; +// } +// +// @Override +// public void setReadListener(ReadListener readListener) { +// throw new UnsupportedOperationException(); +// } +// +// @Override +// public int read() throws IOException { +// return cachedBodyInputStream.read(); +// } +// }; +// } +//} diff --git a/src/main/java/com/server/hispath/filters/ResponseWrapper.java b/src/main/java/com/server/hispath/filters/ResponseWrapper.java index 0c88e01..5afea76 100644 --- a/src/main/java/com/server/hispath/filters/ResponseWrapper.java +++ b/src/main/java/com/server/hispath/filters/ResponseWrapper.java @@ -1,11 +1,11 @@ -package com.server.hispath.filters; - -import javax.servlet.http.HttpServletResponse; - -import org.springframework.web.util.ContentCachingResponseWrapper; - -public class ResponseWrapper extends ContentCachingResponseWrapper { - public ResponseWrapper(HttpServletResponse response) { - super(response); - } -} \ No newline at end of file +//package com.server.hispath.filters; +// +//import javax.servlet.http.HttpServletResponse; +// +//import org.springframework.web.util.ContentCachingResponseWrapper; +// +//public class ResponseWrapper extends ContentCachingResponseWrapper { +// public ResponseWrapper(HttpServletResponse response) { +// super(response); +// } +//} \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/a.txt similarity index 100% rename from src/main/resources/logback-spring.xml rename to src/main/resources/a.txt From 5fce17874a1cca5f1f2feeb64e12ccf86a7f1479 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 29 Nov 2022 15:39:07 +0900 Subject: [PATCH 126/148] =?UTF-8?q?hotfix=20:=20logging=20with=20file=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/hispath/filters/LoggingFilter.java | 238 ++++++++++-------- .../hispath/filters/RequestWrapper.java | 108 ++++---- .../hispath/filters/ResponseWrapper.java | 22 +- .../resources/{a.txt => logback-spring.xml} | 0 4 files changed, 194 insertions(+), 174 deletions(-) rename src/main/resources/{a.txt => logback-spring.xml} (100%) diff --git a/src/main/java/com/server/hispath/filters/LoggingFilter.java b/src/main/java/com/server/hispath/filters/LoggingFilter.java index f373485..4ecd5e8 100644 --- a/src/main/java/com/server/hispath/filters/LoggingFilter.java +++ b/src/main/java/com/server/hispath/filters/LoggingFilter.java @@ -1,109 +1,129 @@ -//package com.server.hispath.filters; -// -//import java.io.IOException; -//import java.io.InputStream; -//import java.util.Arrays; -//import java.util.List; -//import java.util.Objects; -//import java.util.UUID; -//import javax.servlet.FilterChain; -//import javax.servlet.ServletException; -//import javax.servlet.http.HttpServletRequest; -//import javax.servlet.http.HttpServletResponse; -// -//import org.springframework.http.MediaType; -//import org.springframework.stereotype.Component; -//import org.springframework.util.StreamUtils; -//import org.springframework.web.filter.OncePerRequestFilter; -//import org.springframework.web.util.ContentCachingResponseWrapper; -// -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.slf4j.MDC; -// -//@Component -//public class LoggingFilter extends OncePerRequestFilter { -// protected static final Logger log = LoggerFactory.getLogger(LoggingFilter.class); -// -// @Override -// public void doFilterInternal( -// HttpServletRequest request, -// HttpServletResponse response, -// FilterChain filterChain -// ) throws ServletException, IOException { -// MDC.put("traceId", UUID.randomUUID().toString()); -// doFilterWrapped(new RequestWrapper(request), new ResponseWrapper(response), filterChain); -// MDC.clear(); -// } -// -// public void doFilterWrapped( -// RequestWrapper request, -// ContentCachingResponseWrapper response, -// FilterChain filterChain -// ) throws ServletException, IOException { -// -// try { -// logRequest(request); -// filterChain.doFilter(request, response); -// } finally { -// logResponse(response); -// response.copyBodyToResponse(); -// } -// } -// -// private static void logRequest(RequestWrapper request) throws IOException { -// String queryString = request.getQueryString(); -// String requestURI = request.getRequestURI(); -// if (!Objects.isNull(queryString)) { -// requestURI += queryString; -// } -// log.info("Request : {} uri=[{}] content-type=[{}]", -// request.getMethod(), -// requestURI, -// request.getContentType() -// ); -// -// logPayload("Request", request.getContentType(), request.getInputStream()); -// } -// -// private static void logResponse(ContentCachingResponseWrapper response) throws IOException { -// logPayload("Response", response.getContentType(), response.getContentInputStream()); -// } -// -// private static void logPayload(String prefix, String contentType, InputStream inputStream) throws IOException { -// if (Objects.isNull(contentType)) { -// contentType = "application/json"; -// } -// System.out.println("checkContentType"); -// System.out.println(contentType); -// boolean visible = isVisible(MediaType.valueOf(contentType)); -// if (visible) { -// logContentPayload(prefix, inputStream); -// return; -// } -// log.info("{} Payload: Binary Content", prefix); -// } -// -// private static void logContentPayload(String prefix, InputStream inputStream) throws IOException { -// byte[] content = StreamUtils.copyToByteArray(inputStream); -// if (content.length > 0) { -// String contentString = new String(content); -// log.info("{} Payload: {}", prefix, contentString); -// } -// } -// -// private static boolean isVisible(MediaType mediaType) { -// final List VISIBLE_TYPES = Arrays.asList( -// MediaType.valueOf("text/*"), -// MediaType.APPLICATION_FORM_URLENCODED, -// MediaType.APPLICATION_JSON, -// MediaType.APPLICATION_XML, -// MediaType.valueOf("application/*+json"), -// MediaType.valueOf("application/*+xml"), -// MediaType.MULTIPART_FORM_DATA -// ); -// -// return VISIBLE_TYPES.stream() -// .anyMatch(visibleType -> visibleType.includes(mediaType)); -// } -//} \ No newline at end of file +package com.server.hispath.filters; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.util.StreamUtils; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.ContentCachingResponseWrapper; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; + +@Component +public class LoggingFilter extends OncePerRequestFilter { + protected static final Logger log = LoggerFactory.getLogger(LoggingFilter.class); + + @Override + public void doFilterInternal( + HttpServletRequest request, + HttpServletResponse response, + FilterChain filterChain + ) throws ServletException, IOException { + + if(isFileUpload(request)){ + filterChain.doFilter(request,response); + return; + } + MDC.put("traceId", UUID.randomUUID().toString()); + doFilterWrapped(new RequestWrapper(request), new ResponseWrapper(response), filterChain); + MDC.clear(); + } + + public void doFilterWrapped( + RequestWrapper request, + ContentCachingResponseWrapper response, + FilterChain filterChain + ) throws ServletException, IOException { + + try { + logRequest(request); + filterChain.doFilter(request, response); + } finally { + logResponse(response); + response.copyBodyToResponse(); + } + } + + private static void logRequest(RequestWrapper request) throws IOException { + String queryString = request.getQueryString(); + String requestURI = request.getRequestURI(); + if (!Objects.isNull(queryString)) { + requestURI += queryString; + } + log.info("Request : {} uri=[{}] content-type=[{}]", + request.getMethod(), + requestURI, + request.getContentType() + ); + + logPayload("Request", request.getContentType(), request.getInputStream()); + } + + private static void logResponse(ContentCachingResponseWrapper response) throws IOException { + logPayload("Response", response.getContentType(), response.getContentInputStream()); + } + + private static void logPayload(String prefix, String contentType, InputStream inputStream) throws IOException { + if (Objects.isNull(contentType)) { + contentType = "application/json"; + } + boolean visible = isVisible(MediaType.valueOf(contentType)); + if (visible) { + logContentPayload(prefix, inputStream); + return; + } + log.info("{} Payload: Binary Content", prefix); + } + + private static void logContentPayload(String prefix, InputStream inputStream) throws IOException { + byte[] content = StreamUtils.copyToByteArray(inputStream); + if (content.length > 0) { + String contentString = new String(content); + log.info("{} Payload: {}", prefix, contentString); + } + } + + private static boolean isVisible(MediaType mediaType) { + final List VISIBLE_TYPES = Arrays.asList( + MediaType.valueOf("text/*"), + MediaType.APPLICATION_FORM_URLENCODED, + MediaType.APPLICATION_JSON, + MediaType.APPLICATION_XML, + MediaType.valueOf("application/*+json"), + MediaType.valueOf("application/*+xml"), + MediaType.MULTIPART_FORM_DATA + ); + + return VISIBLE_TYPES.stream() + .anyMatch(visibleType -> visibleType.includes(mediaType)); + } + + + private boolean isFileUpload(HttpServletRequest request){ + if(Objects.equals("POST", request.getMethod())){ + if(Objects.equals("/api/mileages",request.getRequestURI())){ + return true; + } + if(Objects.equals("/api/students",request.getRequestURI())){ + return true; + } + if(Objects.equals("/api/mileage/students",request.getRequestURI())){ + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/server/hispath/filters/RequestWrapper.java b/src/main/java/com/server/hispath/filters/RequestWrapper.java index 88e1033..339490b 100644 --- a/src/main/java/com/server/hispath/filters/RequestWrapper.java +++ b/src/main/java/com/server/hispath/filters/RequestWrapper.java @@ -1,54 +1,54 @@ -//package com.server.hispath.filters; -// -//import java.io.ByteArrayInputStream; -//import java.io.IOException; -//import java.io.InputStream; -//import javax.servlet.ReadListener; -//import javax.servlet.ServletInputStream; -//import javax.servlet.http.HttpServletRequest; -//import javax.servlet.http.HttpServletRequestWrapper; -// -//import org.springframework.util.StreamUtils; -// -//public class RequestWrapper extends HttpServletRequestWrapper { -// -// private byte[] cachedInputStream; -// -// public RequestWrapper(HttpServletRequest request) throws IOException { -// super(request); -// InputStream requestInputStream = request.getInputStream(); -// this.cachedInputStream = StreamUtils.copyToByteArray(requestInputStream); -// } -// -// @Override -// public ServletInputStream getInputStream() { -// return new ServletInputStream() { -// private InputStream cachedBodyInputStream = new ByteArrayInputStream(cachedInputStream); -// -// @Override -// public boolean isFinished() { -// try { -// return cachedBodyInputStream.available() == 0; -// } catch (IOException e) { -// e.printStackTrace(); -// } -// return false; -// } -// -// @Override -// public boolean isReady() { -// return true; -// } -// -// @Override -// public void setReadListener(ReadListener readListener) { -// throw new UnsupportedOperationException(); -// } -// -// @Override -// public int read() throws IOException { -// return cachedBodyInputStream.read(); -// } -// }; -// } -//} +package com.server.hispath.filters; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; + +import org.springframework.util.StreamUtils; + +public class RequestWrapper extends HttpServletRequestWrapper { + + private byte[] cachedInputStream; + + public RequestWrapper(HttpServletRequest request) throws IOException { + super(request); + InputStream requestInputStream = request.getInputStream(); + this.cachedInputStream = StreamUtils.copyToByteArray(requestInputStream); + } + + @Override + public ServletInputStream getInputStream() { + return new ServletInputStream() { + private InputStream cachedBodyInputStream = new ByteArrayInputStream(cachedInputStream); + + @Override + public boolean isFinished() { + try { + return cachedBodyInputStream.available() == 0; + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener readListener) { + throw new UnsupportedOperationException(); + } + + @Override + public int read() throws IOException { + return cachedBodyInputStream.read(); + } + }; + } +} diff --git a/src/main/java/com/server/hispath/filters/ResponseWrapper.java b/src/main/java/com/server/hispath/filters/ResponseWrapper.java index 5afea76..0c88e01 100644 --- a/src/main/java/com/server/hispath/filters/ResponseWrapper.java +++ b/src/main/java/com/server/hispath/filters/ResponseWrapper.java @@ -1,11 +1,11 @@ -//package com.server.hispath.filters; -// -//import javax.servlet.http.HttpServletResponse; -// -//import org.springframework.web.util.ContentCachingResponseWrapper; -// -//public class ResponseWrapper extends ContentCachingResponseWrapper { -// public ResponseWrapper(HttpServletResponse response) { -// super(response); -// } -//} \ No newline at end of file +package com.server.hispath.filters; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.util.ContentCachingResponseWrapper; + +public class ResponseWrapper extends ContentCachingResponseWrapper { + public ResponseWrapper(HttpServletResponse response) { + super(response); + } +} \ No newline at end of file diff --git a/src/main/resources/a.txt b/src/main/resources/logback-spring.xml similarity index 100% rename from src/main/resources/a.txt rename to src/main/resources/logback-spring.xml From a66d898bc8b68fbd7de60e71d9494905b3da5ab2 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 29 Nov 2022 17:05:15 +0900 Subject: [PATCH 127/148] =?UTF-8?q?feat=20:=20filter=20=EC=97=90=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EC=97=85=EB=A1=9C=EB=93=9C=EB=8F=84=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EB=82=A8=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/server/hispath/filters/LoggingFilter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/filters/LoggingFilter.java b/src/main/java/com/server/hispath/filters/LoggingFilter.java index 4ecd5e8..08315fd 100644 --- a/src/main/java/com/server/hispath/filters/LoggingFilter.java +++ b/src/main/java/com/server/hispath/filters/LoggingFilter.java @@ -33,11 +33,12 @@ public void doFilterInternal( FilterChain filterChain ) throws ServletException, IOException { + MDC.put("traceId", UUID.randomUUID().toString()); if(isFileUpload(request)){ filterChain.doFilter(request,response); + MDC.clear(); return; } - MDC.put("traceId", UUID.randomUUID().toString()); doFilterWrapped(new RequestWrapper(request), new ResponseWrapper(response), filterChain); MDC.clear(); } From 581aab4c4f834cc1998cb9056cbd9ac655d1c396 Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Tue, 29 Nov 2022 20:08:19 +0900 Subject: [PATCH 128/148] [#79] Student, Manager, Department, Major test data edit (#132) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [feat#79] 테스트 컨트롤러 구현 * merge with dev * chore: student, manager, department, major test data edit --- .../server/hispath/common/TestController.java | 246 ++++++++++-------- 1 file changed, 136 insertions(+), 110 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 9a8f479..d05d70d 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -159,8 +159,8 @@ private void saveScholarship() { List students = studentRepository.findAll(); List studentIds = students.stream() - .map(Student::getId) - .collect(Collectors.toList()); + .map(Student::getId) + .collect(Collectors.toList()); studentIds.forEach(id -> scholarshipService.create(id, "2022-2")); studentIds.forEach(id -> scholarshipService.create(id, "2022-1")); @@ -250,10 +250,10 @@ public void saveParticipant() { // int num = getRandomNum(15, students.size()); List refStudent = students.stream() - .map(student -> { - return new StudentSimpleRefDto(student.getStudentNum(), student.getName()); - }) - .collect(Collectors.toList()); + .map(student -> { + return new StudentSimpleRefDto(student.getStudentNum(), student.getName()); + }) + .collect(Collectors.toList()); studentService.registerParticipants(activity.getId(), refStudent); // Collections.shuffle(refStudent); @@ -265,86 +265,100 @@ public void saveParticipant() { private void saveManager() { managerRepository.save(Manager.builder() - .name("김광 교수님") + .name("이정재 교수님") .email("kkim@handong.ac.kr") .department("CSEE") + .profile("https://user-images.githubusercontent.com/63008958/203914314-2eb9a33d-efab-4f08-80cf-ce00757d232a.jpeg") .approved(true).build()); managerRepository.save(Manager.builder() - .name("장소연 교수님") + .name("아이유 교수님") .email("jerry1004@handong.ac.kr") .department("CSEE") + .profile("https://user-images.githubusercontent.com/63008958/203914299-6d707193-28ab-457c-8d03-51efb758072d.jpeg") .approved(true).build()); managerRepository.save(Manager.builder() - .name("장기려 박사님") + .name("송중기 박사님") .email("janggiryeo@handong.ac.kr") .department("JGR") + .profile("https://user-images.githubusercontent.com/63008958/203914292-50d8abb3-8e7a-45c1-90ca-22bc156b1165.jpeg") .approved(true).build()); managerRepository.save(Manager.builder() - .name("최도성 총장님") + .name("공유 총장님") .email("cds@handong.ac.kr") .department("HGU") + .profile("https://user-images.githubusercontent.com/63008958/203914306-5dbc47d3-ae07-4314-8708-abef0fcdd7c1.jpeg") .approved(true).build()); managerRepository.save(Manager.builder() - .name("최경현 선생님") + .name("김태리 선생님") .email("cgh@handong.ac.kr") .department("SW") + .profile("https://user-images.githubusercontent.com/63008958/203914310-b00e05a7-c827-4247-945c-737ac56eeaf1.jpeg") .approved(false).build()); managerRepository.save(Manager.builder() - .name("이윤정 선생님") + .name("이지은 선생님") .email("lyj@handong.ac.kr") .department("SW") + .profile("https://user-images.githubusercontent.com/63008958/203914295-2fc460fe-3998-4f3c-b298-fff9a6c5676a.jpeg") .approved(false).build()); managerRepository.save(Manager.builder() - .name("이미나 선생님") + .name("손예진 선생님") .email("lmn@handong.ac.kr") .department("SW") + .profile("https://user-images.githubusercontent.com/63008958/203914281-9c0acb13-562b-45df-a16a-61015f6881ff.png") .approved(true).build()); managerRepository.save(Manager.builder() - .name("안병웅") + .name("안병웅 관리자") .email("BW_Ahn@handong.ac.kr") .department("전산전자공학부") + .profile("https://user-images.githubusercontent.com/63008958/203915182-c8216b87-9e06-4a10-8efe-b8d0cb43b5af.png") .approved(true).build()); managerRepository.save(Manager.builder() - .name("박성진") - .email("JakePark@handong.ac.kr") + .name("박성진 괸리자") + .email("david@handong.ac.kr") .department("글로벌리더쉽학부") + .profile("https://user-images.githubusercontent.com/63008958/203915214-b9d6ffef-b011-43a4-9a9b-bf160f88b07c.png") .approved(true).build()); managerRepository.save(Manager.builder() .name("홍성헌") .email("lukehongg@handong.ac.kr") .department("전산전자공학부") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .approved(true).build()); managerRepository.save(Manager.builder() .name("이인혁") .email("Bruse@handong.ac.kr") .department("ICT 융합학부") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .approved(true).build()); managerRepository.save(Manager.builder() .name("정수산나") .email("Sanna@handong.ac.kr") .department("경영경제학부") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .approved(false).build()); managerRepository.save(Manager.builder() .name("정석민") .email("PeterJung@handong.ac.kr") .department("글로벌리더쉽학부") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .approved(false).build()); managerRepository.save(Manager.builder() .name("송다빈") .email("Emerson@handong.ac.kr") .department("전산전자공학부") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .approved(true).build()); } @@ -532,7 +546,7 @@ private void saveStudent() { .major2(majorRepository.findByName("-")) .phone("010-9484-4321") .email("david@handong.ac.kr") - .profile("profile.url") + .profile("https://user-images.githubusercontent.com/63008958/203534676-49fb985a-c686-4965-9dc4-d46ae90cc3e7.png") .blog("blog.com") .githubId("@davidpiao.github") .loginCnt(0L) @@ -547,7 +561,7 @@ private void saveStudent() { .major2(majorRepository.findByName("-")) .phone("010-1623-1512") .email("mh03@handong.ac.kr") - .profile("profile.url") + .profile("https://user-images.githubusercontent.com/63008958/203915182-c8216b87-9e06-4a10-8efe-b8d0cb43b5af.png") .blog("blog.com") .githubId("@wooong.github") .loginCnt(0L) @@ -562,7 +576,7 @@ private void saveStudent() { .major2(majorRepository.findByName("언론정보학전공")) .phone("010-1623-3322") .email("hong@handong.ac.kr") - .profile("profile.url") + .profile("https://user-images.githubusercontent.com/63008958/203469086-7e27bf70-cca1-4bf2-be74-e16dbcee7507.jpeg") .blog("blog.com") .githubId("@hong.github") .loginCnt(0L) @@ -577,7 +591,7 @@ private void saveStudent() { .major2(majorRepository.findByName("기계공학전공")) .phone("010-4983-6555") .email("lee@handong.ac.kr") - .profile("profile.url") + .profile("https://user-images.githubusercontent.com/63008958/203468795-8bf6ee4b-5ee6-4ae4-87ed-ca438307c30f.jpeg") .blog("blog.com") .githubId("@ee.github") .loginCnt(0L) @@ -592,7 +606,7 @@ private void saveStudent() { .major2(majorRepository.findByName("-")) .phone("010-4983-6555") .email("jeong@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@jeong.github") .loginCnt(0L) @@ -607,14 +621,14 @@ private void saveStudent() { .major2(majorRepository.findByName("한국법전공")) .phone("010-7788-0142") .email("song@handong.ac.kr") - .profile("profile.url") + .profile("https://user-images.githubusercontent.com/63008958/203534764-4f30254d-d917-444c-84f9-d8e922b967fa.png") .blog("blog.com") .githubId("@song.github") .loginCnt(0L) .readme("song's readme") .build()); studentRepository.save(Student.builder() - .name("김한동") + .name("문하현") .department(departementRepository.findByName("전산전자공학부")) .studentNum("22200000") .semester(5) @@ -622,14 +636,14 @@ private void saveStudent() { .major2(majorRepository.findByName("생명과학전공")) .phone("010-1234-1234") .email("kim@handong.ac.kr") - .profile("profile.url") + .profile("https://user-images.githubusercontent.com/63008958/203492174-ef61e68c-a3d9-429e-8947-75542423977a.png") .blog("blog.com") .githubId("@kim.github") .loginCnt(0L) .readme("kim's readme") .build()); studentRepository.save(Student.builder() - .name("박한동") + .name("박관희") .department(departementRepository.findByName("국제어문학부")) .studentNum("22200001") .semester(3) @@ -637,14 +651,14 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-1234-5678") .email("park@handong.ac.kr") - .profile("profile.url") + .profile("https://user-images.githubusercontent.com/63008958/203862630-2915aaad-8ff0-42ae-b217-fcbce19e4791.png") .blog("blog.com") .githubId("@park.github") .loginCnt(0L) .readme("park's readme") .build()); studentRepository.save(Student.builder() - .name("이한동") + .name("이연진") .department(departementRepository.findByName("경영경제학부")) .studentNum("22200002") .semester(5) @@ -652,14 +666,14 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-5678-1234") .email("lee@handong.ac.kr") - .profile("profile.url") + .profile("https://user-images.githubusercontent.com/63008958/203536628-985c37e3-49a9-4a50-82a3-485c09c456c4.png") .blog("blog.com") .githubId("@lee.github") .loginCnt(0L) .readme("lee's readme") .build()); studentRepository.save(Student.builder() - .name("정한동") + .name("게스트") .department(departementRepository.findByName("법학부")) .studentNum("22200003") .semester(6) @@ -667,7 +681,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-1111-1111") .email("jeong@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-10/Original Logo.png") .blog("blog.com") .githubId("@jeong.github") .loginCnt(0L) @@ -682,7 +696,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-2222-3333") .email("woo@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@woo.github") .loginCnt(0L) @@ -697,7 +711,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4444-1234") .email("wi@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@wi.github") .loginCnt(0L) @@ -712,7 +726,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-9999-1111") .email("ha@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@ha.github") .loginCnt(0L) @@ -727,7 +741,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4312-4312") .email("ma@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@ma.github") .loginCnt(0L) @@ -742,7 +756,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-3434-2323") .email("yu@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@yu.github") .loginCnt(0L) @@ -757,7 +771,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-8787-8787") .email("jin@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@jin.github") .loginCnt(0L) @@ -772,7 +786,7 @@ private void saveStudent() { .major2(majorRepository.findByName("생명과학전공")) .phone("010-1234-1234") .email("kim@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@kim.github") .loginCnt(0L) @@ -787,7 +801,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-1234-5678") .email("park@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@park.github") .loginCnt(0L) @@ -802,7 +816,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-6655-4232") .email("lee@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@lee.github") .loginCnt(0L) @@ -817,7 +831,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-9292-9292") .email("jeong@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@jeong.github") .loginCnt(0L) @@ -832,7 +846,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-2332-4333") .email("woo@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@woo.github") .loginCnt(0L) @@ -847,7 +861,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4444-1234") .email("wi@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@wi.github") .loginCnt(0L) @@ -862,7 +876,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-3221-6665") .email("ha@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@ha.github") .loginCnt(0L) @@ -877,7 +891,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4211-1123") .email("ma@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@ma.github") .loginCnt(0L) @@ -892,7 +906,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-2311-9992") .email("yu@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@yu.github") .loginCnt(0L) @@ -907,7 +921,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-1234-0494") .email("jin@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@jin.github") .loginCnt(0L) @@ -922,7 +936,7 @@ private void saveStudent() { .major2(majorRepository.findByName("생명과학전공")) .phone("010-3232-6767") .email("kim@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@kim.github") .loginCnt(0L) @@ -937,7 +951,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4322-9009") .email("park@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@park.github") .loginCnt(0L) @@ -952,7 +966,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-6653-4231") .email("lee@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@lee.github") .loginCnt(0L) @@ -967,7 +981,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-9292-9232") .email("jeong@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@jeong.github") .loginCnt(0L) @@ -982,7 +996,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-2312-4343") .email("woo@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@woo.github") .loginCnt(0L) @@ -997,7 +1011,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4444-4234") .email("wi@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@wi.github") .loginCnt(0L) @@ -1007,12 +1021,12 @@ private void saveStudent() { .name("박관희") .department(departementRepository.findByName("공간환경시스템공학부")) .studentNum("21800232") - .semester(9) + .semester(9) .major1(majorRepository.findByName("도시환경공학전공")) .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-3221-6365") .email("ha@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@ha.github") .loginCnt(0L) @@ -1027,7 +1041,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4211-1673") .email("ma@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@ma.github") .loginCnt(0L) @@ -1042,7 +1056,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-2911-9192") .email("yu@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@yu.github") .loginCnt(0L) @@ -1057,7 +1071,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4321-1275") .email("jin@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@jin.github") .loginCnt(0L) @@ -1072,7 +1086,7 @@ private void saveStudent() { .major2(majorRepository.findByName("생명과학전공")) .phone("010-6731-1423") .email("kim@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@kim.github") .loginCnt(0L) @@ -1087,7 +1101,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4222-3009") .email("park@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@park.github") .loginCnt(0L) @@ -1102,7 +1116,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-6653-9991") .email("lee@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@lee.github") .loginCnt(0L) @@ -1117,7 +1131,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-1292-9132") .email("jeong@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@jeong.github") .loginCnt(0L) @@ -1132,7 +1146,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-2112-4243") .email("woo@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@woo.github") .loginCnt(0L) @@ -1147,7 +1161,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-1144-4214") .email("wi@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@wi.github") .loginCnt(0L) @@ -1162,7 +1176,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-3331-6365") .email("ha@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@ha.github") .loginCnt(0L) @@ -1177,7 +1191,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4211-2673") .email("ma@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@ma.github") .loginCnt(0L) @@ -1192,7 +1206,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-2931-9192") .email("yu@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@yu.github") .loginCnt(0L) @@ -1207,7 +1221,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4891-1275") .email("jin@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@jin.github") .loginCnt(0L) @@ -1223,7 +1237,7 @@ private void saveStudent() { .major2(majorRepository.findByName("생명과학전공")) .phone("010-9191-1423") .email("kim@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@kim.github") .loginCnt(0L) @@ -1238,7 +1252,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-9991-3009") .email("park@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@park.github") .loginCnt(0L) @@ -1253,7 +1267,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-6653-9881") .email("lee@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@lee.github") .loginCnt(0L) @@ -1268,7 +1282,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-1293-9832") .email("jeong@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@jeong.github") .loginCnt(0L) @@ -1283,7 +1297,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-2188-4243") .email("woo@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@woo.github") .loginCnt(0L) @@ -1298,7 +1312,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-6644-4214") .email("wi@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@wi.github") .loginCnt(0L) @@ -1313,7 +1327,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-3431-6365") .email("ha@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@ha.github") .loginCnt(0L) @@ -1328,7 +1342,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4111-2673") .email("ma@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@ma.github") .loginCnt(0L) @@ -1343,7 +1357,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-2931-9192") .email("yu@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@yu.github") .loginCnt(0L) @@ -1358,7 +1372,7 @@ private void saveStudent() { .major2(majorRepository.findByName("컴퓨터공학전공")) .phone("010-4821-1175") .email("jin@handong.ac.kr") - .profile("profile.url") + .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") .blog("blog.com") .githubId("@jin.github") .loginCnt(0L) @@ -1395,39 +1409,51 @@ private void saveCategory() { private void saveDepartment() { departementRepository.save(Department.builder() .name("전산전자공학부") + .profile("https://user-images.githubusercontent.com/63008958/203982136-82098fb9-f082-40e3-a677-e84076ea7745.png") .build()); departementRepository.save(Department.builder() .name("국제어문학부") + .profile("https://user-images.githubusercontent.com/63008958/203982173-f22aa5a5-0e7f-45cc-91b0-1870ced20441.png") .build()); departementRepository.save(Department.builder() .name("경영경제학부") + .profile("https://user-images.githubusercontent.com/63008958/203982171-65bbc7d2-a8de-43d2-9db3-ca361aa36b1c.png") .build()); departementRepository.save(Department.builder() .name("법학부") + .profile("https://user-images.githubusercontent.com/63008958/203982170-44a91016-1b6a-4d88-b7a1-4560966521f2.png") .build()); departementRepository.save(Department.builder() .name("커뮤니케이션학부") + .profile("https://user-images.githubusercontent.com/63008958/203982168-d3cba5e1-2627-4941-a414-aa3e17fd2959.png") .build()); departementRepository.save(Department.builder() .name("상담심리사회복지학부") + .profile("https://user-images.githubusercontent.com/63008958/203982129-0ed8a671-c04a-443f-b48e-7471074112ea.png") .build()); departementRepository.save(Department.builder() .name("공간환경시스템공학부") + .profile("https://user-images.githubusercontent.com/63008958/203982164-378d214b-04ce-4d1f-b909-36daf17b5cdb.png") .build()); departementRepository.save(Department.builder() .name("콘텐츠융합디자인학부") + .profile("https://user-images.githubusercontent.com/63008958/203982153-f2ae91d9-8984-40ed-9802-5b2f71f123b5.png") .build()); departementRepository.save(Department.builder() .name("기계제어공학부") + .profile("https://user-images.githubusercontent.com/63008958/203982161-61e66aa6-6625-4eb0-819c-71edc01f47ad.png") .build()); departementRepository.save(Department.builder() .name("ICT 창업학부") + .profile("https://user-images.githubusercontent.com/63008958/203982115-30963e7f-19e9-4f45-8390-bec128a1981b.png") .build()); departementRepository.save(Department.builder() .name("생명과학부") + .profile("https://user-images.githubusercontent.com/63008958/203982143-6972a9ad-8b43-4024-b63f-59ce0969e922.png") .build()); departementRepository.save(Department.builder() .name("글로벌리더쉽학부") + .profile("https://user-images.githubusercontent.com/63008958/203982177-4324201c-63d8-4df0-abe7-09fd1c7cfd21.png") .build()); } @@ -1977,38 +2003,38 @@ public void saveActivities() { private void saveMajor() { - majorRepository.save(Major.builder().name("-").build()); - majorRepository.save(Major.builder().name("건설공학전공").build()); - majorRepository.save(Major.builder().name("도시환경공학전공").build()); - majorRepository.save(Major.builder().name("기계공학전공").build()); - majorRepository.save(Major.builder().name("전자제어공학전공").build()); - majorRepository.save(Major.builder().name("생명과학전공").build()); - majorRepository.save(Major.builder().name("글로벌융합전공").build()); - majorRepository.save(Major.builder().name("수학통계전공").build()); - majorRepository.save(Major.builder().name("학생설계융합전공").build()); - majorRepository.save(Major.builder().name("시각디자인전공").build()); - majorRepository.save(Major.builder().name("제품디자인전공").build()); - majorRepository.save(Major.builder().name("컴퓨터공학전공").build()); - majorRepository.save(Major.builder().name("컴퓨터공학심화전공").build()); - majorRepository.save(Major.builder().name("전자공학전공").build()); - majorRepository.save(Major.builder().name("전자공학심화전공").build()); - majorRepository.save(Major.builder().name("Information Technology").build()); - majorRepository.save(Major.builder().name("ICT 융합전공").build()); - majorRepository.save(Major.builder().name("AI Convergence & Entrepreneurship 전공").build()); - majorRepository.save(Major.builder().name("Global Entrepreneurship 전공").build()); - majorRepository.save(Major.builder().name("AI 융합 전공").build()); - majorRepository.save(Major.builder().name("데이터 사이언스 전공").build()); - majorRepository.save(Major.builder().name("경영학전공").build()); - majorRepository.save(Major.builder().name("경제학전공").build()); - majorRepository.save(Major.builder().name("Global Management").build()); - majorRepository.save(Major.builder().name("국제지역학전공").build()); - majorRepository.save(Major.builder().name("영어전공").build()); - majorRepository.save(Major.builder().name("한국법전공").build()); - majorRepository.save(Major.builder().name("US & International Law").build()); - majorRepository.save(Major.builder().name("상담심리학전공").build()); - majorRepository.save(Major.builder().name("사회복지학전공").build()); - majorRepository.save(Major.builder().name("공연영상학전공").build()); - majorRepository.save(Major.builder().name("언론정보학전공").build()); - majorRepository.save(Major.builder().name("글로벌한국학전공").build()); + majorRepository.save(Major.builder().name("-").profile("https://user-images.githubusercontent.com/63008958/203987348-497d8992-98e2-47ff-9769-a7207e6961ed.png").build()); + majorRepository.save(Major.builder().name("건설공학전공").profile("https://user-images.githubusercontent.com/63008958/203986081-cc605f80-7cb3-4fc9-93ed-9712a38506c6.jpg").build()); + majorRepository.save(Major.builder().name("도시환경공학전공").profile("https://user-images.githubusercontent.com/63008958/203986080-4921f01e-8fdd-480c-b764-f1d926b070d3.jpg").build()); + majorRepository.save(Major.builder().name("기계공학전공").profile("https://user-images.githubusercontent.com/63008958/203986079-59fe24a6-d934-4dad-9b80-35a1a5306535.jpg").build()); + majorRepository.save(Major.builder().name("전자제어공학전공").profile("https://user-images.githubusercontent.com/63008958/203986077-425b14ae-37f5-480a-b00c-fdec96f09b9d.jpg").build()); + majorRepository.save(Major.builder().name("생명과학전공").profile("https://user-images.githubusercontent.com/63008958/203986074-b785eed9-1531-4c32-b153-dec59ea10982.jpg").build()); + majorRepository.save(Major.builder().name("글로벌융합전공").profile("https://user-images.githubusercontent.com/63008958/203986073-4a098ecc-5f91-4ab4-abb3-2a90149c566a.jpg").build()); + majorRepository.save(Major.builder().name("수학통계전공").profile("https://user-images.githubusercontent.com/63008958/203986071-ba9e0fb7-e246-4cfc-b1cc-788264a9086b.jpg").build()); + majorRepository.save(Major.builder().name("학생설계융합전공").profile("https://user-images.githubusercontent.com/63008958/203986068-5fd2f7d5-c894-49ed-92d7-30a63b4e88f9.jpg").build()); + majorRepository.save(Major.builder().name("시각디자인전공").profile("https://user-images.githubusercontent.com/63008958/203986065-746e6d2d-38e0-494e-b5c4-9060d5bb329e.jpg").build()); + majorRepository.save(Major.builder().name("제품디자인전공").profile("https://user-images.githubusercontent.com/63008958/203986063-d3aa8474-58c6-4e22-a23f-1a17edb40300.jpg").build()); + majorRepository.save(Major.builder().name("컴퓨터공학전공").profile("https://user-images.githubusercontent.com/63008958/203986059-4fc80f57-49b3-453f-94de-6f51b729730a.jpg").build()); + majorRepository.save(Major.builder().name("컴퓨터공학심화전공").profile("https://user-images.githubusercontent.com/63008958/203986052-b02066c1-0ff5-41ed-81e7-72bcf5284dc3.jpg").build()); + majorRepository.save(Major.builder().name("전자공학전공").profile("").build()); + majorRepository.save(Major.builder().name("전자공학심화전공").profile("").build()); + majorRepository.save(Major.builder().name("Information Technology").profile("").build()); + majorRepository.save(Major.builder().name("ICT 융합전공").profile("").build()); + majorRepository.save(Major.builder().name("AI Convergence & Entrepreneurship 전공").profile("").build()); + majorRepository.save(Major.builder().name("Global Entrepreneurship 전공").profile("").build()); + majorRepository.save(Major.builder().name("AI 융합 전공").profile("").build()); + majorRepository.save(Major.builder().name("데이터 사이언스 전공").profile("").build()); + majorRepository.save(Major.builder().name("경영학전공").profile("").build()); + majorRepository.save(Major.builder().name("경제학전공").profile("").build()); + majorRepository.save(Major.builder().name("Global Management").profile("").build()); + majorRepository.save(Major.builder().name("국제지역학전공").profile("").build()); + majorRepository.save(Major.builder().name("영어전공").profile("").build()); + majorRepository.save(Major.builder().name("한국법전공").profile("").build()); + majorRepository.save(Major.builder().name("US & International Law").profile("").build()); + majorRepository.save(Major.builder().name("상담심리학전공").profile("").build()); + majorRepository.save(Major.builder().name("사회복지학전공").profile("").build()); + majorRepository.save(Major.builder().name("공연영상학전공").profile("").build()); + majorRepository.save(Major.builder().name("언론정보학전공").profile("").build()); + majorRepository.save(Major.builder().name("글로벌한국학전공").profile("").build()); } } \ No newline at end of file From 0860d644f23663c052eb165c9988245fc5250c02 Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Tue, 29 Nov 2022 20:33:08 +0900 Subject: [PATCH 129/148] [#79] Added few more major profile pics (#133) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [feat#79] 테스트 컨트롤러 구현 * merge with dev * chore: student, manager, department, major test data edit * chore: added more major profile pics --- .../server/hispath/common/TestController.java | 39 +++++++------------ 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index d05d70d..7b11928 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -2003,32 +2003,19 @@ public void saveActivities() { private void saveMajor() { - majorRepository.save(Major.builder().name("-").profile("https://user-images.githubusercontent.com/63008958/203987348-497d8992-98e2-47ff-9769-a7207e6961ed.png").build()); - majorRepository.save(Major.builder().name("건설공학전공").profile("https://user-images.githubusercontent.com/63008958/203986081-cc605f80-7cb3-4fc9-93ed-9712a38506c6.jpg").build()); - majorRepository.save(Major.builder().name("도시환경공학전공").profile("https://user-images.githubusercontent.com/63008958/203986080-4921f01e-8fdd-480c-b764-f1d926b070d3.jpg").build()); - majorRepository.save(Major.builder().name("기계공학전공").profile("https://user-images.githubusercontent.com/63008958/203986079-59fe24a6-d934-4dad-9b80-35a1a5306535.jpg").build()); - majorRepository.save(Major.builder().name("전자제어공학전공").profile("https://user-images.githubusercontent.com/63008958/203986077-425b14ae-37f5-480a-b00c-fdec96f09b9d.jpg").build()); - majorRepository.save(Major.builder().name("생명과학전공").profile("https://user-images.githubusercontent.com/63008958/203986074-b785eed9-1531-4c32-b153-dec59ea10982.jpg").build()); - majorRepository.save(Major.builder().name("글로벌융합전공").profile("https://user-images.githubusercontent.com/63008958/203986073-4a098ecc-5f91-4ab4-abb3-2a90149c566a.jpg").build()); - majorRepository.save(Major.builder().name("수학통계전공").profile("https://user-images.githubusercontent.com/63008958/203986071-ba9e0fb7-e246-4cfc-b1cc-788264a9086b.jpg").build()); - majorRepository.save(Major.builder().name("학생설계융합전공").profile("https://user-images.githubusercontent.com/63008958/203986068-5fd2f7d5-c894-49ed-92d7-30a63b4e88f9.jpg").build()); - majorRepository.save(Major.builder().name("시각디자인전공").profile("https://user-images.githubusercontent.com/63008958/203986065-746e6d2d-38e0-494e-b5c4-9060d5bb329e.jpg").build()); - majorRepository.save(Major.builder().name("제품디자인전공").profile("https://user-images.githubusercontent.com/63008958/203986063-d3aa8474-58c6-4e22-a23f-1a17edb40300.jpg").build()); - majorRepository.save(Major.builder().name("컴퓨터공학전공").profile("https://user-images.githubusercontent.com/63008958/203986059-4fc80f57-49b3-453f-94de-6f51b729730a.jpg").build()); - majorRepository.save(Major.builder().name("컴퓨터공학심화전공").profile("https://user-images.githubusercontent.com/63008958/203986052-b02066c1-0ff5-41ed-81e7-72bcf5284dc3.jpg").build()); - majorRepository.save(Major.builder().name("전자공학전공").profile("").build()); - majorRepository.save(Major.builder().name("전자공학심화전공").profile("").build()); - majorRepository.save(Major.builder().name("Information Technology").profile("").build()); - majorRepository.save(Major.builder().name("ICT 융합전공").profile("").build()); - majorRepository.save(Major.builder().name("AI Convergence & Entrepreneurship 전공").profile("").build()); - majorRepository.save(Major.builder().name("Global Entrepreneurship 전공").profile("").build()); - majorRepository.save(Major.builder().name("AI 융합 전공").profile("").build()); - majorRepository.save(Major.builder().name("데이터 사이언스 전공").profile("").build()); - majorRepository.save(Major.builder().name("경영학전공").profile("").build()); - majorRepository.save(Major.builder().name("경제학전공").profile("").build()); - majorRepository.save(Major.builder().name("Global Management").profile("").build()); - majorRepository.save(Major.builder().name("국제지역학전공").profile("").build()); - majorRepository.save(Major.builder().name("영어전공").profile("").build()); + majorRepository.save(Major.builder().name("전자공학전공").profile("https://user-images.githubusercontent.com/63008958/204516545-6c7ca818-1c99-4c1a-a4d4-569577d344d8.jpg").build()); + majorRepository.save(Major.builder().name("전자공학심화전공").profile("https://user-images.githubusercontent.com/63008958/204516569-13f7310b-b5a5-4f9d-8171-065884cbf59c.jpg").build()); + majorRepository.save(Major.builder().name("Information Technology").profile("https://user-images.githubusercontent.com/63008958/204516579-bad0d03e-d9ca-4a76-9e94-4a31fe605ce4.jpg").build()); + majorRepository.save(Major.builder().name("ICT 융합전공").profile("https://user-images.githubusercontent.com/63008958/204516638-7c5c13c2-ebb7-4d41-895b-8af61801e7b4.jpg").build()); + majorRepository.save(Major.builder().name("AI Convergence & Entrepreneurship 전공").profile("https://user-images.githubusercontent.com/63008958/204517597-e463b42b-17f3-4476-9314-fe33edb23e8e.jpg").build()); + majorRepository.save(Major.builder().name("Global Entrepreneurship 전공").profile("https://user-images.githubusercontent.com/63008958/204516633-5be00a69-d31e-4edb-ada1-9f143f9ec5ee.jpg").build()); + majorRepository.save(Major.builder().name("AI 융합 전공").profile("https://user-images.githubusercontent.com/63008958/204517614-2fd82907-7e30-488e-8df5-b34c1f5fd05f.jpg").build()); + majorRepository.save(Major.builder().name("데이터 사이언스 전공").profile("https://user-images.githubusercontent.com/63008958/204516681-cee59ca5-3e83-45b0-9f2d-77d38aa9772a.jpg").build()); + majorRepository.save(Major.builder().name("경영학전공").profile("https://user-images.githubusercontent.com/63008958/204516699-8d4ae330-79ce-4827-a9b1-4c6bb94a04dd.jpg").build()); + majorRepository.save(Major.builder().name("경제학전공").profile("https://user-images.githubusercontent.com/63008958/204516724-255d3f3d-586c-44f2-bf30-20ae74500e5e.jpg").build()); + majorRepository.save(Major.builder().name("Global Management").profile("https://user-images.githubusercontent.com/63008958/204516745-795ffbf4-3e25-410a-bb87-8957b17f974a.jpg").build()); + majorRepository.save(Major.builder().name("국제지역학전공").profile("https://user-images.githubusercontent.com/63008958/204516767-6d058e2b-98eb-4156-84f2-41adc5961487.jpg").build()); + majorRepository.save(Major.builder().name("영어전공").profile("https://user-images.githubusercontent.com/63008958/204516780-97509626-d605-4b33-871e-6c66d8b9bccb.jpg").build()); majorRepository.save(Major.builder().name("한국법전공").profile("").build()); majorRepository.save(Major.builder().name("US & International Law").profile("").build()); majorRepository.save(Major.builder().name("상담심리학전공").profile("").build()); From c637a0b7be5e09cf4db6e3b03588f83b9088d63c Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Tue, 29 Nov 2022 20:47:10 +0900 Subject: [PATCH 130/148] [#79] Major profile pic added (#134) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [feat#79] 테스트 컨트롤러 구현 * merge with dev * chore: student, manager, department, major test data edit * chore: added more major profile pics * chore: major profiles added --- .../com/server/hispath/common/TestController.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 7b11928..3336420 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -2016,12 +2016,12 @@ private void saveMajor() { majorRepository.save(Major.builder().name("Global Management").profile("https://user-images.githubusercontent.com/63008958/204516745-795ffbf4-3e25-410a-bb87-8957b17f974a.jpg").build()); majorRepository.save(Major.builder().name("국제지역학전공").profile("https://user-images.githubusercontent.com/63008958/204516767-6d058e2b-98eb-4156-84f2-41adc5961487.jpg").build()); majorRepository.save(Major.builder().name("영어전공").profile("https://user-images.githubusercontent.com/63008958/204516780-97509626-d605-4b33-871e-6c66d8b9bccb.jpg").build()); - majorRepository.save(Major.builder().name("한국법전공").profile("").build()); - majorRepository.save(Major.builder().name("US & International Law").profile("").build()); - majorRepository.save(Major.builder().name("상담심리학전공").profile("").build()); - majorRepository.save(Major.builder().name("사회복지학전공").profile("").build()); - majorRepository.save(Major.builder().name("공연영상학전공").profile("").build()); - majorRepository.save(Major.builder().name("언론정보학전공").profile("").build()); - majorRepository.save(Major.builder().name("글로벌한국학전공").profile("").build()); + majorRepository.save(Major.builder().name("한국법전공").profile("https://user-images.githubusercontent.com/63008958/204519931-bd711496-c4cf-453c-9159-21bd471abdf7.jpg").build()); + majorRepository.save(Major.builder().name("US & International Law").profile("https://user-images.githubusercontent.com/63008958/204519949-fbc6196b-3b22-4893-a94c-6aaf43404db3.jpg").build()); + majorRepository.save(Major.builder().name("상담심리학전공").profile("https://user-images.githubusercontent.com/63008958/204519961-dfcc4cb7-770d-414c-b503-62daf17cb348.jpg").build()); + majorRepository.save(Major.builder().name("사회복지학전공").profile("https://user-images.githubusercontent.com/63008958/204519984-9bd89f56-8bd5-4643-9c23-92e86fc3c97e.jpg").build()); + majorRepository.save(Major.builder().name("공연영상학전공").profile("https://user-images.githubusercontent.com/63008958/204520461-e38be0f3-c3d4-42e8-b791-d57a914d90bb.jpg").build()); + majorRepository.save(Major.builder().name("언론정보학전공").profile("https://user-images.githubusercontent.com/63008958/204520001-123c3cda-ab11-4009-b139-ebb6d0b4b458.jpg").build()); + majorRepository.save(Major.builder().name("글로벌한국학전공").profile("https://user-images.githubusercontent.com/63008958/204520021-dc82a562-fab3-438c-abb2-9e1d85b27415.jpg").build()); } } \ No newline at end of file From b4954764b62da554f6e9644da1d8ad9ade8f0475 Mon Sep 17 00:00:00 2001 From: Byungwoong An <80206884+gomster96@users.noreply.github.com> Date: Tue, 29 Nov 2022 22:31:10 +0900 Subject: [PATCH 131/148] =?UTF-8?q?feat[#130]=20:=20Excel=20Export=20API?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20(#135)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ScholarshipService.java | 20 ++++++++++++++---- .../dto/ScholarshipApprovalDto.java | 14 +++++++++++++ .../repository/ScholarshipRepository.java | 6 ++++++ .../presentation/ScholarshipController.java | 17 +++++++++++++++ .../com/server/hispath/util/ExcelManager.java | 21 +++++++++++++++++++ 5 files changed, 74 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java index 2f52cce..1aa0e12 100644 --- a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java +++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java @@ -3,7 +3,10 @@ import java.util.*; import java.util.stream.Collectors; -import com.server.hispath.activity.application.dto.*; +import com.server.hispath.activity.application.dto.ChartDepartmentDataDto; +import com.server.hispath.activity.application.dto.ChartGradeDataDto; +import com.server.hispath.activity.application.dto.ChartSearchRequestDto; +import com.server.hispath.activity.application.dto.ChartTimelineDto; import com.server.hispath.activity.application.dto.chart.ChartRankDto; import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; @@ -209,9 +212,10 @@ public List getChartGradeDistribution(String semester) { chartGradeDatas[2] = new ChartGradeDataDto(3, 0L); chartGradeDatas[3] = new ChartGradeDataDto(4, 0L); chartGradeDataDtos.forEach(chartGradeDataDto -> { - int grade = chartGradeDataDto.getGrade()/2 + chartGradeDataDto.getGrade()%2; - if(grade >= 4) grade = 4; - chartGradeDatas[grade-1].addCnt(chartGradeDataDto.getCnt()); + int grade = chartGradeDataDto.getGrade() / 2 + chartGradeDataDto.getGrade() % 2; + if (grade >= 4) + grade = 4; + chartGradeDatas[grade - 1].addCnt(chartGradeDataDto.getCnt()); }); return List.of(chartGradeDatas); @@ -221,4 +225,12 @@ public List getChartGradeDistribution(String semester) { public List getChartDepartmentDistribution(String semester) { return scholarshipRepositoryCustom.getCountByDepartmentAndSemester(semester); } + + @Transactional(readOnly = true) + public List getWaitingScholarships(String semester) { + return scholarshipRepository.findWaitingScholarships(semester) + .stream() + .map(ScholarshipApprovalDto::from) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipApprovalDto.java b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipApprovalDto.java index 4f835e1..e63e752 100644 --- a/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipApprovalDto.java +++ b/src/main/java/com/server/hispath/scholarship/application/dto/ScholarshipApprovalDto.java @@ -1,5 +1,10 @@ package com.server.hispath.scholarship.application.dto; +import java.util.Arrays; +import java.util.List; + +import com.server.hispath.scholarship.domain.Scholarship; + import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -19,6 +24,15 @@ public String toString() { return "학생명: " + name + " 학번: " + studentNum + " 학생 학기수: " + studentSemester + " 전체 가중치: " + weight + " 결과: " + result; } + public static ScholarshipApprovalDto from(Scholarship scholarship) { + return new ScholarshipApprovalDto(scholarship.getStudent().getName(), scholarship.getStudent().getStudentNum(), + scholarship.getStudentSemester(), scholarship.getTotalMileage(), ""); + } + + public List getStringList() { + return Arrays.asList(this.studentNum, this.name, String.valueOf(this.studentSemester), String.valueOf(this.weight), this.result); + } + public String StudentInfo() { return studentNum + " " + name; } diff --git a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java index 1c227c0..fb486b9 100644 --- a/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java +++ b/src/main/java/com/server/hispath/scholarship/domain/repository/ScholarshipRepository.java @@ -31,5 +31,11 @@ public interface ScholarshipRepository extends JpaRepository Optional findStudentIdAndSemester(Long id, String semester); List findAllBySemesterAndApprovedTrue(String semester); + + @Query("select s from Scholarship s " + + "join fetch s.student " + + "where s.approved = false " + + "and s.semester = :semester") + List findWaitingScholarships(String semester); } diff --git a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java index 735b2f4..a0511ea 100644 --- a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java +++ b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java @@ -1,5 +1,7 @@ package com.server.hispath.scholarship.presentation; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.List; import java.util.stream.Collectors; @@ -18,6 +20,8 @@ import com.server.hispath.scholarship.presentation.response.ScholarshipResponse; import com.server.hispath.util.ExcelManager; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -25,6 +29,7 @@ import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; +import org.apache.poi.ss.usermodel.Workbook; @RestController @RequiredArgsConstructor @@ -95,4 +100,16 @@ public ResponseEntity> searchScholarshipStudents( .collect(Collectors.toList()); return ResponseEntity.ok(responses); } + + @GetMapping(value = "/scholarship/excel", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + public ResponseEntity exportScholarshipsByExcel(@RequestParam String semester) throws IOException{ + Workbook workbook = ExcelManager.toCsv(scholarshipService.getWaitingScholarships(semester)); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + workbook.write(os); + os.close(); + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachement;filename=\"scholarships_waiting.xlsx" + "\"") + .header(HttpHeaders.CONTENT_TYPE, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + .body(new ByteArrayResource(os.toByteArray())); + } } diff --git a/src/main/java/com/server/hispath/util/ExcelManager.java b/src/main/java/com/server/hispath/util/ExcelManager.java index d29bd72..8f3c1fd 100644 --- a/src/main/java/com/server/hispath/util/ExcelManager.java +++ b/src/main/java/com/server/hispath/util/ExcelManager.java @@ -2,6 +2,7 @@ import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.regex.Pattern; @@ -126,4 +127,24 @@ public static List getScholarshipApproveDatas(Sheet work } return scholarshipDtos; } + + public static Workbook toCsv(List dtos) { + Workbook workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet(); + + createRow(sheet, Arrays.asList("학번", "이름", "학기수", "총 가중치", "결과"), 0); + for(int i=0; i cellList, int rowNum) { + Row row = sheet.createRow(rowNum); + for (int i = 0; i < cellList.size(); i++) { + row.createCell(i).setCellValue(String.valueOf(cellList.get(i))); + } + } } From b33cd9282168136387f636520371fdca6db4d13f Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 29 Nov 2022 22:58:26 +0900 Subject: [PATCH 132/148] =?UTF-8?q?hotfix=20:=20chartCategory=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hispath/activity/presentation/ChartController.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/server/hispath/activity/presentation/ChartController.java b/src/main/java/com/server/hispath/activity/presentation/ChartController.java index 7b84261..afcf993 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ChartController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ChartController.java @@ -129,9 +129,8 @@ public ResponseEntity> getChartDepartmentDistribut @GetMapping("/chart/activities") @ApiOperation(value = ApiDoc.CHART_STUDENT_ACTIVITY) -// @RequiredLogin -// public ResponseEntity> getActivityChartDatas(@StudentLogin LoginStudent loginStudent, @RequestParam String semester) { - public ResponseEntity> getActivityChartDatas(@RequestParam String semester) { - return ResponseEntity.ok(activityService.getChartTotalDatasBySections(6L, semester)); + @RequiredLogin + public ResponseEntity> getActivityChartDatas(@StudentLogin LoginStudent loginStudent, @RequestParam String semester) { + return ResponseEntity.ok(activityService.getChartTotalDatasBySections(loginStudent.getId(), semester)); } } From d57f5de87ce9e6d14207ff7539e3bdd593c5d0dd Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 29 Nov 2022 23:02:24 +0900 Subject: [PATCH 133/148] =?UTF-8?q?hotfix=20:=20Section=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 경력 -> 경험, 학력 -> 교육으로 조금 더 작성하기에 유용한 방향으로 Section 수정 --- .../hispath/exception/GlobalExceptionHandler.java | 14 +++++++------- .../com/server/hispath/student/domain/Section.java | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java b/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java index 90d21f3..fd7dc9d 100644 --- a/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java @@ -11,16 +11,16 @@ @ControllerAdvice public class GlobalExceptionHandler { -// private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); + private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(HisPathException.class) public ResponseEntity hisPathException(HisPathException e) { -// if (e.getHttpStatus().is4xxClientError()) { -// logger.info("Client Error : " + e.getMessage()); -// } else if (e.getHttpStatus().is5xxServerError()) { -// logger.error("Server Error : " + e.getMessage()); -// } + if (e.getHttpStatus().is4xxClientError()) { + logger.info("Client Error : " + e.getMessage()); + } else if (e.getHttpStatus().is5xxServerError()) { + logger.error("Server Error : " + e.getMessage()); + } return ResponseEntity.status(e.getHttpStatus()) .body(new ExceptionResponse(e.getMessage())); @@ -29,7 +29,7 @@ public ResponseEntity hisPathException(HisPathException e) { @ExceptionHandler(Exception.class) public ResponseEntity commonException(Exception e) { -// logger.error("Unknown Exception : " + e.getMessage()); + logger.error("Unknown Exception : " + e.getMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ExceptionResponse(e.getMessage())); diff --git a/src/main/java/com/server/hispath/student/domain/Section.java b/src/main/java/com/server/hispath/student/domain/Section.java index f2126bf..175d004 100644 --- a/src/main/java/com/server/hispath/student/domain/Section.java +++ b/src/main/java/com/server/hispath/student/domain/Section.java @@ -8,8 +8,8 @@ import com.server.hispath.exception.student.SectionNotExistException; public enum Section { - EXPERIENCE("경력"), DEGREE("학력"),SKILL("기술"), CERTIFICATE("자격증"),REWARD("수상"), LANGUAGE("외국어"), - LINK("링크"), ETC("기타"); + EXPERIENCE("경험"), EDUCATION("교육"),SKILL("기술"), CERTIFICATE("자격증"),REWARD("수상"), + LANGUAGE("외국어"), LINK("링크"), ETC("기타"); private String name; From ec7a9092502f465856e2345254ba798faeadbb13 Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Tue, 29 Nov 2022 23:27:56 +0900 Subject: [PATCH 134/148] =?UTF-8?q?[#79]=20=ED=95=99=EC=83=9D=20=EB=AA=85?= =?UTF-8?q?=EC=88=98=2030=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=20(#136)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [feat#79] 테스트 컨트롤러 구현 * merge with dev * chore: student, manager, department, major test data edit * chore: added more major profile pics * chore: major profiles added * fix: reduce student count to 30 --- .../server/hispath/common/TestController.java | 377 ------------------ 1 file changed, 377 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 3336420..13062aa 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -687,96 +687,6 @@ private void saveStudent() { .loginCnt(0L) .readme("jeong's readme") .build()); - studentRepository.save(Student.builder() - .name("우한동") - .department(departementRepository.findByName("커뮤니케이션학부")) - .studentNum("22200004") - .semester(6) - .major1(majorRepository.findByName("공연영상학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2222-3333") - .email("woo@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@woo.github") - .loginCnt(0L) - .readme("woo's readme") - .build()); - studentRepository.save(Student.builder() - .name("위한동") - .department(departementRepository.findByName("상담심리사회복지학부")) - .studentNum("22200005") - .semester(6) - .major1(majorRepository.findByName("사회복지학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4444-1234") - .email("wi@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@wi.github") - .loginCnt(0L) - .readme("wi's readme") - .build()); - studentRepository.save(Student.builder() - .name("하한동") - .department(departementRepository.findByName("공간환경시스템공학부")) - .studentNum("22200006") - .semester(8) - .major1(majorRepository.findByName("도시환경공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-9999-1111") - .email("ha@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@ha.github") - .loginCnt(0L) - .readme("ha's readme") - .build()); - studentRepository.save(Student.builder() - .name("마한동") - .department(departementRepository.findByName("콘텐츠융합디자인학부")) - .studentNum("22200007") - .semester(4) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4312-4312") - .email("ma@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@ma.github") - .loginCnt(0L) - .readme("ma's readme") - .build()); - studentRepository.save(Student.builder() - .name("유한동") - .department(departementRepository.findByName("기계제어공학부")) - .studentNum("22200008") - .semester(6) - .major1(majorRepository.findByName("기계공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-3434-2323") - .email("yu@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@yu.github") - .loginCnt(0L) - .readme("yu's readme") - .build()); - studentRepository.save(Student.builder() - .name("진한동") - .department(departementRepository.findByName("ICT 창업학부")) - .studentNum("22200009") - .semester(7) - .major1(majorRepository.findByName("ICT 융합전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-8787-8787") - .email("jin@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@jin.github") - .loginCnt(0L) - .readme("jin's readme") - .build()); studentRepository.save(Student.builder() .name("김건휘") .department(departementRepository.findByName("전산전자공학부")) @@ -912,21 +822,6 @@ private void saveStudent() { .loginCnt(0L) .readme("yu's readme") .build()); - studentRepository.save(Student.builder() - .name("이연진") - .department(departementRepository.findByName("ICT 창업학부")) - .studentNum("21800012") - .semester(9) - .major1(majorRepository.findByName("ICT 융합전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-1234-0494") - .email("jin@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@jin.github") - .loginCnt(0L) - .readme("jin's readme") - .build()); studentRepository.save(Student.builder() .name("김시온") .department(departementRepository.findByName("전산전자공학부")) @@ -1017,21 +912,6 @@ private void saveStudent() { .loginCnt(0L) .readme("wi's readme") .build()); - studentRepository.save(Student.builder() - .name("박관희") - .department(departementRepository.findByName("공간환경시스템공학부")) - .studentNum("21800232") - .semester(9) - .major1(majorRepository.findByName("도시환경공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-3221-6365") - .email("ha@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@ha.github") - .loginCnt(0L) - .readme("ha's readme") - .build()); studentRepository.save(Student.builder() .name("현요섭") .department(departementRepository.findByName("콘텐츠융합디자인학부")) @@ -1062,96 +942,6 @@ private void saveStudent() { .loginCnt(0L) .readme("yu's readme") .build()); - studentRepository.save(Student.builder() - .name("아무개") - .department(departementRepository.findByName("ICT 창업학부")) - .studentNum("22200012") - .semester(9) - .major1(majorRepository.findByName("ICT 융합전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4321-1275") - .email("jin@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@jin.github") - .loginCnt(0L) - .readme("jin's readme") - .build()); - studentRepository.save(Student.builder() - .name("김요나") - .department(departementRepository.findByName("전산전자공학부")) - .studentNum("21100032") - .semester(2) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("생명과학전공")) - .phone("010-6731-1423") - .email("kim@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@kim.github") - .loginCnt(0L) - .readme("kim's readme") - .build()); - studentRepository.save(Student.builder() - .name("박도마") - .department(departementRepository.findByName("국제어문학부")) - .studentNum("21900432") - .semester(1) - .major1(majorRepository.findByName("국제지역학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4222-3009") - .email("park@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@park.github") - .loginCnt(0L) - .readme("park's readme") - .build()); - studentRepository.save(Student.builder() - .name("이배드로") - .department(departementRepository.findByName("경영경제학부")) - .studentNum("22000331") - .semester(5) - .major1(majorRepository.findByName("경영학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-6653-9991") - .email("lee@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@lee.github") - .loginCnt(0L) - .readme("lee's readme") - .build()); - studentRepository.save(Student.builder() - .name("곽마태") - .department(departementRepository.findByName("법학부")) - .studentNum("21200423") - .semester(5) - .major1(majorRepository.findByName("한국법전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-1292-9132") - .email("jeong@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@jeong.github") - .loginCnt(0L) - .readme("jeong's readme") - .build()); - studentRepository.save(Student.builder() - .name("기운찬") - .department(departementRepository.findByName("커뮤니케이션학부")) - .studentNum("22100027") - .semester(3) - .major1(majorRepository.findByName("공연영상학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2112-4243") - .email("woo@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@woo.github") - .loginCnt(0L) - .readme("woo's readme") - .build()); studentRepository.save(Student.builder() .name("곤잘레스") .department(departementRepository.findByName("상담심리사회복지학부")) @@ -1182,142 +972,6 @@ private void saveStudent() { .loginCnt(0L) .readme("ha's readme") .build()); - studentRepository.save(Student.builder() - .name("도베르만") - .department(departementRepository.findByName("콘텐츠융합디자인학부")) - .studentNum("21400425") - .semester(2) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4211-2673") - .email("ma@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@ma.github") - .loginCnt(0L) - .readme("ma's readme") - .build()); - studentRepository.save(Student.builder() - .name("진시황") - .department(departementRepository.findByName("기계제어공학부")) - .studentNum("21100714") - .semester(10) - .major1(majorRepository.findByName("기계공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2931-9192") - .email("yu@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@yu.github") - .loginCnt(0L) - .readme("yu's readme") - .build()); - studentRepository.save(Student.builder() - .name("황유비") - .department(departementRepository.findByName("ICT 창업학부")) - .studentNum("21900012") - .semester(9) - .major1(majorRepository.findByName("ICT 융합전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4891-1275") - .email("jin@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@jin.github") - .loginCnt(0L) - .readme("jin's readme") - .build()); - - studentRepository.save(Student.builder() - .name("우요셉") - .department(departementRepository.findByName("전산전자공학부")) - .studentNum("21900032") - .semester(2) - .major1(majorRepository.findByName("컴퓨터공학전공")) - .major2(majorRepository.findByName("생명과학전공")) - .phone("010-9191-1423") - .email("kim@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@kim.github") - .loginCnt(0L) - .readme("kim's readme") - .build()); - studentRepository.save(Student.builder() - .name("홍아담") - .department(departementRepository.findByName("국제어문학부")) - .studentNum("21901132") - .semester(1) - .major1(majorRepository.findByName("국제지역학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-9991-3009") - .email("park@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@park.github") - .loginCnt(0L) - .readme("park's readme") - .build()); - studentRepository.save(Student.builder() - .name("김이브") - .department(departementRepository.findByName("경영경제학부")) - .studentNum("22000131") - .semester(5) - .major1(majorRepository.findByName("경영학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-6653-9881") - .email("lee@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@lee.github") - .loginCnt(0L) - .readme("lee's readme") - .build()); - studentRepository.save(Student.builder() - .name("송삼손") - .department(departementRepository.findByName("법학부")) - .studentNum("21900423") - .semester(5) - .major1(majorRepository.findByName("한국법전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-1293-9832") - .email("jeong@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@jeong.github") - .loginCnt(0L) - .readme("jeong's readme") - .build()); - studentRepository.save(Student.builder() - .name("기윤호") - .department(departementRepository.findByName("커뮤니케이션학부")) - .studentNum("22100088") - .semester(3) - .major1(majorRepository.findByName("공연영상학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2188-4243") - .email("woo@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@woo.github") - .loginCnt(0L) - .readme("woo's readme") - .build()); - studentRepository.save(Student.builder() - .name("김영찬") - .department(departementRepository.findByName("상담심리사회복지학부")) - .studentNum("21900232") - .semester(4) - .major1(majorRepository.findByName("사회복지학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-6644-4214") - .email("wi@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@wi.github") - .loginCnt(0L) - .readme("wi's readme") - .build()); studentRepository.save(Student.builder() .name("김영헌") .department(departementRepository.findByName("공간환경시스템공학부")) @@ -1348,37 +1002,6 @@ private void saveStudent() { .loginCnt(0L) .readme("ma's readme") .build()); - studentRepository.save(Student.builder() - .name("장유진") - .department(departementRepository.findByName("기계제어공학부")) - .studentNum("21100114") - .semester(10) - .major1(majorRepository.findByName("기계공학전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-2931-9192") - .email("yu@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@yu.github") - .loginCnt(0L) - .readme("yu's readme") - .build()); - studentRepository.save(Student.builder() - .name("정수산나") - .department(departementRepository.findByName("ICT 창업학부")) - .studentNum("21900312") - .semester(9) - .major1(majorRepository.findByName("ICT 융합전공")) - .major2(majorRepository.findByName("컴퓨터공학전공")) - .phone("010-4821-1175") - .email("jin@handong.ac.kr") - .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg") - .blog("blog.com") - .githubId("@jin.github") - .loginCnt(0L) - .readme("jin's readme") - .build()); - } private void saveCategory() { From b176f60c19143c60e6c8d029cccc422f9b8c6d70 Mon Sep 17 00:00:00 2001 From: gomster Date: Tue, 29 Nov 2022 23:30:55 +0900 Subject: [PATCH 135/148] =?UTF-8?q?hotfix=20:=20loggig=20filter=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/server/hispath/filters/LoggingFilter.java | 3 +++ .../scholarship/presentation/ScholarshipController.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/server/hispath/filters/LoggingFilter.java b/src/main/java/com/server/hispath/filters/LoggingFilter.java index 08315fd..002ca00 100644 --- a/src/main/java/com/server/hispath/filters/LoggingFilter.java +++ b/src/main/java/com/server/hispath/filters/LoggingFilter.java @@ -125,6 +125,9 @@ private boolean isFileUpload(HttpServletRequest request){ return true; } } + if(Objects.equals("PUT", request.getMethod()) && Objects.equals("/api/scholarship/approval", request.getRequestURI())){ + return true; + } return false; } } \ No newline at end of file diff --git a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java index a0511ea..534da71 100644 --- a/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java +++ b/src/main/java/com/server/hispath/scholarship/presentation/ScholarshipController.java @@ -77,7 +77,7 @@ public ResponseEntity getScholarshipDetailInfo(@Reque @PutMapping("/scholarship/approval") @ApiOperation(value = ApiDoc.APPROVE_SCHOLARSHIPS) @RequiredManagerLogin - public ResponseEntity approveAll(@RequestPart(value = "file", required = false) MultipartFile file, + public ResponseEntity approveAll(@RequestPart(value = "file") MultipartFile file, @RequestPart(value = "semester") String semester) throws Exception { scholarshipService.approveAll(ExcelManager.getScholarshipApproveDatas(ExcelManager.extract(file)), semester); return ResponseEntity.ok(null); From 0f968d9ac36c5d3645c564681dd9802f72891ff4 Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Wed, 30 Nov 2022 01:58:07 +0900 Subject: [PATCH 136/148] =?UTF-8?q?[#79]=20=ED=99=9C=EB=8F=99=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=8D=B0=EC=9D=B4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#137)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [feat#79] 테스트 컨트롤러 구현 * merge with dev * chore: student, manager, department, major test data edit * chore: added more major profile pics * chore: major profiles added * fix: reduce student count to 30 * chore: new activity data --- .../server/hispath/common/TestController.java | 498 ++++-------------- 1 file changed, 117 insertions(+), 381 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 13062aa..f15d4b8 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -366,7 +366,7 @@ private void saveManager() { private void saveNotice() { List l = new ArrayList(); for (Long i = Long.valueOf(1); i < 8; i++) { - if(i != 5 && i != 6){ + if (i != 5 && i != 6) { Manager temp = managerRepository.findById(i).orElseThrow(ManagerNotFoundException::new); l.add(temp); } @@ -536,7 +536,6 @@ private void saveNotice() { private void saveStudent() { - studentRepository.save(Student.builder() .name("박성진") .department(departementRepository.findByName("전산전자공학부")) @@ -1082,545 +1081,282 @@ private void saveDepartment() { public void saveActivities() { - activityRepository.save(Activity.builder() - .semester("2021-2") - .personal(false) - .remark("Spring 이용") - .requestStatus(1) - .name("(캠프)웹서비스 프로젝트(spring)_장소연") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); - activityRepository.save(Activity.builder() - .semester("2021-2") - .personal(false) - .remark("우수상 수상") - .requestStatus(1) - .name("(캠프)미리미리C 캠프_김광") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); activityRepository.save(Activity.builder() .semester("2021-2") .personal(false) .remark("") .requestStatus(1) .name("공학프로젝트기획") - .weight(2) + .weight(15) .category(categoryRepository.findByName("전공마일리지")) .build()); activityRepository.save(Activity.builder() - .semester("2021-2") - .personal(true) - .remark("우수상 수상") - .requestStatus(1) - .name("해커톤") - .weight(5) - .category(categoryRepository.findByName("기타")) - .build()); - activityRepository.save(Activity.builder() - .semester("2021-2") - .personal(true) - .remark("") - .requestStatus(1) - .name("정보처리기사 자격증") - .weight(4) - .category(categoryRepository.findByName("기타")) - .build()); - activityRepository.save(Activity.builder() - .semester("2021-2") + .semester("2022-1") .personal(false) - .remark("우수상 수상") - .requestStatus(1) - .name("(캠프)Advanced Flutter Camp_조성배") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); - activityRepository.save(Activity.builder() - .semester("2021-2") - .personal(true) .remark("") .requestStatus(1) - .name("현장실습") - .weight(5) - .category(categoryRepository.findByName("산학마일리지")) - .build()); - activityRepository.save(Activity.builder() - .semester("2021-2") - .personal(true) - .remark("") - .requestStatus(1) - .name("논문 분석") - .weight(3) - .category(categoryRepository.findByName("비교과-연구활동")) - .build()); - activityRepository.save(Activity.builder() - .semester("2021-2") - .personal(false) - .remark("디지털 시대와 개발자 (10.26)") - .requestStatus(1) - .name("CSEE 특강") - .weight(3) - .category(categoryRepository.findByName("비교과-특강참여")) + .name("공학설계입문") + .weight(10) + .category(categoryRepository.findByName("전공마일리지")) .build()); activityRepository.save(Activity.builder() - .semester("2021-2") + .semester("2022-2") .personal(false) .remark("") .requestStatus(1) - .name("캡스톤 페스티벌 참여") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); - activityRepository.save(Activity.builder() - .semester("2021-2") - .personal(false) - .remark("미리미리 C 캠프") - .requestStatus(1) - .name("CRA") - .weight(3) - .category(categoryRepository.findByName("비교과-학회활동")) + .name("캡스톤 디자인") + .weight(20) + .category(categoryRepository.findByName("전공마일리지")) .build()); activityRepository.save(Activity.builder() - .semester("2021-2") + .semester("2022-2") .personal(false) .remark("") .requestStatus(1) - .name("GHOST GBC") - .weight(4) - .category(categoryRepository.findByName("비교과-학회활동")) - .build()); - activityRepository.save(Activity.builder() - .semester("2021-2") - .personal(true) - .remark("") - .requestStatus(1) - .name("네이버 부트캠프") - .weight(5) - .category(categoryRepository.findByName("기타")) + .name("AI 프로젝트 입문") + .weight(10) + .category(categoryRepository.findByName("전공마일리지")) .build()); +// 산학 activityRepository.save(Activity.builder() .semester("2021-2") .personal(false) .remark("") .requestStatus(1) - .name("(캠프)프로그래밍 집중훈련 캠프_김호준") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); - activityRepository.save(Activity.builder() - .semester("2021-2") - .personal(false) - .remark("프로그래머로 산다는 것 (11.2)") - .requestStatus(1) - .name("CSEE 특강") - .weight(3) - .category(categoryRepository.findByName("비교과-특강참여")) + .name("현장실습") + .weight(15) + .category(categoryRepository.findByName("산학마일리지")) .build()); activityRepository.save(Activity.builder() .semester("2021-2") .personal(false) - .remark("") + .remark("BizFlow") .requestStatus(1) - .name("(캠프)파이썬 기초 잡기 캠프_박성진") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("현장실습") + .weight(15) + .category(categoryRepository.findByName("산학마일리지")) .build()); activityRepository.save(Activity.builder() - .semester("2021-2") + .semester("2022-2") .personal(false) - .remark("") + .remark("카카오") .requestStatus(1) - .name("(캠프)Program Problem Solving 캠프_김광") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("현장실습") + .weight(15) + .category(categoryRepository.findByName("산학마일리지")) .build()); activityRepository.save(Activity.builder() - .semester("2021-2") + .semester("2022-2") .personal(false) - .remark("") + .remark("엑슨투") .requestStatus(1) - .name("(캠프)VVS_세상 소중한 나를 위한 캠프_정석민") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("현장실습") + .weight(15) + .category(categoryRepository.findByName("산학마일리지")) .build()); +// 비교과연구활동 activityRepository.save(Activity.builder() - .semester("2021-2") + .semester("2022-2") .personal(false) - .remark("") + .remark("AI Deep Learning") .requestStatus(1) - .name("(캠프)에메르송의 코딩테스트 준비 캠프_송다빈") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("논문 분석") + .weight(10) + .category(categoryRepository.findByName("비교과-연구활동")) .build()); activityRepository.save(Activity.builder() - .semester("2021-2") + .semester("2022-2") .personal(false) - .remark("") + .remark("Brain Computer Interface") .requestStatus(1) - .name("(캠프)딥러닝 심화 캠프_김인중") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("논문 분석") + .weight(10) + .category(categoryRepository.findByName("비교과-연구활동")) .build()); activityRepository.save(Activity.builder() - .semester("2022-1") + .semester("2022-2") .personal(false) - .remark("Spring 이용") + .remark("ResNet Review") .requestStatus(1) - .name("(캠프)웹서비스 프로젝트(spring)_장소연") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("논문 분석") + .weight(10) + .category(categoryRepository.findByName("비교과-연구활동")) .build()); activityRepository.save(Activity.builder() - .semester("2022-1") + .semester("2022-2") .personal(false) - .remark("우수상 수상") + .remark("Anomaly Analysis") .requestStatus(1) - .name("(캠프)미리미리C 캠프_김광") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("논문 분석") + .weight(10) + .category(categoryRepository.findByName("비교과-연구활동")) .build()); +// 비교과특강참여 activityRepository.save(Activity.builder() - .semester("2022-1") + .semester("2022-2") .personal(false) - .remark("") - .requestStatus(1) - .name("공학설계입문") - .weight(1) - .category(categoryRepository.findByName("전공마일리지")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(true) - .remark("최우수상 수상") + .remark("디지털 시대와 개발자 (10.26)") .requestStatus(1) - .name("해커톤") + .name("CSEE 특강") .weight(5) - .category(categoryRepository.findByName("기타")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(true) - .remark("") - .requestStatus(1) - .name("ISQTB 자격증") - .weight(2) - .category(categoryRepository.findByName("기타")) + .category(categoryRepository.findByName("비교과-특강참여")) .build()); activityRepository.save(Activity.builder() - .semester("2022-1") + .semester("2022-2") .personal(false) - .remark("") - .requestStatus(1) - .name("(캠프)Advanced Flutter Camp_조성배") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(true) - .remark("BizFlow") + .remark("프로그래머로 산다는 것 (11.2)") .requestStatus(1) - .name("현장실습") + .name("CSEE 특강") .weight(5) - .category(categoryRepository.findByName("산학마일리지")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(true) - .remark("AI 딥러닝") - .requestStatus(1) - .name("논문 분석") - .weight(3) - .category(categoryRepository.findByName("비교과-연구활동")) + .category(categoryRepository.findByName("비교과-특강참여")) .build()); activityRepository.save(Activity.builder() - .semester("2022-1") + .semester("2022-2") .personal(false) .remark("제네시스랩의 기술 창업 스토리") .requestStatus(1) .name("CSEE 특강") - .weight(2) + .weight(5) .category(categoryRepository.findByName("비교과-특강참여")) .build()); activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(false) - .remark("") - .requestStatus(1) - .name("공학 페스티벌 참여") - .weight(1) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(false) - .remark("미리미리 C 캠프") - .requestStatus(1) - .name("CRA") - .weight(1) - .category(categoryRepository.findByName("비교과-학회활동")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-1") + .semester("2022-2") .personal(false) - .remark("") - .requestStatus(1) - .name("슬기짜기 코딩 교육") - .weight(1) - .category(categoryRepository.findByName("비교과-학회활동")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(true) - .remark("세상을 바꾸는 디지털 전환과 신기술 도입 사례 (04.16)") + .remark("웹과 클라우드 개발자 취업의 현장 (11.07)") .requestStatus(1) .name("CSEE 특강") - .weight(1) + .weight(5) .category(categoryRepository.findByName("비교과-특강참여")) .build()); activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(false) - .remark("") - .requestStatus(1) - .name("(캠프)프로그래밍 캠프_김호준") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-1") + .semester("2022-2") .personal(false) - .remark("글로벌 라이다 기술 동향 및 에스오에스랩 창업 스토리 (04.23)") + .remark("웹 개발자로 살아남는 법 (11.27)") .requestStatus(1) .name("CSEE 특강") - .weight(3) + .weight(5) .category(categoryRepository.findByName("비교과-특강참여")) .build()); activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(false) - .remark("") - .requestStatus(1) - .name("(캠프)파이썬 심화 캠프_박성진") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(false) - .remark("") - .requestStatus(1) - .name("(캠프)Program Problem Solving 캠프_김광") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(false) - .remark("") - .requestStatus(1) - .name("(캠프)VVS_프로그램 기획 및 설계 캠프_정석민") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-1") - .personal(false) - .remark("") - .requestStatus(1) - .name("(캠프)에메르송의 면접 준비 캠프_송다빈") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-1") + .semester("2022-2") .personal(false) - .remark("") + .remark("빅데이터 분석과 활용법 (12.10)") .requestStatus(1) - .name("(캠프)컴퓨터 비전 캠프_황성수") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("CSEE 특강") + .weight(5) + .category(categoryRepository.findByName("비교과-특강참여")) .build()); +// 행사참여 activityRepository.save(Activity.builder() .semester("2022-2") .personal(false) - .remark("Spring 이용") + .remark("") .requestStatus(1) .name("(캠프)웹서비스 프로젝트(spring)_장소연") - .weight(3) + .weight(13) .category(categoryRepository.findByName("비교과-행사참여")) .build()); activityRepository.save(Activity.builder() .semester("2022-2") .personal(false) - .remark("우수상 수상") + .remark("최우수상 수상") .requestStatus(1) .name("(캠프)미리미리C 캠프_김광") - .weight(3) + .weight(11) .category(categoryRepository.findByName("비교과-행사참여")) .build()); activityRepository.save(Activity.builder() .semester("2022-2") .personal(false) - .remark("") - .requestStatus(1) - .name("랩 설명회 참여") - .weight(1) - .category(categoryRepository.findByName("전공마일리지")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-2") - .personal(true) - .remark("장려상 수상") - .requestStatus(1) - .name("해커톤") - .weight(5) - .category(categoryRepository.findByName("기타")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-2") - .personal(true) - .remark("") - .requestStatus(1) - .name("SQLD 자격증") - .weight(3) - .category(categoryRepository.findByName("기타")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-2") - .personal(false) - .remark("") + .remark("우수상 수상") .requestStatus(1) .name("(캠프)Advanced Flutter Camp_조성배") - .weight(3) + .weight(13) .category(categoryRepository.findByName("비교과-행사참여")) .build()); - activityRepository.save(Activity.builder() - .semester("2022-2") - .personal(true) - .remark("카카오") - .requestStatus(1) - .name("현장실습") - .weight(5) - .category(categoryRepository.findByName("산학마일리지")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-2") - .personal(true) - .remark("Brain Computer Interface") - .requestStatus(1) - .name("논문 분석") - .weight(3) - .category(categoryRepository.findByName("비교과-연구활동")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-2") - .personal(false) - .remark("웹과 클라우드 개발자 취업의 현장 (11.07)") - .requestStatus(1) - .name("CSEE 특강") - .weight(3) - .category(categoryRepository.findByName("비교과-특강참여")) - .build()); activityRepository.save(Activity.builder() .semester("2022-2") .personal(false) .remark("") .requestStatus(1) - .name("커리어 페스티벌 참여") - .weight(1) + .name("캡스톤 페스티벌 참여") + .weight(10) .category(categoryRepository.findByName("비교과-행사참여")) .build()); +// 비교과 학회활동 activityRepository.save(Activity.builder() .semester("2022-2") .personal(false) - .remark("미리미리 C 캠프") + .remark("CRA") .requestStatus(1) - .name("CRA") - .weight(1) + .name("전공동아리") + .weight(15) .category(categoryRepository.findByName("비교과-학회활동")) .build()); activityRepository.save(Activity.builder() .semester("2022-2") .personal(false) - .remark("") + .remark("GHOST") .requestStatus(1) - .name("SODA 코딩 교육") - .weight(1) + .name("전공동아리") + .weight(14) .category(categoryRepository.findByName("비교과-학회활동")) .build()); - activityRepository.save(Activity.builder() - .semester("2022-2") - .personal(true) - .remark("웹 개발자로 살아남는 법 (11.27)") - .requestStatus(1) - .name("CSEE 특강") - .weight(1) - .category(categoryRepository.findByName("비교과-특강참여")) - .build()); activityRepository.save(Activity.builder() .semester("2022-2") .personal(false) - .remark("") + .remark("실전프로젝트 1스터디") .requestStatus(1) - .name("(캠프)프로그래밍 캠프_김호준") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) - .build()); - activityRepository.save(Activity.builder() - .semester("2022-2") - .personal(false) - .remark("빅데이터 분석과 활용법 (12.10)") - .requestStatus(1) - .name("CSEE 특강") - .weight(1) - .category(categoryRepository.findByName("비교과-특강참여")) + .name("전공스터디") + .weight(7) + .category(categoryRepository.findByName("비교과-학회활동")) .build()); activityRepository.save(Activity.builder() .semester("2022-2") .personal(false) - .remark("") + .remark("시선") .requestStatus(1) - .name("(캠프)파이썬 심화 캠프_박성진") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("전공학회") + .weight(11) + .category(categoryRepository.findByName("비교과-학회활동")) .build()); + +// 기타 activityRepository.save(Activity.builder() .semester("2022-2") .personal(false) - .remark("") + .remark("SW중심대학 협의회장상") .requestStatus(1) - .name("(캠프)Program Problem Solving 캠프_김광") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("SW중심대학 공동해커톤 2022") + .weight(15) + .category(categoryRepository.findByName("기타")) .build()); activityRepository.save(Activity.builder() .semester("2022-2") .personal(false) - .remark("") + .remark("정보처리기사") .requestStatus(1) - .name("(캠프)VVS_프로그램 기획 및 설계 캠프_정석민") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("자격증") + .weight(10) + .category(categoryRepository.findByName("기타")) .build()); activityRepository.save(Activity.builder() .semester("2022-2") .personal(false) - .remark("") + .remark("네이버 부스트캠프") .requestStatus(1) - .name("(캠프)에메르송의 면접 준비 캠프_송다빈") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("외부캠프") + .weight(13) + .category(categoryRepository.findByName("기타")) .build()); activityRepository.save(Activity.builder() .semester("2022-2") .personal(false) - .remark("") + .remark("TOPCIT") .requestStatus(1) - .name("(캠프)컴퓨터 비전 캠프_황성수") - .weight(3) - .category(categoryRepository.findByName("비교과-행사참여")) + .name("전공역량시험") + .weight(8) + .category(categoryRepository.findByName("기타")) .build()); } From ecda61a2971773b06284f0af03b46e3cb186d75d Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Wed, 30 Nov 2022 02:45:21 +0900 Subject: [PATCH 137/148] =?UTF-8?q?[#79]=20hotfix:=20test=20controller=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=88=98=EC=A0=95=20(#138)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [feat#79] 테스트 컨트롤러 구현 * merge with dev * chore: student, manager, department, major test data edit * chore: added more major profile pics * chore: major profiles added * fix: reduce student count to 30 * chore: new activity data * chore: fixed test data --- .../hispath/auth/application/AuthService.java | 4 +-- .../server/hispath/common/TestController.java | 25 ++++++++++++++----- .../student/application/StudentService.java | 16 ++++++++++++ 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/server/hispath/auth/application/AuthService.java b/src/main/java/com/server/hispath/auth/application/AuthService.java index 6d54bee..0ec61f3 100644 --- a/src/main/java/com/server/hispath/auth/application/AuthService.java +++ b/src/main/java/com/server/hispath/auth/application/AuthService.java @@ -148,11 +148,11 @@ private void addLoginCount() { @Transactional(readOnly = true) public String getStudentGuestToken(){ - return jwtProvider.createToken(String.valueOf(10L), Member.STUDENT); + return jwtProvider.createToken(String.valueOf(1L), Member.STUDENT); } @Transactional(readOnly = true) public String getManagerGuestToken(){ - return jwtProvider.createToken(String.valueOf(10L), Member.MANAGER); + return jwtProvider.createToken(String.valueOf(1L), Member.MANAGER); } } diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index f15d4b8..12cd036 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -3,8 +3,8 @@ import java.time.LocalDate; import java.time.Month; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import com.server.hispath.activity.application.ActivityService; @@ -245,7 +245,7 @@ public int getRandomNum(int start, int end) { public void saveParticipant() { List activities = activityRepository.findAll(); List students = studentRepository.findAll(); - + AtomicInteger cnt = new AtomicInteger(); activities.forEach(activity -> { // int num = getRandomNum(15, students.size()); @@ -254,8 +254,8 @@ public void saveParticipant() { return new StudentSimpleRefDto(student.getStudentNum(), student.getName()); }) .collect(Collectors.toList()); - - studentService.registerParticipants(activity.getId(), refStudent); + cnt.getAndIncrement(); + studentService.registerParticipants(activity.getId(), refStudent, cnt.get() %7); // Collections.shuffle(refStudent); // studentService.registerParticipants(activity.getId(), refStudent.subList(0, num)); activity.updateStudentRegister(); @@ -554,12 +554,12 @@ private void saveStudent() { studentRepository.save(Student.builder() .name("안병웅") .department(departementRepository.findByName("생명과학부")) - .studentNum("21600000") + .studentNum("21600399") .semester(6) .major1(majorRepository.findByName("생명과학전공")) .major2(majorRepository.findByName("-")) .phone("010-1623-1512") - .email("mh03@handong.ac.kr") + .email("mh030315@handong.ac.kr") .profile("https://user-images.githubusercontent.com/63008958/203915182-c8216b87-9e06-4a10-8efe-b8d0cb43b5af.png") .blog("blog.com") .githubId("@wooong.github") @@ -1362,6 +1362,19 @@ public void saveActivities() { private void saveMajor() { + majorRepository.save(Major.builder().name("-").profile("https://user-images.githubusercontent.com/63008958/203987348-497d8992-98e2-47ff-9769-a7207e6961ed.png").build()); + majorRepository.save(Major.builder().name("건설공학전공").profile("https://user-images.githubusercontent.com/63008958/203986081-cc605f80-7cb3-4fc9-93ed-9712a38506c6.jpg").build()); + majorRepository.save(Major.builder().name("도시환경공학전공").profile("https://user-images.githubusercontent.com/63008958/203986080-4921f01e-8fdd-480c-b764-f1d926b070d3.jpg").build()); + majorRepository.save(Major.builder().name("기계공학전공").profile("https://user-images.githubusercontent.com/63008958/203986079-59fe24a6-d934-4dad-9b80-35a1a5306535.jpg").build()); + majorRepository.save(Major.builder().name("전자제어공학전공").profile("https://user-images.githubusercontent.com/63008958/203986077-425b14ae-37f5-480a-b00c-fdec96f09b9d.jpg").build()); + majorRepository.save(Major.builder().name("생명과학전공").profile("https://user-images.githubusercontent.com/63008958/203986074-b785eed9-1531-4c32-b153-dec59ea10982.jpg").build()); + majorRepository.save(Major.builder().name("글로벌융합전공").profile("https://user-images.githubusercontent.com/63008958/203986073-4a098ecc-5f91-4ab4-abb3-2a90149c566a.jpg").build()); + majorRepository.save(Major.builder().name("수학통계전공").profile("https://user-images.githubusercontent.com/63008958/203986071-ba9e0fb7-e246-4cfc-b1cc-788264a9086b.jpg").build()); + majorRepository.save(Major.builder().name("학생설계융합전공").profile("https://user-images.githubusercontent.com/63008958/203986068-5fd2f7d5-c894-49ed-92d7-30a63b4e88f9.jpg").build()); + majorRepository.save(Major.builder().name("시각디자인전공").profile("https://user-images.githubusercontent.com/63008958/203986065-746e6d2d-38e0-494e-b5c4-9060d5bb329e.jpg").build()); + majorRepository.save(Major.builder().name("제품디자인전공").profile("https://user-images.githubusercontent.com/63008958/203986063-d3aa8474-58c6-4e22-a23f-1a17edb40300.jpg").build()); + majorRepository.save(Major.builder().name("컴퓨터공학전공").profile("https://user-images.githubusercontent.com/63008958/203986059-4fc80f57-49b3-453f-94de-6f51b729730a.jpg").build()); + majorRepository.save(Major.builder().name("컴퓨터공학심화전공").profile("https://user-images.githubusercontent.com/63008958/203986052-b02066c1-0ff5-41ed-81e7-72bcf5284dc3.jpg").build()); majorRepository.save(Major.builder().name("전자공학전공").profile("https://user-images.githubusercontent.com/63008958/204516545-6c7ca818-1c99-4c1a-a4d4-569577d344d8.jpg").build()); majorRepository.save(Major.builder().name("전자공학심화전공").profile("https://user-images.githubusercontent.com/63008958/204516569-13f7310b-b5a5-4f9d-8171-065884cbf59c.jpg").build()); majorRepository.save(Major.builder().name("Information Technology").profile("https://user-images.githubusercontent.com/63008958/204516579-bad0d03e-d9ca-4a76-9e94-4a31fe605ce4.jpg").build()); diff --git a/src/main/java/com/server/hispath/student/application/StudentService.java b/src/main/java/com/server/hispath/student/application/StudentService.java index d4b6944..d55f626 100644 --- a/src/main/java/com/server/hispath/student/application/StudentService.java +++ b/src/main/java/com/server/hispath/student/application/StudentService.java @@ -109,6 +109,22 @@ public void registerParticipants(Long activityId, List stud validateStudent(student, dto); activity.addParticipant(student, Section.ETC); }); + + activity.updateStudentRegister(); + } + + @Transactional + public void registerParticipants(Long activityId, List studentRefDtos, int sectionIdx) { + Activity activity = activityService.findById(activityId); + mActivityService.deleteAllParticipant(activity); + Section[] values = Section.values(); + studentRefDtos.forEach(dto -> { + Student student = studentRepository.findByStudentNum(dto.getStudentNum()) + .orElseThrow(StudentNotFoundException::new); + validateStudent(student, dto); + activity.addParticipant(student, values[sectionIdx]); + }); + activity.updateStudentRegister(); } From ef1ef089c5945bf073f3c64807519f6c320c3ec5 Mon Sep 17 00:00:00 2001 From: gomster Date: Mon, 2 Jan 2023 14:48:42 +0900 Subject: [PATCH 138/148] =?UTF-8?q?hotfix=20:=20test=20data=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/hispath/common/TestController.java | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/server/hispath/common/TestController.java b/src/main/java/com/server/hispath/common/TestController.java index 12cd036..259073c 100644 --- a/src/main/java/com/server/hispath/common/TestController.java +++ b/src/main/java/com/server/hispath/common/TestController.java @@ -1087,7 +1087,7 @@ public void saveActivities() { .remark("") .requestStatus(1) .name("공학프로젝트기획") - .weight(15) + .weight(7) .category(categoryRepository.findByName("전공마일리지")) .build()); activityRepository.save(Activity.builder() @@ -1096,7 +1096,7 @@ public void saveActivities() { .remark("") .requestStatus(1) .name("공학설계입문") - .weight(10) + .weight(5) .category(categoryRepository.findByName("전공마일리지")) .build()); activityRepository.save(Activity.builder() @@ -1105,7 +1105,7 @@ public void saveActivities() { .remark("") .requestStatus(1) .name("캡스톤 디자인") - .weight(20) + .weight(10) .category(categoryRepository.findByName("전공마일리지")) .build()); activityRepository.save(Activity.builder() @@ -1114,7 +1114,7 @@ public void saveActivities() { .remark("") .requestStatus(1) .name("AI 프로젝트 입문") - .weight(10) + .weight(5) .category(categoryRepository.findByName("전공마일리지")) .build()); // 산학 @@ -1124,7 +1124,7 @@ public void saveActivities() { .remark("") .requestStatus(1) .name("현장실습") - .weight(15) + .weight(7) .category(categoryRepository.findByName("산학마일리지")) .build()); activityRepository.save(Activity.builder() @@ -1133,7 +1133,7 @@ public void saveActivities() { .remark("BizFlow") .requestStatus(1) .name("현장실습") - .weight(15) + .weight(7) .category(categoryRepository.findByName("산학마일리지")) .build()); activityRepository.save(Activity.builder() @@ -1142,7 +1142,7 @@ public void saveActivities() { .remark("카카오") .requestStatus(1) .name("현장실습") - .weight(15) + .weight(7) .category(categoryRepository.findByName("산학마일리지")) .build()); activityRepository.save(Activity.builder() @@ -1151,7 +1151,7 @@ public void saveActivities() { .remark("엑슨투") .requestStatus(1) .name("현장실습") - .weight(15) + .weight(7) .category(categoryRepository.findByName("산학마일리지")) .build()); // 비교과연구활동 @@ -1161,7 +1161,7 @@ public void saveActivities() { .remark("AI Deep Learning") .requestStatus(1) .name("논문 분석") - .weight(10) + .weight(5) .category(categoryRepository.findByName("비교과-연구활동")) .build()); activityRepository.save(Activity.builder() @@ -1170,7 +1170,7 @@ public void saveActivities() { .remark("Brain Computer Interface") .requestStatus(1) .name("논문 분석") - .weight(10) + .weight(5) .category(categoryRepository.findByName("비교과-연구활동")) .build()); activityRepository.save(Activity.builder() @@ -1179,7 +1179,7 @@ public void saveActivities() { .remark("ResNet Review") .requestStatus(1) .name("논문 분석") - .weight(10) + .weight(5) .category(categoryRepository.findByName("비교과-연구활동")) .build()); activityRepository.save(Activity.builder() @@ -1188,7 +1188,7 @@ public void saveActivities() { .remark("Anomaly Analysis") .requestStatus(1) .name("논문 분석") - .weight(10) + .weight(5) .category(categoryRepository.findByName("비교과-연구활동")) .build()); // 비교과특강참여 @@ -1198,7 +1198,7 @@ public void saveActivities() { .remark("디지털 시대와 개발자 (10.26)") .requestStatus(1) .name("CSEE 특강") - .weight(5) + .weight(2) .category(categoryRepository.findByName("비교과-특강참여")) .build()); activityRepository.save(Activity.builder() @@ -1207,7 +1207,7 @@ public void saveActivities() { .remark("프로그래머로 산다는 것 (11.2)") .requestStatus(1) .name("CSEE 특강") - .weight(5) + .weight(2) .category(categoryRepository.findByName("비교과-특강참여")) .build()); activityRepository.save(Activity.builder() @@ -1216,7 +1216,7 @@ public void saveActivities() { .remark("제네시스랩의 기술 창업 스토리") .requestStatus(1) .name("CSEE 특강") - .weight(5) + .weight(2) .category(categoryRepository.findByName("비교과-특강참여")) .build()); activityRepository.save(Activity.builder() @@ -1225,7 +1225,7 @@ public void saveActivities() { .remark("웹과 클라우드 개발자 취업의 현장 (11.07)") .requestStatus(1) .name("CSEE 특강") - .weight(5) + .weight(2) .category(categoryRepository.findByName("비교과-특강참여")) .build()); activityRepository.save(Activity.builder() @@ -1234,7 +1234,7 @@ public void saveActivities() { .remark("웹 개발자로 살아남는 법 (11.27)") .requestStatus(1) .name("CSEE 특강") - .weight(5) + .weight(2) .category(categoryRepository.findByName("비교과-특강참여")) .build()); activityRepository.save(Activity.builder() @@ -1243,7 +1243,7 @@ public void saveActivities() { .remark("빅데이터 분석과 활용법 (12.10)") .requestStatus(1) .name("CSEE 특강") - .weight(5) + .weight(2) .category(categoryRepository.findByName("비교과-특강참여")) .build()); // 행사참여 @@ -1253,7 +1253,7 @@ public void saveActivities() { .remark("") .requestStatus(1) .name("(캠프)웹서비스 프로젝트(spring)_장소연") - .weight(13) + .weight(6) .category(categoryRepository.findByName("비교과-행사참여")) .build()); activityRepository.save(Activity.builder() @@ -1262,7 +1262,7 @@ public void saveActivities() { .remark("최우수상 수상") .requestStatus(1) .name("(캠프)미리미리C 캠프_김광") - .weight(11) + .weight(5) .category(categoryRepository.findByName("비교과-행사참여")) .build()); activityRepository.save(Activity.builder() @@ -1271,7 +1271,7 @@ public void saveActivities() { .remark("우수상 수상") .requestStatus(1) .name("(캠프)Advanced Flutter Camp_조성배") - .weight(13) + .weight(6) .category(categoryRepository.findByName("비교과-행사참여")) .build()); activityRepository.save(Activity.builder() @@ -1280,7 +1280,7 @@ public void saveActivities() { .remark("") .requestStatus(1) .name("캡스톤 페스티벌 참여") - .weight(10) + .weight(5) .category(categoryRepository.findByName("비교과-행사참여")) .build()); // 비교과 학회활동 @@ -1290,7 +1290,7 @@ public void saveActivities() { .remark("CRA") .requestStatus(1) .name("전공동아리") - .weight(15) + .weight(7) .category(categoryRepository.findByName("비교과-학회활동")) .build()); activityRepository.save(Activity.builder() @@ -1299,7 +1299,7 @@ public void saveActivities() { .remark("GHOST") .requestStatus(1) .name("전공동아리") - .weight(14) + .weight(7) .category(categoryRepository.findByName("비교과-학회활동")) .build()); activityRepository.save(Activity.builder() @@ -1308,7 +1308,7 @@ public void saveActivities() { .remark("실전프로젝트 1스터디") .requestStatus(1) .name("전공스터디") - .weight(7) + .weight(3) .category(categoryRepository.findByName("비교과-학회활동")) .build()); activityRepository.save(Activity.builder() @@ -1317,7 +1317,7 @@ public void saveActivities() { .remark("시선") .requestStatus(1) .name("전공학회") - .weight(11) + .weight(5) .category(categoryRepository.findByName("비교과-학회활동")) .build()); @@ -1328,7 +1328,7 @@ public void saveActivities() { .remark("SW중심대학 협의회장상") .requestStatus(1) .name("SW중심대학 공동해커톤 2022") - .weight(15) + .weight(7) .category(categoryRepository.findByName("기타")) .build()); activityRepository.save(Activity.builder() @@ -1337,7 +1337,7 @@ public void saveActivities() { .remark("정보처리기사") .requestStatus(1) .name("자격증") - .weight(10) + .weight(5) .category(categoryRepository.findByName("기타")) .build()); activityRepository.save(Activity.builder() @@ -1346,7 +1346,7 @@ public void saveActivities() { .remark("네이버 부스트캠프") .requestStatus(1) .name("외부캠프") - .weight(13) + .weight(6) .category(categoryRepository.findByName("기타")) .build()); activityRepository.save(Activity.builder() @@ -1355,7 +1355,7 @@ public void saveActivities() { .remark("TOPCIT") .requestStatus(1) .name("전공역량시험") - .weight(8) + .weight(4) .category(categoryRepository.findByName("기타")) .build()); } From 486af78cf5a37cf7c28384992324c4238bf87eec Mon Sep 17 00:00:00 2001 From: gomster Date: Mon, 2 Jan 2023 15:48:14 +0900 Subject: [PATCH 139/148] =?UTF-8?q?docs=20:=20readme=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f0820ef..1c3c0ec 100644 --- a/README.md +++ b/README.md @@ -1 +1,46 @@ -# HisPath-Server \ No newline at end of file +# HisPath : 학생 교육 역량 평가 및 마일스톤 서비스 + +## 🤟 HisPath란? + +학생의 활동들을 학교 관계자와 학생이 포트폴리오로 편리하게 관리할 수 있도록 도와주는 **매개체 역할**을 합니다. 학생은 본인의 포트폴리오를 편리하게 관리하고, 관리자는 학생들의 활동 이력으로 학생을 분석, 평가, 관리하는 웹 서비스입니다. + +## 📝 HisPath의 필요성 + +졸업을 압둔 학생들이 여태 취업 준비를 위해 이력서를 쓴다고 하면 제일 먼저 하는 고민이 내가 **"지금까지 어떠한 활동을 했는가"** 이다. 이러한 고민은 결국 자신이 학교를 다니면서 한 활동들이 잊혀지거나 기록으로 남지 않아 자기소개서와 포트폴리오를 작성할 때 쓸 내용이 없어서 발생한다. + +따라서 이러한 문제들을 해결하고, 학생들에게 이력서 작성의 **편의성**을 제공하고자 학생이 한 활동을 바탕으로 **개인 포트폴리오 및 이력서 작성** 기능까지 제공하는 서비스이다. + +## 😄 기대 효과 + +1️⃣ 기존 학생의 활동 정보 및 장학금 수혜 **정보를 능동적으로 활용**하여 **학생들의 포트폴리오 관리에 편리함** 제공 + +2️⃣ **포트폴리오 관리 및 이력서 작성 기능** 한번에 제공 + +3️⃣ **다양한 차트**를 통해 학생, 학생 활동, 장학금 내역 등 **데이터 조회의 편의성 및 분석** 제공 + +4️⃣ 학생, 관리자, 전공, 학부, 학생 활동, 참여 여부 등 **다양한 정보 관리에 편의성** 제공 + +## 🧑‍🤝‍🧑 Member + +| ![](https://github.com/gomster96.png) | ![](https://github.com/davidpiao.png) | ![](https://github.com/lukehongg.png) | ![](https://github.com//shinel98.png) | ![](https://github.com/shine-jung.png) | ![](https://github.com/songdabin.png) | +| :-----------------------------------: | :-----------------------------------: | :-----------------------------------: | :-----------------------------------: | :------------------------------------: | :-----------------------------------: | +| **안병웅(팀장)** | **박성진** | **홍성헌** | **이인혁** | **정석민** | **송다빈** | +| **BackEnd** | **Full-Stack** | **Full-Stack** | **Full-Stack** | **FrontEnd** | **FrontEnd** | . | + +## 🔧 기술스택 + + + +## ⌨️ Code + +- 전체 서비스 Back End: https://github.com/HisPath/HisPath-Server +- 학생 서비스 Front End: https://github.com/HisPath/HisPath-Student +- 관리자 서비스 Front End : https://github.com/HisPath/HisPath-Manager + +## 💻 데모영상 + +- 올릴 예정 + +## 🖌️ Design + +여기에 우리 PPT 내용 중 구현 화면이랑 기술부분 추가해 주면 될거 같어 From 51447ac23aff0c5dcd58c633bc96d0d496b150f5 Mon Sep 17 00:00:00 2001 From: gomster Date: Mon, 2 Jan 2023 15:56:14 +0900 Subject: [PATCH 140/148] =?UTF-8?q?docs=20:=20ReadMe=20=EB=8D=B0=EB=AA=A8?= =?UTF-8?q?=EC=98=81=EC=83=81=20=EB=B0=8F=201=EB=B6=84=20=EC=86=8C?= =?UTF-8?q?=EA=B0=9C=20=EC=98=81=EC=83=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1c3c0ec..a06bd2e 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ 학생의 활동들을 학교 관계자와 학생이 포트폴리오로 편리하게 관리할 수 있도록 도와주는 **매개체 역할**을 합니다. 학생은 본인의 포트폴리오를 편리하게 관리하고, 관리자는 학생들의 활동 이력으로 학생을 분석, 평가, 관리하는 웹 서비스입니다. +[HisPath 1분소개 영상](https://youtu.be/gUDZRBHC4tw) + ## 📝 HisPath의 필요성 졸업을 압둔 학생들이 여태 취업 준비를 위해 이력서를 쓴다고 하면 제일 먼저 하는 고민이 내가 **"지금까지 어떠한 활동을 했는가"** 이다. 이러한 고민은 결국 자신이 학교를 다니면서 한 활동들이 잊혀지거나 기록으로 남지 않아 자기소개서와 포트폴리오를 작성할 때 쓸 내용이 없어서 발생한다. @@ -38,8 +40,7 @@ - 관리자 서비스 Front End : https://github.com/HisPath/HisPath-Manager ## 💻 데모영상 - -- 올릴 예정 +https://www.youtube.com/watch?v=3CG4rbCgE8s ## 🖌️ Design From cf6e2369ec53b06a37e1fce58d26b3b815c671ba Mon Sep 17 00:00:00 2001 From: gomster Date: Mon, 2 Jan 2023 15:59:30 +0900 Subject: [PATCH 141/148] =?UTF-8?q?docs=20:=20HisPath=20ReadMe=20=EC=B5=9C?= =?UTF-8?q?=EC=A2=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a06bd2e..5e8658e 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ ## 📝 HisPath의 필요성 -졸업을 압둔 학생들이 여태 취업 준비를 위해 이력서를 쓴다고 하면 제일 먼저 하는 고민이 내가 **"지금까지 어떠한 활동을 했는가"** 이다. 이러한 고민은 결국 자신이 학교를 다니면서 한 활동들이 잊혀지거나 기록으로 남지 않아 자기소개서와 포트폴리오를 작성할 때 쓸 내용이 없어서 발생한다. +졸업을 압둔 학생들이 여태 취업 준비를 위해 이력서를 쓴다고 하면 제일 먼저 하는 고민이 내가 **"지금까지 어떠한 활동을 했는가"** 입니다. 이러한 고민은 결국 자신이 학교를 다니면서 한 활동들이 잊혀지거나 기록으로 남지 않아 자기소개서와 포트폴리오를 작성할 때 쓸 내용이 없어서 발생합니다. -따라서 이러한 문제들을 해결하고, 학생들에게 이력서 작성의 **편의성**을 제공하고자 학생이 한 활동을 바탕으로 **개인 포트폴리오 및 이력서 작성** 기능까지 제공하는 서비스이다. +따라서 이러한 문제들을 해결하여 학생들에게 포트폴리오 관리 및 이력서 작성의 편의성을 제공하기 위해 디자인한 서비스 입니다. ## 😄 기대 효과 From 124814e4cef60fee703e924e47a9a7699f090012 Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Mon, 2 Jan 2023 16:39:48 +0900 Subject: [PATCH 142/148] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e8658e..701683e 100644 --- a/README.md +++ b/README.md @@ -44,4 +44,5 @@ https://www.youtube.com/watch?v=3CG4rbCgE8s ## 🖌️ Design -여기에 우리 PPT 내용 중 구현 화면이랑 기술부분 추가해 주면 될거 같어 +image +image From 77e23d3da741adbfb43239a40bf0969db6cb7534 Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Mon, 2 Jan 2023 16:48:17 +0900 Subject: [PATCH 143/148] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 701683e..ee3fd81 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,10 @@ ## 💻 데모영상 https://www.youtube.com/watch?v=3CG4rbCgE8s +## 📐 Service Architecture + +image + ## 🖌️ Design image From 0633dee9ceb91c7eef2d5bdff8344ef0adfbb004 Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Mon, 2 Jan 2023 16:49:05 +0900 Subject: [PATCH 144/148] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee3fd81..c8178c5 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ ## 💻 데모영상 https://www.youtube.com/watch?v=3CG4rbCgE8s -## 📐 Service Architecture +## 📐 구현 구조 image From 7a58656e27d17ccb34ad4be2da049050cedaa38e Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Mon, 2 Jan 2023 17:08:32 +0900 Subject: [PATCH 145/148] Update README.md --- README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c8178c5..234975f 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,23 @@ https://www.youtube.com/watch?v=3CG4rbCgE8s image -## 🖌️ Design +## 🖌️ Service Design + +image + +## 🎁 Design Layout image image + +## 🔎 기술 설명 + +image +image +image +image +image +image +image +image +image From 80eded2af87709b1baeb42ae97639ce5a10684d9 Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Mon, 2 Jan 2023 22:24:45 +0900 Subject: [PATCH 146/148] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 234975f..583c396 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,10 @@ https://www.youtube.com/watch?v=3CG4rbCgE8s image +## ✌️ ERD + +image + ## 🖌️ Service Design image @@ -66,3 +70,10 @@ https://www.youtube.com/watch?v=3CG4rbCgE8s image image image + +## 🙋‍♂️ 협업 + +image +image +image +image From f2258df89a34828112246a474b725817188bab8c Mon Sep 17 00:00:00 2001 From: davidpiao <63008958+davidpiao@users.noreply.github.com> Date: Mon, 2 Jan 2023 22:25:46 +0900 Subject: [PATCH 147/148] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 583c396..975bca1 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ https://www.youtube.com/watch?v=3CG4rbCgE8s ## 📐 구현 구조 -image +image ## ✌️ ERD @@ -52,7 +52,7 @@ https://www.youtube.com/watch?v=3CG4rbCgE8s ## 🖌️ Service Design -image +image ## 🎁 Design Layout From 79af877b0041a2011dcfe1c2866b040e6ddd9169 Mon Sep 17 00:00:00 2001 From: gomster Date: Mon, 2 Jan 2023 23:00:53 +0900 Subject: [PATCH 148/148] =?UTF-8?q?docs=20:=20Readme=20=EC=B5=9C=EC=A2=85?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 68 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 975bca1..23b5043 100644 --- a/README.md +++ b/README.md @@ -54,26 +54,62 @@ https://www.youtube.com/watch?v=3CG4rbCgE8s image -## 🎁 Design Layout +## 🎁 Service Introduction + +![안병웅박성진_캡스톤발표자료 (1)_006](https://user-images.githubusercontent.com/80206884/210240205-27e4d572-2913-481b-b6ee-eadf08af24d0.jpg) +![안병웅박성진_캡스톤발표자료 (1)_007](https://user-images.githubusercontent.com/80206884/210240213-19452899-666f-4e85-abe4-55b24488f748.jpg) +![안병웅박성진_캡스톤발표자료 (1)_008](https://user-images.githubusercontent.com/80206884/210240215-94bb0c16-1247-444f-b2bb-6ee8d6fb95f6.jpg) +![안병웅박성진_캡스톤발표자료 (1)_009](https://user-images.githubusercontent.com/80206884/210240220-a14b7a92-589f-48b2-a59d-dfa070ffeef1.jpg) +![안병웅박성진_캡스톤발표자료 (1)_010](https://user-images.githubusercontent.com/80206884/210240222-62f30b8a-a205-41b4-8623-d90b2f0dfdf7.jpg) +![안병웅박성진_캡스톤발표자료 (1)_011](https://user-images.githubusercontent.com/80206884/210240223-abeae6a6-567a-42ba-9717-1298242468a3.jpg) +![안병웅박성진_캡스톤발표자료 (1)_012](https://user-images.githubusercontent.com/80206884/210240225-d2a99f4c-191f-4fc7-9b09-ca21041dee6a.jpg) +![안병웅박성진_캡스톤발표자료 (1)_013](https://user-images.githubusercontent.com/80206884/210240229-0bd07665-dace-4638-96df-601f877b7c16.jpg) +![안병웅박성진_캡스톤발표자료 (1)_014](https://user-images.githubusercontent.com/80206884/210240230-bcb28ab5-6c89-4035-b443-3b2f71d12758.jpg) +![안병웅박성진_캡스톤발표자료 (1)_015](https://user-images.githubusercontent.com/80206884/210240232-d31f8ee4-f6f8-4a4c-96b4-9fa90f4ed748.jpg) +![안병웅박성진_캡스톤발표자료 (1)_016](https://user-images.githubusercontent.com/80206884/210240236-02ea269e-3294-4893-b1e2-adb836583d86.jpg) +![안병웅박성진_캡스톤발표자료 (1)_017](https://user-images.githubusercontent.com/80206884/210240239-fb3f6e68-8c65-41c1-aa8d-b1400824e603.jpg) +![안병웅박성진_캡스톤발표자료 (1)_018](https://user-images.githubusercontent.com/80206884/210240241-9ec178c6-39c7-4c94-b1c4-56c004e08ade.jpg) +![안병웅박성진_캡스톤발표자료 (1)_019](https://user-images.githubusercontent.com/80206884/210240242-819eb14c-2908-446b-8091-0e207726744c.jpg) +![안병웅박성진_캡스톤발표자료 (1)_020](https://user-images.githubusercontent.com/80206884/210240246-098300b5-144b-4587-8ab7-52a2d2d641d3.jpg) +![안병웅박성진_캡스톤발표자료 (1)_021](https://user-images.githubusercontent.com/80206884/210240250-04e08d04-5f02-4f65-9ff4-ee3dbf11f735.jpg) +![안병웅박성진_캡스톤발표자료 (1)_022](https://user-images.githubusercontent.com/80206884/210240254-42615b61-d951-4da6-868c-96a10145bcc7.jpg) +![안병웅박성진_캡스톤발표자료 (1)_023](https://user-images.githubusercontent.com/80206884/210240255-d7f85998-fe4c-48ce-8b32-0c6fd30cb293.jpg) +![안병웅박성진_캡스톤발표자료 (1)_024](https://user-images.githubusercontent.com/80206884/210240257-7b2453d2-bffa-4a19-817b-1bc7af19c77e.jpg) +![안병웅박성진_캡스톤발표자료 (1)_025](https://user-images.githubusercontent.com/80206884/210240259-94f78d65-791c-4599-bdee-db719ed314d5.jpg) +![안병웅박성진_캡스톤발표자료 (1)_026](https://user-images.githubusercontent.com/80206884/210240262-ba9b4855-fdbb-406b-9acb-869c4a86f77b.jpg) +![안병웅박성진_캡스톤발표자료 (1)_027](https://user-images.githubusercontent.com/80206884/210240263-4242df45-337d-4b79-a4e6-c8edc7341f22.jpg) +![안병웅박성진_캡스톤발표자료 (1)_028](https://user-images.githubusercontent.com/80206884/210240265-322f78a7-332b-425d-8f1e-f2b768aba566.jpg) +![안병웅박성진_캡스톤발표자료 (1)_029](https://user-images.githubusercontent.com/80206884/210240266-4d4bc509-31ea-4296-b1e9-7c5bd3ebb542.jpg) +![안병웅박성진_캡스톤발표자료 (1)_030](https://user-images.githubusercontent.com/80206884/210240268-5fcfd0ac-bdd5-4c54-af1d-e1de3539c226.jpg) +![안병웅박성진_캡스톤발표자료 (1)_031](https://user-images.githubusercontent.com/80206884/210240272-754601ce-16bd-468a-960d-95081f8c4690.jpg) +![안병웅박성진_캡스톤발표자료 (1)_032](https://user-images.githubusercontent.com/80206884/210240277-e6063842-7ff0-46c1-b326-ec0a4f14dea6.jpg) +![안병웅박성진_캡스톤발표자료 (1)_033](https://user-images.githubusercontent.com/80206884/210240279-6fe8ee61-0df6-4d34-841f-52612dc30134.jpg) +![안병웅박성진_캡스톤발표자료 (1)_034](https://user-images.githubusercontent.com/80206884/210240280-a81aca72-61c4-4c16-b6d2-6ee616fb502e.jpg) +![안병웅박성진_캡스톤발표자료 (1)_035](https://user-images.githubusercontent.com/80206884/210240281-d6c9aba7-77ef-4b58-99d6-21a6e1ae12ae.jpg) + + -image -image ## 🔎 기술 설명 -image -image -image -image -image -image -image -image -image +![안병웅박성진_캡스톤발표자료 (1)_040](https://user-images.githubusercontent.com/80206884/210241017-34b06259-8cff-4f30-8e13-4dbf4b091b61.jpg) +![안병웅박성진_캡스톤발표자료 (1)_041](https://user-images.githubusercontent.com/80206884/210241024-d83efad1-ac9d-44fd-8dc4-b1ce20f68fdc.jpg) +![안병웅박성진_캡스톤발표자료 (1)_042](https://user-images.githubusercontent.com/80206884/210241026-ed4ea227-f3d9-43cd-aa7e-1a38969344ef.jpg) +![안병웅박성진_캡스톤발표자료 (1)_043](https://user-images.githubusercontent.com/80206884/210241029-5d8d28bb-0911-4b7d-9ba7-4f4a87ba64da.jpg) +![안병웅박성진_캡스톤발표자료 (1)_044](https://user-images.githubusercontent.com/80206884/210241031-498ad24a-cd33-4433-94ca-3cc58bed64e3.jpg) +![안병웅박성진_캡스톤발표자료 (1)_045](https://user-images.githubusercontent.com/80206884/210241033-41992c52-dd29-45fa-bfa0-b3b6e3f2ad81.jpg) +![안병웅박성진_캡스톤발표자료 (1)_046](https://user-images.githubusercontent.com/80206884/210241035-3524ea11-6b49-41f0-b0aa-ccc626971097.jpg) +![안병웅박성진_캡스톤발표자료 (1)_047](https://user-images.githubusercontent.com/80206884/210241037-f4805384-e4e6-46d9-aa93-032d272a0a55.jpg) +![안병웅박성진_캡스톤발표자료 (1)_048](https://user-images.githubusercontent.com/80206884/210241043-85f860b0-696d-42c4-a8c7-faf821d34f9f.jpg) +![안병웅박성진_캡스톤발표자료 (1)_049](https://user-images.githubusercontent.com/80206884/210241045-00b865eb-4454-41a6-82a2-1db98ecf9487.jpg) +![안병웅박성진_캡스톤발표자료 (1)_050](https://user-images.githubusercontent.com/80206884/210241047-1398a388-8888-498f-a540-5ad2dabd9b8f.jpg) +![안병웅박성진_캡스톤발표자료 (1)_051](https://user-images.githubusercontent.com/80206884/210241048-b95ae314-b83f-42a2-9e6f-46eb3b93dce7.jpg) + ## 🙋‍♂️ 협업 -image -image -image -image +![안병웅박성진_캡스톤발표자료 (1)_052](https://user-images.githubusercontent.com/80206884/210241246-007ad0fd-03ab-43e4-8a70-718eb0486aa0.jpg) +![안병웅박성진_캡스톤발표자료 (1)_053](https://user-images.githubusercontent.com/80206884/210241255-e059ce6f-946f-4a5c-a8f1-396d714693f0.jpg) +![안병웅박성진_캡스톤발표자료 (1)_054](https://user-images.githubusercontent.com/80206884/210241257-14509c51-6d95-49b9-ba23-b14646084d0d.jpg) +![안병웅박성진_캡스톤발표자료 (1)_055](https://user-images.githubusercontent.com/80206884/210241258-101387fa-9aba-44f0-9f71-a37eff46cd42.jpg) +