From ce8aeb0b7c6b70dba9bc9d5bdc215e903511c9e8 Mon Sep 17 00:00:00 2001 From: Junanaa <148446372+Junanaa@users.noreply.github.com> Date: Tue, 14 Jan 2025 15:55:08 +0900 Subject: [PATCH 1/7] Add files via upload --- 1-sprint-mission/README.md | 1 + 1-sprint-mission/build.gradle | 19 ++ .../com/sprint/mission/discodeit/Main.class | Bin 0 -> 4445 bytes .../discodeit/entity/AbstractEntity.class | Bin 0 -> 1012 bytes .../mission/discodeit/entity/Channel.class | Bin 0 -> 826 bytes .../mission/discodeit/entity/Message.class | Bin 0 -> 1128 bytes .../mission/discodeit/entity/User.class | Bin 0 -> 813 bytes .../discodeit/service/ChannelService.class | Bin 0 -> 649 bytes .../discodeit/service/MessageService.class | Bin 0 -> 645 bytes .../discodeit/service/UserService.class | Bin 0 -> 616 bytes .../service/jcf/JCFChannelService.class | Bin 0 -> 2147 bytes .../service/jcf/JCFMessageService.class | Bin 0 -> 2191 bytes .../service/jcf/JCFUserService.class | Bin 0 -> 2094 bytes .../stash-dir/ChannelCRUD.class.uniqueId3 | Bin 0 -> 2121 bytes .../stash-dir/Main.class.uniqueId1 | Bin 0 -> 4479 bytes .../stash-dir/MessageCRUD.class.uniqueId2 | Bin 0 -> 3131 bytes .../stash-dir/UserCRUD.class.uniqueId0 | Bin 0 -> 2068 bytes .../compileJava/previous-compilation-data.bin | Bin 0 -> 802 bytes .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + 1-sprint-mission/gradlew | 252 ++++++++++++++++++ 1-sprint-mission/gradlew.bat | 94 +++++++ 1-sprint-mission/settings.gradle | 2 + .../com/sprint/mission/discodeit/Main.java | 60 +++++ .../discodeit/entity/AbstractEntity.java | 27 ++ .../mission/discodeit/entity/Channel.java | 25 ++ .../mission/discodeit/entity/Message.java | 38 +++ .../sprint/mission/discodeit/entity/User.java | 22 ++ .../discodeit/service/ChannelService.java | 16 ++ .../discodeit/service/MessageService.java | 14 + .../discodeit/service/UserService.java | 14 + .../service/jcf/JCFChannelService.java | 44 +++ .../service/jcf/JCFMessageService.java | 61 +++++ .../discodeit/service/jcf/JCFUserService.java | 42 +++ 34 files changed, 738 insertions(+) create mode 100644 1-sprint-mission/README.md create mode 100644 1-sprint-mission/build.gradle create mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/Main.class create mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/AbstractEntity.class create mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/Channel.class create mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/Message.class create mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/User.class create mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/ChannelService.class create mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/MessageService.class create mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/UserService.class create mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFChannelService.class create mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFMessageService.class create mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFUserService.class create mode 100644 1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/ChannelCRUD.class.uniqueId3 create mode 100644 1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/Main.class.uniqueId1 create mode 100644 1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/MessageCRUD.class.uniqueId2 create mode 100644 1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/UserCRUD.class.uniqueId0 create mode 100644 1-sprint-mission/build/tmp/compileJava/previous-compilation-data.bin create mode 100644 1-sprint-mission/gradle/wrapper/gradle-wrapper.jar create mode 100644 1-sprint-mission/gradle/wrapper/gradle-wrapper.properties create mode 100644 1-sprint-mission/gradlew create mode 100644 1-sprint-mission/gradlew.bat create mode 100644 1-sprint-mission/settings.gradle create mode 100644 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/Main.java create mode 100644 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java create mode 100644 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Channel.java create mode 100644 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Message.java create mode 100644 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/User.java create mode 100644 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java create mode 100644 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/MessageService.java create mode 100644 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/UserService.java create mode 100644 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java create mode 100644 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java create mode 100644 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java diff --git a/1-sprint-mission/README.md b/1-sprint-mission/README.md new file mode 100644 index 0000000000..81a8535d90 --- /dev/null +++ b/1-sprint-mission/README.md @@ -0,0 +1 @@ +# Spring 백엔드 트랙 1기 스프린트 미션 제출 리포지토리 \ No newline at end of file diff --git a/1-sprint-mission/build.gradle b/1-sprint-mission/build.gradle new file mode 100644 index 0000000000..668101a298 --- /dev/null +++ b/1-sprint-mission/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group = 'com.sprint.mission' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation platform('org.junit:junit-bom:5.10.0') + testImplementation 'org.junit.jupiter:junit-jupiter' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/Main.class b/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..529984c693881628dac91105daf0bf115e41f8c4 GIT binary patch literal 4445 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 bIK@l1B?=>X4@F<<-zft$jj literal 0 HcmV?d00001 diff --git a/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/Channel.class b/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/Channel.class new file mode 100644 index 0000000000000000000000000000000000000000..09bbc324141807ede322be59a94a2cbc267c5256 GIT binary patch literal 826 zcmb7BO;6iE5PfT$xN)3>rU6>$=c$P)wZxSc2|;^`a!C}a$BnZJTiNT#-c;(pY9(kT z4*URq6k>K0fkbi$T50EFcizl61+5O3X@hIVH67@9=GdVJ_^#BcnSsjZa&gE3obUx*u2WXn%8?)({YcY_iC^S!} z3?JLeNXwbdkUF0dMS|!`C3>@TB=P|tC3co9=E;!f(!`6TtIuV@aL|1MyCVi~B6QC( zY_&Vfb1>BD!`TBll6Fps!S83YJQm-jnJHKZ_SwjU4mLXnnf-=M^86CJIwzL>jQiAy;Xk>ayC!}IQDx$JnIu{UNYoRKd?IF!D4znD!# zc*!Ro-86@R!@V&NrH<3fg1V9s!|Ct_mh?&ORH#vEOS9YC?2N&rgtL_+42BL@R}mzk zJ@O{eyk5Dn3Es&BAK-BcKBqplBtx6ku)d-F&!!ql1a(^^D=H*a+tW$1|Jq~3R%q!5 i8AG@}fa~nZ5cY_D9|oc8)Kd$Gah015;gI^u;ph)5?Zwgn literal 0 HcmV?d00001 diff --git a/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/User.class b/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/User.class new file mode 100644 index 0000000000000000000000000000000000000000..a63986adece722c0e5aee8cb7cce9045ae63a7e5 GIT binary patch literal 813 zcma)3%T59@6g?ez$T)%`zTYchG*03cH8BQP#0^N|vJ4H@Ff(MPnD|$kh$b%l06)rj zTZju`L7MbF+I#Lj=YIcuegU|^z6}d=S)?4KkzqLVqrgl0u?&?L$Rv?b=yhb`M;#%R zCqgCFvv<`_RLp%^yyPg z^CCeCn1BlS2r4RNZ4!68w%Xn__TlG%8q4A~S&9<0z^qUc_4mu$iP0CSIr z$hs#(EWVn8Rl18*0MP#R*68G6V~sKgqcW^xgCYVjZJ6EL6Pm|3`aMv)|`vu&V BmY@It literal 0 HcmV?d00001 diff --git a/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/ChannelService.class b/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/ChannelService.class new file mode 100644 index 0000000000000000000000000000000000000000..8547b8926250290ff7d40c45e5c0c97333726285 GIT binary patch literal 649 zcmb7C%}T>S5dOB>##U2n^AgR)J$Q^i6h#mM9zwmx%@DV2Hzm6%_-Y<}03S-+rco;a zA*W@(8NQ#H`S^T$2XKYJLyzG?6f17lrPP+Mq%pG4Jd;Kg8A;0xl^ZFD-@c?;lS+19 z4~GnsWx7eZN_Ea3pO+*ogD*--Ej7&y$t?bDO03h!qc#%8|5_kzrG5Q&5HXB$vOf|x zjYMUo;)}(@UDTCs?C9o7HH?N~ItzCuYtC32>qLi%%ynw3k{IT#hRaS7t{tCWt+V}6 ziB^vGpxQ{+tbRs{_7)VhRKq7X;H0QZLHAO*u)*KepKljBU|=|KM+EfUCG;`C_98qS c)$b4^S3h>u9!?zYV_f5>m^h5#tgcMI0AP;CfB*mh literal 0 HcmV?d00001 diff --git a/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/MessageService.class b/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/MessageService.class new file mode 100644 index 0000000000000000000000000000000000000000..e93a79113ce69d1f7c308c6604a5e63fd5afa52f GIT binary patch literal 645 zcmbtS%}T>S5dOB>##U2n^AgR)J$Q^i6hsgrBB9>b%@DS1lak#Od^Ha~fDcvNrd1*l zp?DhRhwo=*KGtvV0Im>t=rCN!V!_R_RJr8~WsE9vo+=}Yl$7O$%9WDDAIKPyQL;@v z95RgNVkNj1dBz`K<|HkHFG~`ZcEb!}64yhORhrLc_qWmSc@2_Sry+~N_)kHUTV-Fr z^h6AUjO;hzO^a|}xS@laYP~}=4C6`I5FIOH9ce#NSuSi<62r7LaJiR-Ylr7o%e1+; zrl=9oPOh6DFNK-Yai7d>pg!NXA< a`xvHnn6}Is=RU+g=ix-)!^m!#q0P z-LtsJUi?Ist#;c<6gSlrmNelwod)@r+^<8ZqXMj4c*>6;8^ z>c><>Q&o{;D31i@jxYSTMg*uKi)mTgS%#bQAzDyf!>7b{s>6}uraUvF;~Si37~A3g zdXr&lz8Fj8)vNW@>Le~;R>egf-(rp--Ipn;)#;LWcjKI)qH)eB5@E+=56}xbF5?P8 zQ4$O{PJlY$po(h@)5poIxUTuOE<9i6dqc-f%u`SIO}ooIhVy-O)!MdAJ*Q4pHC#nW z3Rh;xN6bOTV|zlWDmrdSc~jjEHH}M}?{s`G6HmFk)!yeSZZq5-*|pDh81%tJL+m)F z-*q{|Myvy5hNakJ(2)8_hJIgEm#bv58hKHgOgMa_+uG*tujaN*k*RvyGVM*%74kU> zD*mn@#g<0Xd@kffUlV8Aayh9K)ydF^clFDr98Ee<8&&3*t)Py;2XVtQOg6b^xuPT6 z%%ED~o5xT&C5J|??3HmpZjqoH#Z$s11ifb2!JaZ?h-SsMBPMD<|EnmSO|q`^`B(%%plW4Srj)Jv_`w@T6|4N zyUq+GGJQ+nwPD`c278nf~w4wV%L`NYR{bd>VhE$TE^N1G1$9u+kCKtpiNF zhxSLX`)3;EcLErPLbJOx)5HC^hedi~sA4I?dP92@ip?G&yH#E|z|=4+#X-mm zF-39_WT^8K0$j&a8YSTG1UN?jg}wwAmAvvd(s^ZpBwENT@0i3-2J*}V`!A6=1)QaR z&f*H@a6RC=6JqsBC`2U?eju2Xq7Vp{r1PO*3Z7AP9PD4rsU$Z;9nWc$*{w$M=}~q@ Z0f1WH0`$cGa$JPKJgqO#0LGBfF0 z|4};AhM~-K`qYR1rcS13CB?`#fYX_evpBJWE$g86=YT9 zFd?vLv|E~Y;98EawJguG+K$$+Jfqz(Eno9Y_s}v-ZQuA&d$hW~X?mXCH0$B4K&qkp zy1+#3G!@fS6-)}u4+Sg&|bXQSgW4>9#miVNxWGtZA*k1 z6(8V|z(~{dHyQ#{#Zv#$aeRnb1s|#S7?%aIJ-n&iL5EV_jTprAjX1<-BJB8-M4wY} z6`v4_Bm{1p0d>Yg1)mB`pORT|UHw(f@_dPSL&Z%L+2KRo?wFpyrJlN0+qO*yuy552 zuAwYtoEIp>WsJpyQdLykf=0~F0b6JaT#OU#sw&feuHp+>(5P#++J~ls+X7z>?d?0$ z^t&Zpx0;UbcUl(Tr2v7k;`@c4Tj5p~sGO5PhQ{tzd~cxQ(mCN07Rly_xnkQ9EF06i zb>&W=+$%l4my`d~zdrG#O|qfky9GQQC}2>n^OlsY`?~QHT^*S%+c0f2W|QfGoTY7n zOugN44RhU+rkxo$Y;VaX@@N_7O~4Jv-;_MS`G1F3L;_!7lw;lwe16TDWh6NQ^5r9l z@(GlkBcy*v=GP$lE}!yF0mhI*8sBiFhVfWLm2cb}ym&&apNTudxw#YMcjgx=N0?en zm48E~ka~lQh14+$NxUqiUNa^EiJfD1AWO^~Puht9|8|HG;S-G^h4{{RnS807!} literal 0 HcmV?d00001 diff --git a/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFUserService.class b/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFUserService.class new file mode 100644 index 0000000000000000000000000000000000000000..1b9b87d99214530f5f144e220b10448355c350da GIT binary patch literal 2094 zcmb7F?@!xS6g@97F$5<~prg&$Xu57~5}@w3ZvBxg8-=pcrnFK972jqYmp{OzAs(#k=1+k)Y?l!M{)v_Fmz-L zWN|^@j@@mWy**EMe6uZkJ=yJ;E!nfXEl2uh&++!9?U=jvOY`ya>IT=%FeIS0EZ-8i z&^YBGM^#5&pfnQI>G;xrV=A;Xa+p?KT@<)c3Za6&nm$X~sSZcVo9dYv1D9}FU~I?n z*IEKorE;u}jg7UH>LfnItd5Tie2h7P%s`pcX|GS&?#4MoE#sU~B*Kmf9-tQuT*W7Z zVi5w@-vRZG2X%ZZFnwCglIK}(8nWlBdaoO}ffA>=Z@GP^CvbV7ujQ`ma@w3xHH~Yi zDB

3K4TK>sU@G)uMr$O5Rj|j}vng%`F3;tHM*B)9&s&I=&RRHF9LfMi_9wL{si` zEWhtL0#9P{(+0KJGMGkVBz(*f)q0iQTBiS$w`9jz@3*%d?+0t!Wn`++wJmqk@}ycv zLCt?9snxyF9LFsTdzpl3+jA(6YER&Ke3I`s;%K^fO9JD4B6qBI&_Xc$xXbBdr)^1> zjjKF?%6YJL+Al1;7B@m5d-*&-3CTApcXo0DlO$MjUBy9}2VXViT>;%5%jGCO#F)U&q4Mb zUe%Egj6=f&?()tE^KlRNxe}g#R5prAe3kR55ul$1a;&1q1@eqY1UM#-l zb^;1EOJX2H_$&%6P(fG1$0KM0@sm>z=w|UP?-I<;<2x(`ML)oDMErm|s>rOOn?J;r z1pY+sluI=WTnsp7!pswnELQN4`vR-@o_k7^Y9vbj2-mh0<{>^4I6(O2`>9(n2w6f%t)7N{V72Sd!0&f@yfd=s3hbnA7>)5@_Hlud2G0NIoN~&P?FN+4+~~ TsB%m|Bu6m@Lr2Cy7DpMb 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 literal 0 HcmV?d00001 diff --git a/1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/MessageCRUD.class.uniqueId2 b/1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/MessageCRUD.class.uniqueId2 new file mode 100644 index 0000000000000000000000000000000000000000..42aa4098cca375d907969e107f57f5155130b31b GIT binary patch literal 3131 zcmbtW?^6?36g@8qSqK{hL^N6{T5CfB21Q#Xh(*9ci&#al^!Kt^!|G;3HyfsY?0;lu zsthvI_LH6IU(i3M?ex6eN3uc7r1s11dvD)8_q==0z59Ou`^C=yuA`np3~>z!9UVvt z^gc4Sje=vi<-(nfN0#XeB&TfG_NN8n*^xC3odSKqrn+xCg$1LwdE3}ZK|{O?-Ox3p zb@bqfz_?kh6lzG5exYW0+qP*HZdC0Q40b$-jIs|C~A0D;A~Sui;iQJ4QIwH*DItw|GjB#`P4xt-V?~k6AV|qVP!q+ zR{i0J)w)|s;T%S!Aaer86s16tD?Zg!E=n1W3gi!sxeAlgR|#P{@sa6zr zq!^15y{Kaf*9k=u0_R@?^%_GBHw2D0$;^13@np%a`4VwP$4$(#(zgw#Zq)=%w47_U z$~2lXZ`9i~=4BXfF@Mo8M)r)X$xtomSd{ro*0)&HmUQ!pjwMMv=~oG6Yxs4~5?GF8fX!kmG7YM!tzuFtDNYv!O4-9r_DMDRN_*QQRYw7{ z*UhpK%3f!?)^feFVR`qB4TmfJOI6cw)(p>3q|s-DDrLnTZ~@lNrZRtJGR+bCbP-A)0CF403U*tsw6^lLeLzTSDUicmG9?|3`o6 zlI2(t%^!WmhpfTWO118p)-7AsU9Tb}uLKvQ7IB96ju-@PBhJeQFEt$B;k7A-PdVpx zgyVjBpWr*mZymVH=RM9gX%Xl9WNrr{w+C%~2VKvQ%H^M-H#hnW13&U>3@dyN(hkH< zAjM}d2GGa5ML+IybvQ)9D%Ln7Uf@*(Bk5PNdw|cB*FT7)@!LY~C-ml@Z>Sn+`4 zP=Gr~hR4Y-gCR1>;xsOEG|xMToNCL>wmP93qoFr; Ccs*kP literal 0 HcmV?d00001 diff --git a/1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/UserCRUD.class.uniqueId0 b/1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/UserCRUD.class.uniqueId0 new file mode 100644 index 0000000000000000000000000000000000000000..fd6b33cf6a03450d48950184676870c21a28db0f GIT binary patch literal 2068 zcmb7F?^6?36g@9lvaoD00gI$4rrJspi0jW*O&W_(D>b5H1cz^3k~jEtlQ5eNGyWI; zDR!onL1sGr)DQieI-TD8b_*M@nerhoZ|~kc=iYPAzWwv>kG}!<7SAjskThY~7(q%P z^V;2Y9nbA-J5RS>%Vr>us;Z6(Y68hZal^!@KvpO91LZl7+}^7v?v4c$$uW$>Hj%b5 zfinW-X1DG1c6`+doVM!qRJY@_RIk}>NfkIf>F=thbk=FJ{Cs^yz-YOFD{!WMgigp6 z6Ip@6P%POARPa_qS;%0DdpRpGUkIUeH;sS_*{+<76gT*pX&dJ-BQUZpgVmP6WT6B(yjSH9)NDq`r>g@DMtUGbeP{BB76p657GHdj_jW2MCpr{CeE1!V+ z#DgZj6qq_HX36*6w{_JExZW!^=24&-?z&!I_5@}I`daRK9?h60Q?YOvB^GW$AQv&~ z3CD6msmeC4vb?GO4oyrl%{3d>x$u-P+udDh;-{3soJ`_IYh)S(O-dZNtvA0x5uJzkn(tqJ@c@&wfcbl%a;rfcNqo5JIQlynL zoFm=>JD6y!rY}hn_O!sW`27Cce#1%PjR=hP3Ay98b>VvCac`4*W!qIAwaa+|rPE-W zWV*2MYJB`!?BZ#F5{llR%<*{%j1$3<=P?I~JNSaJUrE2(fIB%@{r}87XDjq%*vC&N z`Us1PYj!ens$SELz-_)Ee@4!+TGEsM8er-Ke{q9KY;^m6Q$AE|zcg3M=DEt#q_=;Z zj$?rv^qb^Ul>TqgIi0|5q-ak^G_7A#q=qEzfJ|u*qI3Xra}Q&`!unZfe?u!D?4V=W zz$os}&JOc&7x(B&pn__I^@ef`ip?G%v$?Rihsm|lFR;oV@L72uxg=he-_z{`7SdNGv&>b#vg6S6aaWR44kvZbx zW`QZqF&$DltB z%`D+&=qOGtD$7hx28OaE2ucZlAgg%vrD3D9 zZ_#VnPolnJdMrHR3@wS7c>)3jKD+Z)G73(fdrfU=Qj~>6u%xe)o3yixm#m(g9QlpvqL&)xeUsAUAdy!=dd0`G>3shZA8 zA_CGAwQJ(8PS<#Mzw3y3^TG34!P?GJB76cS>kO3V-k9>E=bC{!>sQH89bYA00l7P@ zpQc96y)7>Can8a?^4z+iN`eBJ;YuHN2EL5nu_*b~4u*r9xEL527$q2lfTR`!Kaf;s zP+(+W*3{8u&}3v3WfB592}JX&Gw6V51_=fUAkDy_4koq0BtruO52ou0j~B`=t*eFFH6T z)D7fXpfl8C_2OLP9W7PWz+8m{y+mhA5inabNiW$YB{VfC&DjZVQMyY;Xl78BvoJ^` fTQA2YH#9FO-`N1JpunXtv?!?9SpXyg3M~czy8XoV literal 0 HcmV?d00001 diff --git a/1-sprint-mission/gradle/wrapper/gradle-wrapper.jar b/1-sprint-mission/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a4b76b9530d66f5e68d973ea569d8e19de379189 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 0 HcmV?d00001 diff --git a/1-sprint-mission/gradle/wrapper/gradle-wrapper.properties b/1-sprint-mission/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..9355b41557 --- /dev/null +++ b/1-sprint-mission/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/1-sprint-mission/gradlew b/1-sprint-mission/gradlew new file mode 100644 index 0000000000..f5feea6d6b --- /dev/null +++ b/1-sprint-mission/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# 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 + if ! command -v java >/dev/null 2>&1 + then + 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 +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + 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 + + +# 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"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +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/1-sprint-mission/gradlew.bat b/1-sprint-mission/gradlew.bat new file mode 100644 index 0000000000..9b42019c79 --- /dev/null +++ b/1-sprint-mission/gradlew.bat @@ -0,0 +1,94 @@ +@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 +@rem SPDX-License-Identifier: Apache-2.0 +@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=. +@rem This is normally unused +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. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +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/1-sprint-mission/settings.gradle b/1-sprint-mission/settings.gradle new file mode 100644 index 0000000000..b710045467 --- /dev/null +++ b/1-sprint-mission/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = '1-sprint-mission' + diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/Main.java b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/Main.java new file mode 100644 index 0000000000..f7434e9da2 --- /dev/null +++ b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/Main.java @@ -0,0 +1,60 @@ +package com.sprint.mission.discodeit; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.jcf.JCFChannelService; +import com.sprint.mission.discodeit.service.jcf.JCFMessageService; +import com.sprint.mission.discodeit.service.jcf.JCFUserService; + +import java.util.List; + +public class Main { + public static void main(String[] args) { + JCFUserService userService = new JCFUserService(); + JCFChannelService channelService = new JCFChannelService(); + JCFMessageService messageService = new JCFMessageService(userService, channelService); + + User userA = userService.createUser("Jun", "junhan5231@naver.com"); + System.out.println("계정생성: " + userA.getUsername()); + + User userB = userService.createUser("Suyeon", "suyeon@naver.com"); + System.out.println("계정생성: " + userB.getUsername()); + + User retrievedUser = userService.getUser(userA.getId()); + System.out.println("조회된 유저: " + retrievedUser.getUsername()); + + List allUsers = userService.getAllUsers(); + System.out.println("전체계정: " + allUsers.size()); + + Channel channelA = channelService.createChannel("일반", "일반채널"); + System.out.println("채널생성: " + channelA.getName()); + + Channel channelB = channelService.createChannel("공지사항", "공지사항 채널"); + System.out.println("채널생성: " + channelB.getName()); + + Message messageA = messageService.createMessage(userA.getId(), channelA.getId(), "안녕하세요"); + System.out.println("A채널에 메세지 생성: " + messageA.getContent()); + + Message messageB = messageService.createMessage(userB.getId(), channelB.getId(), "공지사항입니다"); + System.out.println("B채널에 메세지 생성: " + messageB.getContent()); + + User updatedUser = userService.updateUser(userA.getId(), "Junhan", "jun5231@naver.com"); + System.out.println("업데이트 유저: " + updatedUser.getUsername()); + + User retrievedUpdatedUser = userService.getUser(userA.getId()); + System.out.println("업데이트된 유저 조회: " + retrievedUpdatedUser.getUsername()); + + messageService.deleteMessage(messageA.getId()); + System.out.println("삭제 메세지: " + messageA.getContent()); + + if (messageService.getMessage(messageA.getId()) == null) { + System.out.println("메시지가 성공적으로 삭제되었습니다."); + } else { + System.out.println("메시지 삭제에 실패했습니다."); + } + + List allChannels = channelService.getAllChannels(); + System.out.println("전체채널: " + allChannels.size()); + } +} diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java new file mode 100644 index 0000000000..5d12e4aef2 --- /dev/null +++ b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java @@ -0,0 +1,27 @@ +package com.sprint.mission.discodeit.entity; +import java.util.UUID; + +public abstract class AbstractEntity { + protected final UUID id; + protected final Long createAt; + protected Long updateAt; + + public AbstractEntity() { + this.id = UUID.randomUUID(); + this.createAt = System.currentTimeMillis(); + this.updateAt = this.createAt; + } + public UUID getId() { + return id; + } + public Long getCreateAt() { + return createAt; + } + public Long getUpdateAt() { + return updateAt; + } + protected void updateTimestamp(){ + this.updateAt = System.currentTimeMillis(); + } + +} diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Channel.java new file mode 100644 index 0000000000..0d3c9a907a --- /dev/null +++ b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -0,0 +1,25 @@ +package com.sprint.mission.discodeit.entity; + +public class Channel extends AbstractEntity { + private String name; + private String description; + + public Channel(String name, String description) { + super(); + this.name = name; + this.description = description; + } + public String getName() { + return name; + } + public String getDescription() { + return description; + } + + public void update(String name, String description){ + this.name = name; + this.description = description; + updateTimestamp(); + } +} + diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Message.java new file mode 100644 index 0000000000..1df7fb8b0c --- /dev/null +++ b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -0,0 +1,38 @@ +package com.sprint.mission.discodeit.entity; + +import java.util.UUID; + +public class Message extends AbstractEntity { + private UUID userId; + private UUID channelId; + private String content; + + public Message(UUID userId, UUID channelId, String content) { + super(); + this.userId = userId; + this.channelId = channelId; + this.content = content; + } + public UUID getUserId() { + return userId; + } + public UUID getChannelId() { + return channelId; + } + public String getContent() { + return content; + } + + public void update(String content) { + this.content = content; + updateTimestamp(); + } + + public void update(UUID userId, UUID channelId, String content) { + this.userId = userId; + this.channelId = channelId; + this.content = content; + updateTimestamp(); + } + +} diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/User.java b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/User.java new file mode 100644 index 0000000000..ad44d09649 --- /dev/null +++ b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -0,0 +1,22 @@ +package com.sprint.mission.discodeit.entity; + +public class User extends AbstractEntity { + private String username; + private String email; + + public User(String username, String email) { + this.username = username; + this.email = email; + } + public String getUsername() { + return username; + } + public String getEmail() { + return email; + } + public void update(String username, String email){ + this.username = username; + this.email = email; + updateTimestamp(); + } +} diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java new file mode 100644 index 0000000000..a175ec3c90 --- /dev/null +++ b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -0,0 +1,16 @@ +package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.entity.Channel; + +import java.util.List; +import java.util.UUID; + +public interface ChannelService { + + Channel createChannel(String name, String description); + Channel getChannel(UUID id); + List getAllChannels(); + Channel updateChannel(UUID id, String name, String description); + void deleteChannel(UUID id); +} + + diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/MessageService.java new file mode 100644 index 0000000000..e0939eb65e --- /dev/null +++ b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -0,0 +1,14 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.entity.Message; + +import java.util.List; +import java.util.UUID; + +public interface MessageService { + Message createMessage(UUID userId, UUID channelId, String content); + Message getMessage(UUID id); + List getAllMessages(); + Message updateMessage(UUID id, String content); + void deleteMessage(UUID id); +} diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/UserService.java new file mode 100644 index 0000000000..508964331e --- /dev/null +++ b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -0,0 +1,14 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.entity.User; + +import java.util.List; +import java.util.UUID; + +public interface UserService { + User createUser(String username, String email); + User getUser(UUID id); + List getAllUsers(); + User updateUser(UUID id, String username, String email); + void deleteUser(UUID id); +} diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java new file mode 100644 index 0000000000..18ccf47665 --- /dev/null +++ b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -0,0 +1,44 @@ +package com.sprint.mission.discodeit.service.jcf; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.service.ChannelService; + +import java.util.*; + +public class JCFChannelService implements ChannelService { + + private final Map data = new HashMap<>(); + + @Override + public Channel createChannel(String name, String description){ + Channel channel = new Channel(name, description); + data.put(channel.getId(), channel); + return channel; + } + + @Override + public Channel getChannel(UUID id) { + return data.get(id); + } + + @Override + public List getAllChannels() { + return new ArrayList<>(data.values()); + } + + @Override + public Channel updateChannel(UUID id, String name, String description) { + Channel channel = data.get(id); + if(channel != null) { + channel.update(name, description); + return channel; + + } + return null; + } + + @Override + public void deleteChannel(UUID id) { + data.remove(id); + } +} diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java new file mode 100644 index 0000000000..0ecd27643a --- /dev/null +++ b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -0,0 +1,61 @@ +package com.sprint.mission.discodeit.service.jcf; + +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.service.MessageService; + +import java.util.*; + +public class JCFMessageService implements MessageService { + private final Map data = new HashMap<>(); + + private final JCFUserService userService; + private final JCFChannelService channelService; + + + public JCFMessageService(JCFUserService userService, JCFChannelService channelService) { + this.userService = userService; + this.channelService = channelService; + } + + @Override + public Message createMessage(UUID userId, UUID channelId, String content) { + + User user = userService.getUser(userId); + Channel channel = channelService.getChannel(channelId); + + if (user == null || channel == null) { + throw new IllegalArgumentException("유저나 채널을 찾을수없습니다."); + } + + Message message = new Message(userId, channelId, content); + data.put(message.getId(), message); + return message; + } + + @Override + public Message getMessage(UUID id) { + return data.get(id); + } + + @Override + public List getAllMessages() { + return new ArrayList<>(data.values()); + } + + @Override + public Message updateMessage(UUID id, String content) { + Message message = data.get(id); + if (message != null) { + message.update(content); + return message; + } + return null; + } + + @Override + public void deleteMessage(UUID id) { + data.remove(id); + } +} diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java new file mode 100644 index 0000000000..1200c01252 --- /dev/null +++ b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -0,0 +1,42 @@ +package com.sprint.mission.discodeit.service.jcf; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.*; + +public class JCFUserService implements UserService { + private final Map data = new HashMap<>(); + + @Override + public User createUser(String username, String email) { + User user = new User(username, email); + data.put(user.getId(), user); + return user; + } + + @Override + public User getUser(UUID id) { + return data.get(id); + } + + @Override + public List getAllUsers() { + return new ArrayList<>(data.values()); + } + + @Override + public User updateUser(UUID id, String username, String email){ + User user = data.get(id); + if(user != null) { + user.update(username, email); + return user; + } + return null; + } + + @Override + public void deleteUser(UUID id) { + data.remove(id); + } +} From 03d4137b4a84d95fc8cda06906a09eed22202e6d Mon Sep 17 00:00:00 2001 From: Junanaa Date: Sun, 26 Jan 2025 01:06:48 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=EC=8A=A4=ED=94=84=EB=A6=B0=ED=8A=B8=202=20?= =?UTF-8?q?=EB=AF=B8=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 8196 bytes .gradle/8.10/checksums/checksums.lock | Bin 0 -> 17 bytes .../8.10/dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.bin | Bin 0 -> 53060 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/8.10/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/8.10/fileHashes/fileHashes.bin | Bin 0 -> 22247 bytes .gradle/8.10/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../8.10/fileHashes/resourceHashesCache.bin | Bin 0 -> 20061 bytes .gradle/8.10/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 ++ .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 19019 bytes .gradle/file-system.probe | Bin 0 -> 8 bytes .gradle/vcs-1/gc.properties | 0 .idea/.gitignore | 8 +++++++ .idea/compiler.xml | 6 ++++++ .idea/gradle.xml | 17 +++++++++++++++ .idea/material_theme_project_new.xml | 10 +++++++++ .idea/misc.xml | 10 +++++++++ .idea/vcs.xml | 8 +++++++ .../.github/pull-request-template.md | 20 ++++++++++++++++++ build/.DS_Store | Bin 0 -> 6148 bytes build/classes/.DS_Store | Bin 0 -> 6148 bytes .../mission/discodeit/JavaApplication.class | Bin 0 -> 4610 bytes .../com/sprint/mission/discodeit/Main.class | Bin 0 -> 5636 bytes .../discodeit/entity/AbstractEntity.class | Bin 0 -> 1012 bytes .../mission/discodeit/entity/Channel.class | Bin 0 -> 826 bytes .../mission/discodeit/entity/Message.class | Bin 0 -> 1128 bytes .../mission/discodeit/entity/User.class | Bin 0 -> 813 bytes .../repository/ChannelRepository.class | Bin 0 -> 472 bytes .../repository/MessageRepository.class | Bin 0 -> 472 bytes .../discodeit/repository/UserRepository.class | Bin 0 -> 457 bytes .../file/FileChannelRepository.class | Bin 0 -> 3380 bytes .../file/FileMessageRepository.class | Bin 0 -> 3380 bytes .../repository/file/FileUserRepository.class | Bin 0 -> 3335 bytes .../repository/jcf/JCFChannelRepository.class | Bin 0 -> 1668 bytes .../repository/jcf/JCFMessageRepository.class | Bin 0 -> 1668 bytes .../repository/jcf/JCFUserRepository.class | Bin 0 -> 1635 bytes .../discodeit/service/ChannelService.class | Bin 0 -> 649 bytes .../discodeit/service/MessageService.class | Bin 0 -> 645 bytes .../discodeit/service/UserService.class | Bin 0 -> 616 bytes .../service/basic/BasicChannelService.class | Bin 0 -> 2032 bytes .../service/basic/BasicMessageService.class | Bin 0 -> 3605 bytes .../service/basic/BasicUserService.class | Bin 0 -> 1970 bytes .../service/file/FileChannelService.class | Bin 0 -> 2035 bytes .../service/file/FileMessageService.class | Bin 0 -> 3600 bytes .../service/file/FileUserService.class | Bin 0 -> 1965 bytes .../service/jcf/JCFChannelService.class | Bin 0 -> 2151 bytes .../service/jcf/JCFMessageService.class | Bin 0 -> 4033 bytes .../service/jcf/JCFUserService.class | Bin 0 -> 2098 bytes .../FileMessageRepository.class.uniqueId1 | Bin 0 -> 378 bytes .../FileUserRepository.class.uniqueId0 | Bin 0 -> 369 bytes .../compileJava/previous-compilation-data.bin | Bin 0 -> 1830 bytes src/.DS_Store | Bin 0 -> 6148 bytes src/main/.DS_Store | Bin 0 -> 6148 bytes src/main/java/.DS_Store | Bin 0 -> 6148 bytes src/main/java/com/.DS_Store | Bin 0 -> 6148 bytes src/main/java/com/sprint/.DS_Store | Bin 0 -> 6148 bytes src/main/java/com/sprint/mission/.DS_Store | Bin 0 -> 6148 bytes .../com/sprint/mission/discodeit/.DS_Store | Bin 0 -> 6148 bytes 61 files changed, 81 insertions(+) create mode 100644 .DS_Store create mode 100644 .gradle/8.10/checksums/checksums.lock create mode 100644 .gradle/8.10/dependencies-accessors/gc.properties create mode 100644 .gradle/8.10/executionHistory/executionHistory.bin create mode 100644 .gradle/8.10/executionHistory/executionHistory.lock create mode 100644 .gradle/8.10/fileChanges/last-build.bin create mode 100644 .gradle/8.10/fileHashes/fileHashes.bin create mode 100644 .gradle/8.10/fileHashes/fileHashes.lock create mode 100644 .gradle/8.10/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/8.10/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/buildOutputCleanup/outputFiles.bin create mode 100644 .gradle/file-system.probe create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/material_theme_project_new.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 1-sprint-mission/.github/pull-request-template.md create mode 100644 build/.DS_Store create mode 100644 build/classes/.DS_Store create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/JavaApplication.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/Main.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/entity/AbstractEntity.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/entity/Channel.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/entity/Message.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/entity/User.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/ChannelRepository.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/MessageRepository.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/UserRepository.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileChannelRepository.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileMessageRepository.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileUserRepository.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/ChannelService.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/MessageService.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/UserService.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/basic/BasicChannelService.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/basic/BasicMessageService.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/basic/BasicUserService.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/file/FileChannelService.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/file/FileMessageService.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/file/FileUserService.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFChannelService.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFMessageService.class create mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFUserService.class create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/FileMessageRepository.class.uniqueId1 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/FileUserRepository.class.uniqueId0 create mode 100644 build/tmp/compileJava/previous-compilation-data.bin create mode 100644 src/.DS_Store create mode 100644 src/main/.DS_Store create mode 100644 src/main/java/.DS_Store create mode 100644 src/main/java/com/.DS_Store create mode 100644 src/main/java/com/sprint/.DS_Store create mode 100644 src/main/java/com/sprint/mission/.DS_Store create mode 100644 src/main/java/com/sprint/mission/discodeit/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1465449866b4ff6f7b92b13d7e229b81b8fa604c GIT binary patch literal 8196 zcmeHMOK%fN5U$DtdoYkmNZ5oGlC{1dh(d^XMQDXFi6BBKA&x>K9%jbVF|ACdt(h@i zh$8vET=)S$Wb=hW;VZbn87%&VN1`GpV9|QEx zmMOi*dtdjO+%RAm_%0cc_d}K*Df5YJXsNCa%2WtIvX7coqO$txPckbTNahpS(2`mx zp;jfSRWS)MFo_&ct5bhI!8f$j>VRry8Yh_rHBBJMFwlNp137YXKkvw0OUC}ZNBa%CGRv!9}%l!GEAmUhT ztU6)n1Qk|zw!+II&?_HM!%}r2WOB&dwGW!cT>f^ma9S5^$ms$=E?<4E%IV=|QzFq? z3Piwi`32oz(cOO*uEQNzhIM!jFX0vZ27kg^_#58Cf0#lWf5NkP0e{A8cnk01B9_rZ zj-ei)r)lIC!WnC+nZM= z*^6FjjCLwgWVRL->RrT1W3;0)ooJfLB{S}F5#pIP!&tBgvt+Ira@kqZ+1S-U?JhC^ z5g9zD4=1OpP)%OBt#x*;638h#=IbSV2<1+cbb{Sb2kro$>2fAZnY6DA^y<+^GbCsC z{{4Sn*I))W3>XFumI3UWDb5sV4b87n-OG`&c9x#U^vEP}4K0-lWhxveslsuRtv?K@ goF%B#$tSX*CACoc@;?Na_y0E$oGI@x*?uwbKOJ*GBLDyZ literal 0 HcmV?d00001 diff --git a/.gradle/8.10/checksums/checksums.lock b/.gradle/8.10/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..7719b6cd3787567ce1c99ad719e3f4f5588fa436 GIT binary patch literal 17 TcmZSXUhjQyudoLX0~7!NE(HT_ literal 0 HcmV?d00001 diff --git a/.gradle/8.10/dependencies-accessors/gc.properties b/.gradle/8.10/dependencies-accessors/gc.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.gradle/8.10/executionHistory/executionHistory.bin b/.gradle/8.10/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..17728a5f7b529aa57e84fe6e2a21e47df79a558e GIT binary patch literal 53060 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 Fe*m)nMBxAc literal 0 HcmV?d00001 diff --git a/.gradle/8.10/fileHashes/fileHashes.lock b/.gradle/8.10/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..a84e3ef00c57669d4810e19ec3db855bfbdbfee5 GIT binary patch literal 17 UcmZS1%go#Q|E;$x0|ZTuRN#E%%ri!%E{;$*k1{HB1*JmoB=vH|27+5D}po zozWqwlxlKmLfHyUge`ZKBhoh8?E5}-cHaHEU-taxoH6hD&F}o5d4J>h;&~iMqy_RK z{6YHuQ2u@iS5N>7KmjNK1)u;FfC5ke3P1rU00p1`6o3Ly017|>C;$bZ!2hKHpPNV-H#M{uw+FAZXIDdwCLR)Elc}d+S zj8mD2CyrHa@jElG6XWz{h$nO6a*X#jzsI<%3gQ``DNBtW9(;h$xq$fjv-ysCd?#~^ zJ0C^7ka@VyW;AmJ#wlrt7n@}}RB_+7VVvfM__aIpS8}_hT5!J{@d|#FwT#=IzblYP zv{{H(CeImpsZe+kpJRylebW}&t%k$^jJs?`oIm`??OwG9eqXd}h(D&<`fixt+JpJ@ z8Hm5q`fysP?^1|yYA@m=+2*?p12knYPBH$*dDG_3`EoM`_caiI7nLJ4Y)CqV^CO6l zzD~G&m6?AHpRjmU<+s`!NbLfbxChniNOfw-3<5WK4>RFTX zpUXG7wiTw>zEO zFz)gOaq|1ucS_rrWMQ1L3vtUojAdDo0!w_3E#h`Dx*e3PJZpST9^%f~Wk;PSgu5|L z3q#!fP>*NQ`1vAyzB}Sx8Y5*=>s)>DIaY}KTCpnTIr`wgpOhDfZ;lh(^|xBR1oNG1 z5&xxUoW1I*^d)@V3B-4#>e79U3iR=HClL=1iP{-_t>q=g=`6$}gFL+$={FLM?L=M!?_UgXhqGb*_Y}>_?#BR(JP5Gm5IFvKcN5=fC5ke3P1rU00p1`6o3Ly z017|>C;$bZ02F`%Pyh-*0Vn_kpa2wr0#E=7KmjNK1)u;FfC5ke3P1rU00p1`6!MPs(;t?b_#>SbnsAec@V_Mth<$R{s3eb)7?^5+!a8 zi)!CbG}7UKW@t0*FiKw1qL%pxdp8+msPRDCzaL{4I6W2O#AUQCdwA> z6VVl!e-aHZt3o-h+-1v4Np7x|#hn78@s#(jX^)&qxG=C*!Q0bTyaQX}Zi|v)ed>bz z_`HQVtbwJOgG6KFLI+O6ul0?U_gkk0Z)WQdjRHsd@RGpD5MGtC(!DM{@xFG6Ra)A; zj+ic79;?zeXs8%__BqkG-J&ObvfZu1=|RN&$0MubiAG#QYGzJ7y@uVr_hHGg^WxJW z603Nh6kV}vtoDr0J?H1)AMHmpB0PPJrcsAH-c_t|ansqRM>LvpEtW;}C}_$myK9&F z1gH~@GhT&un)HyQEo(>X_^l~iq7hm*AhK9&PcfF>ztMZ(w}1IwQfIRsc6e;N`b27n z{p%2xct^g(y(o_S6riEs>+|+zblcXlbn#gk2_s!6XjZ_z+}J>_s(XJg^8(Sh&D$;? z*q1-SqDd#DdDn{1bx6!;Cijpx-0<8*u?g3-(&m*B4L6}FH7`*gVU#);?!y*w?@$UsAI+2M55u*^};dOnsYWy&7VIre2O&D p$dt;{+9Erc@>xO8EToCaCK{=IwSJjB2X1YoT~xk5k~ASU{sOS+>B9g3 literal 0 HcmV?d00001 diff --git a/.gradle/8.10/gc.properties b/.gradle/8.10/gc.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..7d32a3bde3f005d518e3a8f7a5f56fa590ef38eb GIT binary patch literal 17 UcmZSPF`Ibin%t)E3=oh705R7DssI20 literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000000..32cebd6ffc --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Thu Jan 09 09:15:31 KST 2025 +gradle.version=8.10 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..075e1a9802f569dd553367c2a4ef22f5acc02cc1 GIT binary patch literal 19019 zcmeI&T}V@L7{~GBqHJYOqQ#<=C}QDe*vo|>qm)cHQ#WK0U6dm$&7h{mKol>^nji{7 zibd8SUqO69L|P<53kDlBBzn~Y>IxlQ3{>hu?X2@WlWxT>s^5Waf4=8`9{7K5cTNd{ zCSipxVf9k4F0q0D1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<;9n82N(b2@A4a2B zL>4NCAf(1gi^MxAn#{W&KHZdW8x8#bf$Ol+Ir+V&SnfFi?(MHy!6b6I#Bwr)1(f^$pyA*pA(JxYIXJ zUCn*DZriu_**&7%a|*dDyIzjFQfq0yv75X4z{2j}W5o&DKh0e;)mZb_B~4 z{#EZ=n!mvPl6A`B81TKKKFa-?IcxOX?3Z+!QxNTodA5#QbN#fxj(b^O+D7~B{a@v7 z(sH-Yx&tFKZChzhEcbG4$z+vERZd;Uy*gmtTOU*EqweR-E&S&iM%tQjo;} literal 0 HcmV?d00001 diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe new file mode 100644 index 0000000000000000000000000000000000000000..e233566ec868d9d5d57c3b457b8a71d15e850edc GIT binary patch literal 8 PcmZQzV4O1d(qmo#39kb6 literal 0 HcmV?d00001 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..13566b81b0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000000..b589d56e9f --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000000..2a65317ef8 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml new file mode 100644 index 0000000000..12ea55508f --- /dev/null +++ b/.idea/material_theme_project_new.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000..fe0b0daba3 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..b1dbd2fa73 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/1-sprint-mission/.github/pull-request-template.md b/1-sprint-mission/.github/pull-request-template.md new file mode 100644 index 0000000000..8b17f79e91 --- /dev/null +++ b/1-sprint-mission/.github/pull-request-template.md @@ -0,0 +1,20 @@ +## 요구사항 + +### 기본 +- [x] 기본 항목 1 +- [ ] 기본 항목 2 + +### 심화 +- [ ] 심화 항목 1 +- [ ] 심화 항목 2 + +## 주요 변경사항 +- +- + +## 스크린샷 +![image](이미지url) + +## 멘토에게 +- 셀프 코드 리뷰를 통해 질문 이어가겠습니다. +- \ No newline at end of file diff --git a/build/.DS_Store b/build/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..add8f6cd0ce673c7f417941061b92b3dd4b17f16 GIT binary patch literal 6148 zcmeHK&u`N(6n<_CX*41A01_OKEbUs2QZYouC6sa4b)CimP)U{wBC@z@QuR<(%6jU1yrMjmU2 zsDUXL3Ur~$Uon&mN4fUA$Ybr$g_H7^59M1{{)VD#>-fI5bW)K+NksusU|WHvd+qT4 z|L))S|Lq`o69q(p|4ISXIvJe|F(kjY?hKCiS`GgUXJcONa1(-z-HO5Gt@ttA8p<_i WfRV@AAxdC!5U?^xA`0B80>1$RBx{iX literal 0 HcmV?d00001 diff --git a/build/classes/.DS_Store b/build/classes/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e3c63e94ee443001e645238790169e8e3f308eb6 GIT binary patch literal 6148 zcmeHK%}T>S5Z-O8X(&Pt3VK`cTC@f$7B8{ZgI6nhP^pP27>(J|r1nq>x$6u0BEF8! z>~0ISiZ>BE1GC@E&di4WHtY{$j5i124r2~utPF}+u%Y=vFpfGW1=EAbag38#-UhJ@ zz{dee{yqb^b|rSteD=irPwRIGv8{I{Y9iCTV3_vII==?JI7+ix?Tr_TrKM%dvaO1B z-M*8v`tZo?gq?ef~@_Q7fAA%0Bcv*w<|kEvwE-~?VK z1|cy(3=jj0$AH-y%az5OI?b3EAO?P50QUz0is%{4HL9%x8oWMYyo87Xwz~QQ3gdeQ zbBz!I;kp!1mvZyO;O6DPbveX6lb>tU<&3K@!#L*4+`Le@d3bQ4(i!(OQcDaF1G5Yi zwd>&dfBgOXf3}D`Vt^R97(li^h8?@dpMNzy9 zig%sSar`DaQZO_A0Dp>&f5GuN*=@VI%n}$UGn=z#&-=X3dpqYnfBpN%p8$5?dlfBM zqadWA6>S3Rj_61AcvjC%$M;PfF*1%o+jcW&I`;^y>FzlcMp&TrS<9N74@2ep%JANd zHEEd6V8)t@KtqRuP7Q0ZPT*!v#qE5-%sKHn)3!}37oRk3cYWM83P;V15g+4V)Ex_` znS!A^hMW`F-<@7%H0ls%I$1x{lMYm4q&1~K=(YkO1ajAOHC6` zMY0_O7*r6~a5HYHs*KTj+cD-?5LS`(ak;C=wBq|^nlniaeU1*iRXXstCLQQ0jj|~3 z&~PX2Vq(tevqs9wWpwAT>CA9sJ9^Hs1-91N?!~WCw_cT~NFb?TyT&SK@ouP;Q8h^c zrBa#M9Ia@OnLURT+$*pnFaruk-m*={D$K`^WTxVKQp2)x53J0p*eN%dlmK^$fW4p| z$4e?d)R2T4zIZ6ly?&?%B-Cz!WFV{M!k*A=GZP<@Pv2&xViz8gJ7=0W-NBoX&%SC0 zC8eA93fyzCL_Gg^C8A;k`z4o$3DrE8Iwx1?j9vmA&&Mlt4q!~uIVA97^K|M0l??Xk za(sM2X;Pxvdljo65!e|R1YZoN%&ZX~=A$~8Dh|uMdQ4#GqLJ!Cq2f^q_T;62)j3kd z6Ii1{$Ap56hDjI#{ec|!uobv3pU;}yfp~5UwA+SL%u9m>p1eRz8wKVfj%i7BTEh%X z0j;9e^Nzq|lbUM-9Gpnr!RQHb`_?h5Aq#Hv>*w6FC{^i84jMK${STTXQC$=lNX;4! zO%aySVDbutQtZJ5)~3yzv9~xkVH6JP6Isqg(^f{$9?}b@eD@|p&Wy>EWH4AqO$HbqzD9*=J2N$n)$PI3%bII)fCrujBrp(+P!kJM@UmdV z_$DdTWB{8_z39wX^nl_aHp|6BqB}x!y2*On*!@_8CP(IiUYKTdH#GR{g>X-1N*;y+ zcLlq_x8uo7lQQmM?+eNb)&rGKK^bxU8md24(Zb7IMh49NQ`A`4NLDFln!C!$}pV@Tr2& zWY>3^y`5a@Uck)UQES$SyZxNo2oCER*=Y%!_P1-^LKk$Go}0`X_SUpz%@*?wE=#_Y zsS-RmpEnvT_ves%B~1FeO%EcaXS1WGWAJ|U1ru-S=ac0VU-637Res~^^1_)!m*76W zn|Gr^Dy!SJVJrAr;D$P58`+@XTY=5NOIcQ~!Pvr`yM=8u*n9AbgEl^Me2ep6$l2aS zh%+3tz~WPW2CsT~J~ej%o;_g-RJ82kr*ISS4(S@xQRlP0|NfB@9^n6jdrR0g z-nWQ7iBJh6%vTE-TnFHO7L=Q*3j9EXe zAK-J4_oZ8q!ZxINbsM9np2i)RWmP`UFRvkq-Z+ zhW99|lF3bYpRy6+Zo&tQjYd}ME1A_nO==}dGM*ojQ45)VTwx~g33+{vFZrf&^cB9r HcZmH5>P3@0 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/Main.class b/build/classes/java/main/com/sprint/mission/discodeit/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..38739fc5ec80b82733bce133513ecfda1e6c5721 GIT binary patch literal 5636 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 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/entity/AbstractEntity.class b/build/classes/java/main/com/sprint/mission/discodeit/entity/AbstractEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..da051eec3cc742cc25d2a55ee34a5b873458b3ff GIT binary patch literal 1012 zcmb7DT~8B16g|^!yL7vy&{70Hs0eCXl~v-4K}`s10;%!_5W+I0?!_tL)XRE{ZNC?IqomSkwxK(IcX>oeiv@ zreoE_Ev!uqa&i?(?lCMoaTrq1Q{nNC!gWQI%yeYnHty)SYvLX@Ze~g(Xa|0uLBF)! zm>+*;s5Xwq6Q#$=ME6Z>;sL{g6LMSfeNt`AZ@O;V#KWX69`wd_+5yeVP;LvKe~P^> z4^Qo`OFNZz;Mne&9SW6?H#PZ1v3}Y9f8F*Na(yljNxLG&gOq9N(m$@Fl1@spJmRZ_ zi=^!h$mf$F4jukMD5}+Ihjx_b+9o-jp*NN#U&w3vT2UfV)RYJmb0A8{)B1?AbE;$% zH(EcyTG!BrC{d_hV||EvtMwiAA-29zMFx*)T_r3~pl$}e#Ug4@{*}<6U31h4O|&Ru zc#`a>TP(`dEjj8}`br<8W{Lz*o&e`k@KZda(^+tR7F?MN-kA&Dng!S9fHfj}BhIU_ bIK@l1B?=>X4@F<<-zft$jj literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/entity/Channel.class b/build/classes/java/main/com/sprint/mission/discodeit/entity/Channel.class new file mode 100644 index 0000000000000000000000000000000000000000..09bbc324141807ede322be59a94a2cbc267c5256 GIT binary patch literal 826 zcmb7BO;6iE5PfT$xN)3>rU6>$=c$P)wZxSc2|;^`a!C}a$BnZJTiNT#-c;(pY9(kT z4*URq6k>K0fkbi$T50EFcizl61+5O3X@hIVH67@9=GdVJ_^#BcnSsjZa&gE3obUx*u2WXn%8?)({YcY_iC^S!} z3?JLeNXwbdkUF0dMS|!`C3>@TB=P|tC3co9=E;!f(!`6TtIuV@aL|1MyCVi~B6QC( zY_&Vfb1>BD!`TBll6Fps!S83YJQm-jnJHKZ_SwjU4mLXnnf-=M^86CJIwzL>jQiAy;Xk>ayC!}IQDx$JnIu{UNYoRKd?IF!D4znD!# zc*!Ro-86@R!@V&NrH<3fg1V9s!|Ct_mh?&ORH#vEOS9YC?2N&rgtL_+42BL@R}mzk zJ@O{eyk5Dn3Es&BAK-BcKBqplBtx6ku)d-F&!!ql1a(^^D=H*a+tW$1|Jq~3R%q!5 i8AG@}fa~nZ5cY_D9|oc8)Kd$Gah015;gI^u;ph)5?Zwgn literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/entity/User.class b/build/classes/java/main/com/sprint/mission/discodeit/entity/User.class new file mode 100644 index 0000000000000000000000000000000000000000..a63986adece722c0e5aee8cb7cce9045ae63a7e5 GIT binary patch literal 813 zcma)3%T59@6g?ez$T)%`zTYchG*03cH8BQP#0^N|vJ4H@Ff(MPnD|$kh$b%l06)rj zTZju`L7MbF+I#Lj=YIcuegU|^z6}d=S)?4KkzqLVqrgl0u?&?L$Rv?b=yhb`M;#%R zCqgCFvv<`_RLp%^yyPg z^CCeCn1BlS2r4RNZ4!68w%Xn__TlG%8q4A~S&9<0z^qUc_4mu$iP0CSIr z$hs#(EWVn8Rl18*0MP#R*68G6V~sKgqcW^xgCYVjZJ6EL6Pm|3`aMv)|`vu&V BmY@It literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/ChannelRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/ChannelRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..a8d5fce2ea64cf079c236f0f5fab7829a82df0a3 GIT binary patch literal 472 zcmb7>&q~8U5XQf)F=^|+s^Bvu7uTyqEmaW;0l`x5Frx7{=*M(h3x2(u`xgh7r8d;JnY^li0N-eD;Z>zO@_{fb> z`emy`2m}W6e3eU`o0)umo2$YL1TJ4GfvY(C7p;sZzs07>t3daiOnJW^mjc5$Ysj@H zEvM7*W18%Q6Nomjk=6odaq-Acni5QWdwn6&k;D)s&dm4E=NEumoJQyouJdXk+_Kizi-mShS5_3-3TFIriz{T7=hZ-oAbw#CDGQV{OrtR**I z8!?+r9@Ate93k4k#>NoN;^Yr3)6S=a!Bm%4`ljYp$DM|oorc{pFD#T%o?++R&Dq*; zS~Yd9p0weXi_R@CH)cZuVUK?U1bo_kgq*Mu^xHVVkn0Cr?ctF1BOG&1IBAv9FUqru Avj6}9 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/UserRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/UserRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..9e943c65b76574f0392a43cf3e3a1334b1fe0398 GIT binary patch literal 457 zcma)(%}T>S5Xb*pW75{IsxOfobZ=f#3l zke=p~-^_pJ=g4STkthiyF7GS6rC zX|g{{AZkf>buDlaC%;G;IiCs)=Csg-Z!9l4*=ZQ>KWW0Suu`@1OuF3NnMDofrm>}Z vpt^1Od%x>eV<;eSz|Q~zKIb7qc31-XogHAv^&_tKaLoA=oU$)))@4Rt-du#{ literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileChannelRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileChannelRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..a24f511702603973d9f502899b4763c724e5c8d5 GIT binary patch literal 3380 zcmbtW*-{%v6g@4L0Ws`g;}yJ1Vi8_qL*&?IF*XTX43A(K{<4*vu;I|+GDAQ1`qXLxz z4R?%XBbqWY3(?8BJ7&TasJv)pEccQ?StuN@LY07?STr&jGv)L+X0{qZ)M(Ik)S^yc zFkz>o&QjLOxY4xbIF_A>CM_pnCr!(ZX3Ztrv0OX55}mhFW^{zZP#)|?@kpRb9!?qV zqCnHwrbW{(VHaXSYHZNah$fnnvW?_O)=o<#fyPicFQ0R*RCL@}ib?ZYbhKiRKzY(| z4T1VCB0;oapN9Q94&b0b=dK=@8P{@GqMp$L6$_?2nxvg2ns4459gfxDFxoYA=s1F- z0=3GKf?=d{DMxnuLOuucl*hL3cwYJ9qF6Yts*{99JTC>*zt0xv*@ca;78DR^slEok}rR7;Bmp!D*RHX9V_n znw8H!nQ&ZUp40J?w6Zd5rtM`@!v%r;O21`$$v2sENfN_u8fgvvR9iTguKG`d=tE4Z zy(rM?ci79Ba6E|fxFjVmZyF{Q`BcR6QUf{$F(goPFKfAGp$tk;y+GyVuj&|)QK(3y zY=?eaFYu_sHM5wt?-_F`Gl*+=RmW=>V=frUdo)ZG&}i)F zmTjZ_~f;Z1b-V|bYLJmn z79!A6$hp!oh~ugTa(KwEdBS!_>|7>U3H367TF(yFlGC*1Ul52f*wj4 zj@PyQ}fJ zH_y=T+}fpXnTZ0uq21xOSRIZFXkPjXbidGD^*zZX2UldDzU=QwioNg)f(0zXG;ECl z&6~F}$$?aA>$gDmQ2ISk$X=Cxa`WN~DVA}oOqwavC40@=y&yqlw#_&l%$v4j6D5Y= z_12<@ucPp+cG@)(cUcx**TC<1>P5TdkM4 z!={f)j_-44RNVubBWnMzbQ|M1|GJxl3d&Hdpq`lHPV4n}Ku83EMkMOa=`vjj-UXl=_9r8xwIwG?Y z^C`Ln*3i2Z^03eCMh`O2>t_V`9A9vhfMcG44W5B#13SBZ3^h1T_fPmtZ77=B;F%hb z? zw(0fGHB3KyOqUx;Q3t>8M~ENd4D{kG#(5%1Jc=rgAxecQ7olW`=UtSD;2b(}8Qse2 z4u#Z?FYy&^JV%cn;A{S)jh-jp@P7{~HwY2X5Y+gl5gM*-FctX~lWVTjR>eOMgBr$b z$RA(I9Lc5#dp-}ZBTk=hE1%z3!<%FD@tx;5EPb8pdZea@D7s94&Dk|9Jjy$MM>$Tf zq~Gn-*g@`3aRv?{iUjwfYL@Fh@{pew)xKQI^FAzk{G3EJC3=Z=ns{e;=QJgHDRV~g z*hen<`B;>N5@F05`Fi{o-;tSK+VBA1^IyMW>j%Zwu#c?^sMsJ_K(Q0w!WN%b9$Oo{ YNG5}FNL<(OqgUiVbN?5r4dB=R01f3z%K!iX literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileMessageRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileMessageRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..9c9b64ff58a80e9dccdd7e766f56726619ca554b GIT binary patch literal 3380 zcmbtW*-{%v6g@4L0Ws`g;}yJ1Vi8_qL*&?IF*XTX43A(K{<4*vu;I|+GDAQ1`qXLxz z4R?%XBbqWY3(?8BJ7&TasJv)pEccQ?StuN@LY07?HXX-UFr6O9%vK|a8V$ORTGR;) zChT<7S;|@&H=4E_$Feigq~#>+q-nX)thr=6mTPBMqVrbDjE-;^&x7449tl**!zsgE z6lfaTv}oET>_RL^jSV^)(L_^Hwvimk+G&X-&=?Bm<#Vo;ijEsgF=<|lj#lguC{G%$ zAyB_XB#1Wb)39I10UQ+Q+|>g!<67=Y)H7P3V!?DrleDu$^Ua&1!?7A1M!SX%9Y=6f zpjJ6jFpP9A<;ZSd$md|5^4Rtr&nsVC6br|7oRCoqI>xd&V@nRC(o;G@2vY-X6F9kp zh8^%UbP69=ez`6hENNn+SdBdwvIY76JmRsU%aeTYf5 z7X@1V4tqHhjt6lbm!!nyO~a%jpNd#sYCy*zh6HNvWi8h%ltBrq7pT1aRUIQT3KfZz z?a+_w1s+wnW)`#dJ!39q25}9q>Ua%f%mpKvoX#yRWtsaXv!~5(a`6W3(J)a!qp_ot zSMMjxB}ue~sRCU}&5axrGi?^nt8hbL?}$O3k{zzyAv2_-P`5!$Vn%XtQy}73?Xl%c zz*1vwk-I_&@*Iq2d=Z+Z%EGaXknb>v+hB6U@s`y4_NL3ytxXISf;isQ@g7*JK}J4V zh(Jpr=Ss^Uj;k8T;UT}~3ELg9bD3n34-NBd4@yL(<8{MXWPb?4l8YnQrZCJOY1c8A+ybvQ1ddFdGwb(dsX_$&5JLjSjMd~X{Jn<>@{!qf&`V>Hsf?KZ`zJclo*27 zTZ5CrY1c^HWm$NUFSBLf4-}=hl|1jX7f)ryZ>t(gc-mBH73(pk;ip1pD?JgI zDxr$z{Qry(PTRR`!jvYmZOUm|4feg^L_# zfo0tDV5d+On!p92l6MRZ}NkWWv$QzC8h|EgN zr|1$`L+@6|!#=kgJ;*$-pAq15e8Euyj(G+)cm|#g?Ckn6)ZjSXKjAaAp=fG@XKFyc zmptUZ89Nz_E9*EvyN5q$gpwhicTpmObLhlnbStYn z6jD3B#8RiIDNjYe12mMZ;sK&cb?<0^mVT5k(wT&=ra8^XV^Qoa}w2*=q1`|;+^50)0F6?%o)XF zAGzq~V^J1LgfVO6>+xHBM`n6y!vlQJfBlNB9~4`|KDI8PVuN4-#ZG(+TYO%5Y;Eu& XnGDJyab3fYUXlOI{a>gyfM5RuezZ$} literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileUserRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileUserRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..ab93917cbbd34c5d2128c7009d11d7c6cd233101 GIT binary patch literal 3335 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 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..e5e8a2ae9555ef59c495bdfde70e7370d41f2896 GIT binary patch literal 1668 zcmb7^Yflcb?x02ya2{%gEpy^#*ZtkIA&qV?n1)9YLm9c znl$~~AJz2Cve5-8i64O7;mmX1bKW!a=kL#709LUXh7W!T0U1LGGDJ_+ma6D#y{ddT zI@QWHLomzh++JhwCz2%z!wfMesA+Ru*;cKSU9}O01b+x4kR^=Dh+vFiqioa^t6}oG zt<<<>aigwOxK%bP8n+cwYZw-{4YRGBmXDS9g{@u9vec^f@$wIbKt;7xhOy#RLQ0ki zBZjzyaT&L8n;|_gkyf|4-Bw&W!%$VTcPb3=MACyjIM~_Dj9?N|5~gL`!Ci*YuB=pl zqe<;pNp!Y(dX%}o;*ON!p1L-NC&K0g!?c^(@z4{KED2^xMp~#0np(|hX%ZG0-VSWC z$IU)AhW2^2uG&pgW7zXFoxIF?UL6mL1M_s7nOV!wj1*{~#EkH|w%4p3Y33*ONT-!} z(I~5WNj156cNYWp38yCI2dD9r^S|K~nJu+Nd6pA{VLh6YB?hV1nRSN68|`HnKIZjG zzAXlL-Rq&#yW|aFK2DfuuLC4cB+2P|?;#O0M|J1ACQK}5ZfdZuUA10 z3hx_Dv#f1#VdQkb%V9~J2h7uz;{(G}`ozVxL%&OOvH76TpwnSTkiM5`Wet9M0-~ui zu+#;l!!v}wBmC8gen#KoCIp5NKnTz2N$$ks1zyq{!z;XYS=+=CvC-5wgwsC|O`l`J zkI%iVQPLA}SQDLimqk1A1}j9PbA@*+m9% zya+PLI=oe?)aO*3aVw5pVD3;b&+&la3=6%;Nl&>k7ujjzIw3cZa|Ld?0%ccV(s#Y& U88T$nBT>GTC|^pi(89tV+z$IO~wB3^ZSDL5< zNsOQUqm1Wv%_tjL@WZ2rC#sgduUPH8s`H%tQ6V z{;^(h86tUZa<{+`N@vP41{soGP{ZYhx}`Zs@3eXhGD1-dL6I@6AdV4+m5NnUox06U zSFLf!;g+dZxl^&KI(JoDuUigxExV;2R}R!S#m!wuw?B4P8NyY~)fh%f=h-MzE`}sh zGDa0#!*zyq-z>W6a<`=lG{eB5?rv8ZQt3>9xx2f)ksHD|CS*)1xPhAt!xvIg<@E+N zVmaO37U)i{cg1H1g9LqA!7bb-6p3J%y99N~Mj5jVqvvAQY+GxUxZ?`qT?O}WpZsZR zMniWPCN9)fvFH#kap0c8@rS5dOB>##U2n^AgR)J$Q^i6h#mM9zwmx%@DV2Hzm6%_-Y<}03S-+rco;a zA*W@(8NQ#H`S^T$2XKYJLyzG?6f17lrPP+Mq%pG4Jd;Kg8A;0xl^ZFD-@c?;lS+19 z4~GnsWx7eZN_Ea3pO+*ogD*--Ej7&y$t?bDO03h!qc#%8|5_kzrG5Q&5HXB$vOf|x zjYMUo;)}(@UDTCs?C9o7HH?N~ItzCuYtC32>qLi%%ynw3k{IT#hRaS7t{tCWt+V}6 ziB^vGpxQ{+tbRs{_7)VhRKq7X;H0QZLHAO*u)*KepKljBU|=|KM+EfUCG;`C_98qS c)$b4^S3h>u9!?zYV_f5>m^h5#tgcMI0AP;CfB*mh literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/service/MessageService.class b/build/classes/java/main/com/sprint/mission/discodeit/service/MessageService.class new file mode 100644 index 0000000000000000000000000000000000000000..e93a79113ce69d1f7c308c6604a5e63fd5afa52f GIT binary patch literal 645 zcmbtS%}T>S5dOB>##U2n^AgR)J$Q^i6hsgrBB9>b%@DS1lak#Od^Ha~fDcvNrd1*l zp?DhRhwo=*KGtvV0Im>t=rCN!V!_R_RJr8~WsE9vo+=}Yl$7O$%9WDDAIKPyQL;@v z95RgNVkNj1dBz`K<|HkHFG~`ZcEb!}64yhORhrLc_qWmSc@2_Sry+~N_)kHUTV-Fr z^h6AUjO;hzO^a|}xS@laYP~}=4C6`I5FIOH9ce#NSuSi<62r7LaJiR-Ylr7o%e1+; zrl=9oPOh6DFNK-Yai7d>pg!NXA< a`xvHnn6}Is=RU+g=ix-)!^m!#q0P z-LtsJUi(+7FuH8zr4a(S7oTQltEB}^~tu2}~DGZ6QO1yNPTX!RMBHO9d z@4|-|5-=4cUh;y^gb>f!Zn8CCsG?l%es}l$e$R8yUHl;H@pgTav(4F+BbgTmD9r&>dyj|VyJ@>;<_Pg1PfE~%^*np;^3RR>pbO`uQgu?S_N*v~07ZVb4#b-h0czZEP^qlYN%#nIdV1bKhoqQc7obRf`&`(AY%iEc<)AogGXlp$)&y5QSrhGPiai=2} zyBy5gP5j`yFa2Tek4k3qaTRuVFp2{CNNGo{{liOlM;{Ds@bxsn_lDnP{etoho@IXq zHMVt*9&z5_uU&ryQE&VN>j#buG}tbn#I^#Hy?HERlcUvaHJZ4?5%;C2f@mJ@=9tg8 z!_;ekMdjPZ<|`~dss9M8d5UEN&6k{c9e;%wm-)Gp;@7jCWBgTofDehQGv8y+;A#h3 z_=vR$e2i;(&Ig>)Jjyy#;}mNKCW$m<@Clm`D324A@d-ZVJYQF=6GDr!m5#M21Utob zF@?3BVmT?UonzhSP6I8*w)sbw$@@LaoMGIZly%>%n!jVMYHl`v#=AORHB)7(=1ZY# zE~VmMlD literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/service/basic/BasicMessageService.class b/build/classes/java/main/com/sprint/mission/discodeit/service/basic/BasicMessageService.class new file mode 100644 index 0000000000000000000000000000000000000000..0e956e5be0e06e976170a9b18ed67d5b746f1e25 GIT binary patch literal 3605 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 U1ohelCv0-Yy-B=5KMgm30Pn}#rvLx| literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/service/file/FileChannelService.class b/build/classes/java/main/com/sprint/mission/discodeit/service/file/FileChannelService.class new file mode 100644 index 0000000000000000000000000000000000000000..0975a639fe8de543b49ed44f496f4c8a71645219 GIT binary patch literal 2035 zcmb7FTTj$L6#k}LDRc|0fXI5q8|($F_uC@KB_<}TCa#k3Sh@p_mhPsVCE>sLBQ#M7 zn)v90zsVTSv}Jd-v5^Oc&Y3yiIp;gyoc;0Z%QpZIv1UR;&VX*=7zP*$Z=7An_8foP ze!lsJyOLpGLHI&0GUQ6-bpwM8D{gDY4%>n7rM)A>|U{|<2h1rPh3}!DdL#>_(*1Kw_ zQmYv_&QQ(t=e`tj@6gvo0pp6m35MBHy+>g~5=Yy$w57bB$0SY~n6gmBDTe!*;j+?Y z&_idJGh8cW*ZgPBwK#<{7S7@v!{C}VtuP$vlnzAWs zLptu;r%pRj$8fCCZWd;v)d^g#Mjpe-zR8ye;i~EjJ&im~U4{z%jj7p3qj-S6X#&$a zN4pi|=nE)R_Q5J&VQlPU=o8EjWYaKD>j>RYt4`jd^pLL7&We3t;~MQ4uH#06w?+4K zvQ2(PVWT>?kFjT!k1*#CaDw38(@8(-1WcU31ieLtT8TXqRKmbb+=?Pi;x>J0blbum z+>LU+hjU5HB|6c_Kd&NH4{%yTFOVt}I2{F;jIVVA(wAHUhgW}m4kE2 zfl5)3LvG=aRB;G*sER`wQskCY<*!(W{D35tp53)%AzLV1R0G44ZB%^GaG*jAHuo^lh%%48bAI(ClFbe>67Pg-&!y2+8P%%rK;y zb7`wo)(ks6r&*R}8tH;&sb+y|cG}|Qc}?Z%Tbj<(=jk!dElVl#ygSbjD)W+QX|`Ej zV94ZJg4LI%J(#OC2Qm>FJ4yv9p<2Yfjv-HG3f~ ztcl3m*d<}Nj6H}j9Bqq8V=z=U;^NIQoPI+(9zaGyKSO_Ac4NBEi;6x{E>`A<`MEnP zFWIE4FzI!ljQu#k&^xEh@~mm7ihW(PXJ};EieXy}`_^Dn$IjcN)M6%ty@(3I#~8MG z29D&t@3F}+2uebdA<;5JUTQr-hLFG^ftzMH-bCcps=4ote!KB5jz~Bv;~0)J477CK zYDX{xEM=aP)S_*P!;2sjn-mmI$T*1shR$1>Q5anqE4+D`SAYdNYhZ=oI_GqTVS`%cR0uC=3`$e-SC!E@lh#moYZ8rHiF^jdIWDBP=~ZloF4a9> z#b-%14V$b*3YxY$B}~9D#M|=joRI?3g=a{$Wwvsbk>#9w#kFg>vOOrpd0SCu$CZ*( zItd>$L|bluFJXeRgiqT%sXV6c8D1-=Poq5c(5X(F(wijJbmg_8q1cr&scWQZqYkx| znU(m4g^1kUT=RNm9T7DgiT}$B`EZYinvYQ4tdvzQnh&}*ntPB#LNO$ShNhSwHKe2wKdSFLxOHR=SKNM;pX&ucc%bm9w!Wc7zf)kj}1KmIjR zee$yUD}eK-#JUyv#9MxGGdU& zsADQ;b;Yu{C1IXne-o>?WXJGNfBBXe75gX#EMQnab^FEBxb30kk8d|vxUG&z2UTOt* z;3Cb&U3+|h9KDHE!Y^}1!n4mA3EzI29mgfl^IwE1(YLAi&)ASy!ZsfU12o>8T*6y4 z?&u5rfz2{LN5$8ShjL?1BkHZ8zi~|(KK};a(M03IAREuT`m+_$!%@nTCNJKM*tH=|! zOc7rr%K)LC!6dFzL>DPHQ@BA{{)kq}@cn~?gqspR5$)4w81SM$O-KT(TX3f6-}6Bb zcGE3N1f(27+uda~Lf!b>Aw>5L{Z;WfMLb69g+)k!En$!~VI6U>+_Ho`tZB!eN|pt1 zdI~vwONc@a{dHQGQomzsD)|eB#aznCZt4lEr*|g>3!I>`pCqXbP@xC08yQOSDaWfT zkp5Z({ays*#Yv=(EPI`#`JJS7g8hw%L?vRlg|i;BEHPW1un`~X`V@cIfKh~~9}=2e iFKK=h>8lSj(CD{^Mz;yRNbSuh<8U{GM} zMX(=ujUe3ho^QX9wM1ZWS%oTD5y-j4tzisd*n;gK4@cl(t=076y-0yfc2q-p8(cPNsb)q2JCb{?SS79KK;S{8FH+al(-=RU-1IG65ODim zmSLijgY=?}5sc|lFA99?R=UMj6V|Zn_gacud0fJTh06{m@rA&>zOl|sRKSdbeJN0O z`j~_`Ax+Fet+tY)BG7lk|ahKA@Jk*G}S-gX$7$BZ6b$3GcBS=umS_J87TJ8)P4e`&%w5KWs)UsD5`4g zlmJpu3FPTPd1xmxHC$D@VUV;VCbQC`m*w+^UeUy5ipt{u+9RRfzhbZDGej>iQcZ%| z?@xohPWSChzFB;`+G!QKe;n7$Mpho>1tvW!x+Oncaxbn%DBZH@1>}MXdV_im^(1}q3=74{4zKH z2BXhPFJYCBFm9lH$dl9f6U4ZT2_kF!Qg-tMe-hu}HgR?2JA5+e?O+jinHvWiu6AOs z@*OBIqFlC?{NS6${b_>X#1jyq)9`Kwm23#YACS@_*Yf=byglW-(bv?y$Qe3-( zwZxkSeA<@zmdfb;gJ}-X?sn5!G7IM4m@1g_<=42b?FBPsreGclopUZF{|Xxg4lM_> zxX1=h!NpCsZI-9Hj>Qc3qz<=J2VU+ ZLf}mUT_xx@F4$k2(EUmLfqn+o{s9tJ+QkJuJ0ZJ7pEK|| zz91+nf?@s~sB;!-xWzElD`wsIt#>si2t~c~1{SbLGd;H44i6Zv_w`k6xh~C|CRNdK z6D1+s5o7c_Sb+!KYTeco&xa}D2RjV6S*k+jqcX`4fQ$tl0cNz40tK-{z z%Mo^+9@;?fh`H0|F+saK!C3GoT9zzoleXG`Fi8FXaR|;k4@fho}@C{UB;thJD z5OP+~EuG?qf zf#yky1sbi?&IUPlHo3VUG fT%D=lb+~bO1*+2 zBIu0YyqL=d>v;ZE4xD^zo5%hVBZ)yUeWV?h}YMH4iCRAyDIOD!8VVKCC(8 zN3~o63Zg5q3aWxi6;)U*(5c&#X(yLAvu=9QbR5&prbkUjw?_@rO*=+@%G8bYIsI(< zNN?X!!*R4RW6)m}h>dElCa`*-L`9m6q^MC*i#mZ-1!5Ep_6$4?-KmnPhq+e8I;4miWz2A;m;zmkxVI!M6)@fDw6vz%%}6O|QPGOFr%au4 z(FGE8DOeNO|BPM*0Ca2>(kfoU%L3|@W|_=O!$0uerloTue7*&d8= zVA~>4ix?_6B2ZUyraPb4rUy*Nm52i>j^Y?wAp=z~Sc@CV&edzPuyt9<%$I(=A!R%v zkPOQh+T%+#sN$ro(s&^!b4t<-sW>eikLQg^d&*ESEU;tA7_xS}E;_$`t{gPSvYK1S z8v@5d!DA2Y3O#xOSymPY1etvqf%8vD&N-)o)*kM)OLNUL46=LBKVznOh@XXCem&%8 z!OR-R3X>y7{-icyaiw;^)-`KL%bW5!Sd6*jCWG~KJ-l2>9yeB?UjnJ6eGgZ=3@UA8 z0aVXdn;AdoYWf5t5qPQS{#QewZCMm^MK7>2u#`lVdfs3f1>Os2;pFq&qyUPk&Ed(>GS$L9%rfeQ*Q%CY224j-lXn%OCP!btmJ_9vA- zO?U15w7~Vi4ew~dMj!OBmL0VWr*XixCknZ6GY|45ltE>NC#Q49BHPb|_Al}|2q1bj z%NjIYBeMdR1X^c*x-om>!lPe*ZEbk-86M zcm^wPBav#kjp|hEZLGP)w-LO@>pI#2)rg^n47FH8+$68>bG5-o!3WUzL_CjGcz2RF z!aq(;0qaP>TG#RyYVKphaO*u5TDi zP3s*rbylR3F)p>Ik`;V@F3UF?tIbTWRED8BleJj6yM zu$7u`M?IRb1u3+n1^YQC%P1W7S&Q=Yc%n#md*Hh(?<`DG+5~oc;>C#84tcB!{;ok5 zHsU--4j%@m>7fS^VpK{0TJGXd1P{?s@=WdqV=Fya=kF|fP=!2Y68v-E@}11N4B4dx zBi}zPG4JAa!QdaC582^Cs{ZBx(ogFG*QW3huM+Sgfn)rwFLUr%+n-3ZQR6q;ZVCzQ zrpWsveR`KpL;(z5`zs5IQOYr#$ JuHri+{{yj{O5*?k literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFUserService.class b/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFUserService.class new file mode 100644 index 0000000000000000000000000000000000000000..90d6b3bfeda15682aa6580ec4090c8ccd5b3bfad GIT binary patch literal 2098 zcmb7F+fv(B6kSIa76_TxIH9;Sl!jbvgQK)fnu}dpE+rvxNM>Bf@K#|fL`1e3S!O1G zkxxly+A@@xPM`YFZ|ZcqjwG-gr=IX&S!ZjXwf0_n>FDo&fByr(w|K5YK|+ISU<65l z^uBdynXc8^GoS75+jU| zz=dj$ha6=M8G-yzRJ-Ln{u@)G=}03hySgZFBOgKqebs!Hv{xRC6t?A_DFdHiT3}?) z_BR>=lleldj;*bYwemPV#f*l}3|z*nK&r1y>U7YhZ1>`vp_XyZC=y}E1P{>X419qr zgkli_*FOODfsGoj3S@i5EPI~yrs{NjS?_fNH<0Hv4=uNAcLb*U`dV$fE~m{Im37Rc zD1}=P$VJS-tYbN$R3!s9rM$`R0Viflnp+0Gl!YffyV*XpHGC~_Yv{;MjnLT}CFW?YiY|Tb?7= zQBd_?In?U@aE{X!2E9x|z3$l*N46*MJU+?)H{x)*cuNAKT_U%vX3#<~{J6{MW4mcN zE*qD50>$%SYqVcjcqMLxK=#6UfE0&sQu_VL35=6q*>xocW$u5~q;sj?QlC#{u=4TD za^iaE&ajW42Koq#ifc9)IajZ#ns3!#)2We%^oH%)rv}Il@E5jOVy)fv>h`)LjhO8} z4sXht@-!IdK`rnVf0Ocj<^OG-;0o>_$$K8&yne&T3KF~n(#0c);t8~!BaHnD{pTS2 zF0T{J0P$29#7W^ES4Ox8_wj%$fifx)-fQNmjLn=Ny|b`*gvrg~FVIWB;Zo@sxddL6 z-tn=59&`pei_9S#Ko`U95j27L*;xwcX7C;F6lQ1eJ(h#QSFjopukeXN)m8M|>N;3o4FJo^uNfA|gn literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/FileMessageRepository.class.uniqueId1 b/build/tmp/compileJava/compileTransaction/stash-dir/FileMessageRepository.class.uniqueId1 new file mode 100644 index 0000000000000000000000000000000000000000..c879cf7b8c7888ce00bf3f733017a058e42f7842 GIT binary patch literal 378 zcmbu5Jx&8L5QX3DPZpLyB1$?spuh*9(G zQPE*bpXa@?G^6+V_5K0i4C4|B(gN8KIR=FBLO*NOYCBiA^};lfFgRt)@tlwz98L>t z5H1?msj&2Hqv|*Wc2>pGWrTNGhOm|*k`tomb1 literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/FileUserRepository.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/FileUserRepository.class.uniqueId0 new file mode 100644 index 0000000000000000000000000000000000000000..0632b266900ce9bfa313082acdc284885ff7fef0 GIT binary patch literal 369 zcmbu5&q@O^5XQgRKV4m`EnYl(QxE0={D%mh77JB-&u*hm+1->R6?`mDf(IYKhY}}6 zym&MNzs&c|Kqm9~_5K0i4C4|B(gN8KIR=FBLO*NO>i$tp>V;_nVQ|VlhjT)Da5yWl zLAYpar~J}!A5_QQv+dQKePic_gK}nRJqPPv)C0FhT?_8LanoO)kX=bHVN`K%ZdP4w z+?}plads=)=ys+ZNBv`F;fX!rvij${Cxr6Wu3Tf{OoY9^qaDZpV;_aAB_5KH#RxY= hskH|3qc_m27zs*YECVUFgu`{7%e^g%up>+``UV>SU(f&m literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin new file mode 100644 index 0000000000000000000000000000000000000000..7c5c7106b83af46779fd48cb7c752d17acb102b8 GIT binary patch literal 1830 zcmYjRdt4M%6u#d=`C4G41#wp}HOq+Z&2nIYw`=P&*B_;q(!tNX{9x!*nK`_4UQ&X|Y{QAho# zKfQ)tOGl6zduho?Qs*iwSDo%rq`pLTxztkUXwq1qy6mL|4%Iz|)VmzzOI5o=PgVzz zI)}?;D|7_17Y*bNY@B~Enx1Xxyga(~z8(2JK@z8orNPwyI|7?;ch~bt9VPe|#bQ1NOOlpeki}Y*-1addF zE{W_N=u#Sj!$048YQo?Y=>}n{a|D zKAF_#yWHhAyW2w6Xb`76*4_Ebr%Ol9s@gbrawNGmMVcd0##Zvo0>{D=E$gmaiS5n% zXg^7n(}eV-3@TE;xnxbg&86D)^GL1t$#S~f?P&=+^FoVjdKSVCcI?WO=Zop=4o~eL z(UGycqR*VII@{e;Cy7Y`T*T>Xe%_F?`HOLepEhl8nK(vPk_?=hJ^9Cd^9QZnJM0&` z$>BX&qC)-k3rLMkb#liKy>4z=%=HAGKS_#$KiQfs-6M=;HNW)t<<73Z&o7^S>5rb+ z>d^Oc)+9V1{NP*deM7Sfb=JiD(-a%iUTVuHYs<=tRlCj227_C%!N~n^SF^`H zzH3bB#%*bKA<4*@nr~UL@KoEhOJ^F7##A5fFOVGKSXRQXruR`do!4aZJKmIZIypR) zfcVFlGOZ*Cu=?lZ=0%fGkZWUdaw8cS=6#Jz&9u%W+0eyV{idWwkpvJwyCjoHAPXj9 zhkq7h7#Wrw$4;5&%wfF1OBfTMlF24~*dr*EvF2H$i3DAibp(ltH>G42kR0Ynh>1lJ zGR3PxNS+2oX*OE3@tRH1Y^r86HA||<|JMIERbU4Zi)f*|SX3=V{1U#HFX5ehDL-Q5 zsL^Az54w!h7O{ddN5nip%O#iKwmir$<(Kg#*D(iUNSXI&%5qvEJtS1}%h*t9NcIZ4 zQhr!j#TV-hff^E81-cs2BM_@$sew?7v^C)Cz%SE=F<>|@r5>~aawEi50mE@*E$BMP zk3v{w97e*LKp%trID}>-wSaF0Up!Yo&v%--9&`ibCm^)JvJt|QNP7x=JM$SH`eBZl zn?N^1-U6`=J|WXq&}}ephq41w2ZV>c{|GJhr(u2u%1%hnLKx>op96g!iMx>23BE*c z%h$ZDFMz%XX*ZNg!|-K-UIKj?(kl?E;j2s39?(}IcR_5vs+;*5=w3*#L#c)@FuEIb z9~2Mx{Y=2DH)sO#8=wau9fauiRV%&+^bkZ30yGEdFlaBNBT(EvqP(M^eURUT(hOf8 za^3=c8|HVQybI|)2#xsnp6|na49amx{SY+t1n38lK7?556D;@$^d!ViEYJkAPJw<5 z`4cE@SLq`^1^o>2=MYq1L*l*wJ&oiqk?29PMT<-L3iJ#F4~*K@J^=bP%x9sTgY*rA jNB>LdJj~xhxd7=q2;;qp4uW2UJOoAc-6z-k6_bAe+qo4W literal 0 HcmV?d00001 diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0e61f4f0fd8f37b530b429d93b80fb27f3a71ea0 GIT binary patch literal 6148 zcmeHK%}T>S5T0$LX(&Pu3VI88E!q~P7B8{ZgI6nhP^pP67)-Opr1Ve%y&HQYbZ^Lc|07P@xtpbz)pnyu4b8z@Z$WOW;Ib+Eq3R>edl6OHQ z1AL|hS^hr*w09Qt!G{pyx&1pr-_E-dRmdzZ7$pO<&#%EC3X`-_c@w$3wX$m4j$O2G z+V^tQPW^P4H2udbdODXf3Z`>ExCncrPHFvE#;G61y+@T0c6%6deHq4GIcmyb+)Y$& zTRR-5;B-n`<8kevQZKvv)%v9DjvKW~+1+c@CKIQyvAuhE)_I8fv3%0p3;ZyZtQnlb zGfpf>p$7@1bA`X4?{neP97bk<8DIvMgaLCj7K%$!50}9VFay8G0G$smDxqgE)2NOP z98?Q{XrWmN&eg9!qDuxu&tRqzEhs{#BI;COS`1-22cgr^@0s{aqfQ5*-i+&*Hw)9D z2-A27SA~P{H1fy{Fauv1pxzIqMEC#6&;7p&;(-}p29}cnVYS+=Ce~)|)`cqRu60pw rQAsE+(>P1PiMon0magJWR3&J4X@ck(%rv3}g?|JT4LmRdf6BlITU=Yh literal 0 HcmV?d00001 diff --git a/src/main/.DS_Store b/src/main/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b73a780e59707cb10a52003fc2886d3f56be8fb6 GIT binary patch literal 6148 zcmeHK!A{#i5SNTPv0s-RU1~_nSs&Z(nU?-6<7%z&G<`6~l9sY$g zKf>?8o83(W2^?EB)r>Uz#~0fPiKq-^EO;2+5T0jUkb?8902Qxs zn&?iH=m^iepvb?^0H0lvE-9qn6waOB7tC!v88I7~#YLm+#+~y+bd$u{pk9Aeg_Yv! zhf>KaRZ72F7kbnhgo9z$4EsO$>6_L`G_}L%d)ynftLsNP9fWb(>zjnQ+e66DvpDVQ zQBx1oZf0^@cEa<@Uc0(E9yj*udo_P|dv8+n#|Mpi&EGj_OeS9WYZBWn()a0kPqKJ_RgO+#26w&y6gN7PFSrrCnRfG{8oEHwk}YAjcldKdEJg#lsU zPcXpugAZj49Of3y)q%mZ0Kg*LMqryyf1u9}VBj#f2oFTrRG>{&uEkKUb5J%N^MQ-c zE!uQa=FM2gy;->qMY+a9`6irHU{OY4Kp1$<0QY{7D%by$_xpbnB!e&@4E&!AsN!+! zxQV^F+PbhyuC+e&9LmCRxy4xu3{#2`%cXb&Y6O0t4Pf9fw+IhJJ_HO6G6(~Im4RpQ COI_Rm literal 0 HcmV?d00001 diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1b70e5c489a2c8fe2c47fabc8c79ff80f093eaa6 GIT binary patch literal 6148 zcmeHK!AiqG5Z$%aBorYB1-%8l7EOy%i7)-OJP067Ya@Qa7NBkX~ z+1(t9#iO8|f!#Ngnb~As>CP@=jQg{=#hA?)GhrZdR8|N+Ug_Gm~ z-w^!v8XGXdMpx<5_n(93@KcH`MMp)&bgZj-&0Y6{Z`A6WTZUm74dXF*7DbSU z`E2TklY6vogh-=G52M>;SoH0k3z6kvk_{&^A&G|&@^F`Au_$~o%i^ib4V1&OOsjA2 z&*$w^x6^b^TAfAHnRnZ6(>d<87YobWJvchM?!Tm?OuQ=YIs7P6wl!ApRw;zU05L!e z5CiMTfNl?FV;zg9nu!5o;70~eRtq09sHh-FBPhE#^sw~9sTC&^1}7igF7;uaZe%5!~ij{%s@?bhq?S3VYWd@<;p~ zok>z*se&gFI|GxKOlCHlmyk&SK(r@=IzSZw%BX}n2a7L+`bn20XDx(6eilvfM zs+4ZK4{F*?`pG12_s7@Nx=84Rbr>c)wRl70{k$2uSw4AJH0Du@PZ+E$Zj z5bM~k>2RE~)2nXJW{pF)S(69#=Da3nt%h5Z`>n=&?vyuo_KwbbkKt3Kp7n2ozzwQp z-QogX78OQjfEi#0R)+z5B$g|yGi9DBGr$b|kO4X$Br2h2F*T@<4lL;UNc{yu60Fm; zkx*LnET#sr2Su1rL=!6P6GNDAv`g#fSxgO@a1eTA{Ei)2*cXb>qoZAFcMzUIE|~#l zAj?4BG^>>VPrrZvXM?!K3@`)#iUCpRbUSUFlFhA4lcQWKQSVSm$S*bc8G;p^iqV%+ d@fNBUv`eZWdKOcIXhGqNfTn>9X5d#D_yF6}Qo8^E literal 0 HcmV?d00001 diff --git a/src/main/java/com/sprint/.DS_Store b/src/main/java/com/sprint/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..415cd18fd1f531cde81690f51a588a89119ada75 GIT binary patch literal 6148 zcmeHK%}T>S5Z-O8Nhm@N3VK`cTC^=nEnZ@*2d_r-pi&!KFqmeGN$H^!a@QB~MSLBd z+1-jIdhjA*XUgn1J3ra(m#{yKG47B14aQu?m<@_pa-jJ_FpgS~lJOvN^^Ax~mYl}& zE{qG=3H{Lx|vKaRj>arUa})b~s5#VXU%W!ciQhS-t+sOXbSS zs%1G=)w&7pou|0Zq8ry~n%FPvn>vHf5ljj-CHR^K4)yVK1Gcq?f6s|@GzfkFndm5=F z28e-02FkkY;{Jc~{r!Kjh+N2pt3z4b%_=zskTnxt~)M literal 0 HcmV?d00001 diff --git a/src/main/java/com/sprint/mission/.DS_Store b/src/main/java/com/sprint/mission/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0d34151425c0440ad9ea0fa581e2ea080902cac6 GIT binary patch literal 6148 zcmeHK%}N6?5T3Nv?NWpu6!aGGTC^=nEne1I4_>Y4L8W%P1sB&%akunP3VYWV@!$v|c=jlo^n;>@s@^lWPsOhlTs?Eq71sYe!MAOL3ggL*x@hvCe!lLul4WbGSAAY z+r3hajpl>RAP9r4;KSgPnGUMBnw0%`{Elm9#^lMZ9Vc(IbUJK5dToj-&Wdzw1F}&H zm-pvcF*4J>nG~ba#tvLZ7`DP;`{``fd)eLZ=ofqY^NyY!^tv7W{Gd0VhporkyN9R4 zFZtKP{IJ6&g$-)up~qYJ2_vKviZT6ycIY##ZxkSIbix2{Z%bFGGcgtD+-?eI?s44aDK%c=MY a)C$@)8^Fk8?GP;xxd>Pqq!0%FD+4#aYiy$c literal 0 HcmV?d00001 From 84b6ac1e93aeeac3cc038cec38090028e3ac84a5 Mon Sep 17 00:00:00 2001 From: Junanaa Date: Sun, 26 Jan 2025 02:15:36 +0900 Subject: [PATCH 3/7] =?UTF-8?q?[=EB=B0=95=EC=A4=80=ED=95=9C]=20sprint2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/pull-request-template.md | 71 ++- .gitignore | 44 ++ .../executionHistory/executionHistory.bin | Bin 53060 -> 53060 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/8.10/fileHashes/fileHashes.bin | Bin 22247 -> 22247 bytes .gradle/8.10/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.10/fileHashes/resourceHashesCache.bin | Bin 20061 -> 20163 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../.github/pull-request-template.md | 20 - 1-sprint-mission/README.md | 1 - 1-sprint-mission/build.gradle | 19 - .../com/sprint/mission/discodeit/Main.class | Bin 4445 -> 0 bytes .../discodeit/entity/AbstractEntity.class | Bin 1012 -> 0 bytes .../mission/discodeit/entity/Channel.class | Bin 826 -> 0 bytes .../mission/discodeit/entity/Message.class | Bin 1128 -> 0 bytes .../mission/discodeit/entity/User.class | Bin 813 -> 0 bytes .../discodeit/service/ChannelService.class | Bin 649 -> 0 bytes .../discodeit/service/MessageService.class | Bin 645 -> 0 bytes .../discodeit/service/UserService.class | Bin 616 -> 0 bytes .../service/jcf/JCFChannelService.class | Bin 2147 -> 0 bytes .../service/jcf/JCFMessageService.class | Bin 2191 -> 0 bytes .../service/jcf/JCFUserService.class | Bin 2094 -> 0 bytes .../stash-dir/ChannelCRUD.class.uniqueId3 | Bin 2121 -> 0 bytes .../stash-dir/Main.class.uniqueId1 | Bin 4479 -> 0 bytes .../stash-dir/MessageCRUD.class.uniqueId2 | Bin 3131 -> 0 bytes .../stash-dir/UserCRUD.class.uniqueId0 | Bin 2068 -> 0 bytes .../compileJava/previous-compilation-data.bin | Bin 802 -> 0 bytes .../gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 0 bytes .../com/sprint/mission/discodeit/Main.java | 60 --- build.gradle | 33 ++ .../file/FileChannelRepository.class | Bin 3380 -> 3429 bytes .../file/FileMessageRepository.class | Bin 3380 -> 3404 bytes .../repository/file/FileUserRepository.class | Bin 3335 -> 3390 bytes .../FileMessageRepository.class.uniqueId1 | Bin 378 -> 3380 bytes .../FileUserRepository.class.uniqueId0 | Bin 369 -> 3335 bytes .../compileJava/previous-compilation-data.bin | Bin 1830 -> 1830 bytes checkstyle.xml | 442 ++++++++++++++++++ gradle/wrapper/gradle-wrapper.jar | 0 .../wrapper/gradle-wrapper.properties | 0 1-sprint-mission/gradlew => gradlew | 0 1-sprint-mission/gradlew.bat => gradlew.bat | 188 ++++---- .../settings.gradle => settings.gradle | 0 .../mission/discodeit/JavaApplication.java | 62 +++ .../com/sprint/mission/discodeit/Main.java | 78 ++++ .../discodeit/entity/AbstractEntity.java | 0 .../mission/discodeit/entity/Channel.java | 0 .../mission/discodeit/entity/Message.java | 0 .../sprint/mission/discodeit/entity/User.java | 0 .../repository/ChannelRepository.java | 13 + .../repository/MessageRepository.java | 13 + .../discodeit/repository/UserRepository.java | 13 + .../file/FileChannelRepository.java | 57 +++ .../file/FileMessageRepository.java | 56 +++ .../repository/file/FileUserRepository.java | 56 +++ .../repository/jcf/JCFChannelRepository.java | 30 ++ .../repository/jcf/JCFMessageRepository.java | 30 ++ .../repository/jcf/JCFUserRepository.java | 30 ++ .../discodeit/service/ChannelService.java | 0 .../discodeit/service/MessageService.java | 0 .../discodeit/service/UserService.java | 0 .../service/basic/BasicChannelService.java | 50 ++ .../service/basic/BasicMessageService.java | 67 +++ .../service/basic/BasicUserService.java | 50 ++ .../service/file/FileChannelService.java | 50 ++ .../service/file/FileMessageService.java | 68 +++ .../service/file/FileUserService.java | 50 ++ .../service/jcf/JCFChannelService.java | 7 +- .../service/jcf/JCFMessageService.java | 24 +- .../discodeit/service/jcf/JCFUserService.java | 9 +- 69 files changed, 1475 insertions(+), 216 deletions(-) create mode 100644 .gitignore delete mode 100644 1-sprint-mission/.github/pull-request-template.md delete mode 100644 1-sprint-mission/README.md delete mode 100644 1-sprint-mission/build.gradle delete mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/Main.class delete mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/AbstractEntity.class delete mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/Channel.class delete mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/Message.class delete mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/User.class delete mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/ChannelService.class delete mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/MessageService.class delete mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/UserService.class delete mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFChannelService.class delete mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFMessageService.class delete mode 100644 1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFUserService.class delete mode 100644 1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/ChannelCRUD.class.uniqueId3 delete mode 100644 1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/Main.class.uniqueId1 delete mode 100644 1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/MessageCRUD.class.uniqueId2 delete mode 100644 1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/UserCRUD.class.uniqueId0 delete mode 100644 1-sprint-mission/build/tmp/compileJava/previous-compilation-data.bin delete mode 100644 1-sprint-mission/gradle/wrapper/gradle-wrapper.jar delete mode 100644 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/Main.java create mode 100644 build.gradle create mode 100644 checkstyle.xml create mode 100644 gradle/wrapper/gradle-wrapper.jar rename {1-sprint-mission/gradle => gradle}/wrapper/gradle-wrapper.properties (100%) rename 1-sprint-mission/gradlew => gradlew (100%) rename 1-sprint-mission/gradlew.bat => gradlew.bat (96%) rename 1-sprint-mission/settings.gradle => settings.gradle (100%) create mode 100644 src/main/java/com/sprint/mission/discodeit/JavaApplication.java create mode 100644 src/main/java/com/sprint/mission/discodeit/Main.java rename {1-sprint-mission/src => src}/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java (100%) rename {1-sprint-mission/src => src}/main/java/com/sprint/mission/discodeit/entity/Channel.java (100%) rename {1-sprint-mission/src => src}/main/java/com/sprint/mission/discodeit/entity/Message.java (100%) rename {1-sprint-mission/src => src}/main/java/com/sprint/mission/discodeit/entity/User.java (100%) create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java rename {1-sprint-mission/src => src}/main/java/com/sprint/mission/discodeit/service/ChannelService.java (100%) rename {1-sprint-mission/src => src}/main/java/com/sprint/mission/discodeit/service/MessageService.java (100%) rename {1-sprint-mission/src => src}/main/java/com/sprint/mission/discodeit/service/UserService.java (100%) create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java rename {1-sprint-mission/src => src}/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java (89%) rename {1-sprint-mission/src => src}/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java (72%) rename {1-sprint-mission/src => src}/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java (88%) diff --git a/.github/pull-request-template.md b/.github/pull-request-template.md index 8b17f79e91..aa4599b4fb 100644 --- a/.github/pull-request-template.md +++ b/.github/pull-request-template.md @@ -1,20 +1,67 @@ ## 요구사항 ### 기본 -- [x] 기본 항목 1 -- [ ] 기본 항목 2 -### 심화 -- [ ] 심화 항목 1 -- [ ] 심화 항목 2 +프로젝트 초기화 -## 주요 변경사항 -- -- +- [x] IntelliJ를 통해 다음의 조건으로 Java 프로젝트를 생성합니다. +- [x] IntelliJ에서 제공하는 프로젝트 템플릿 중 Java를 선택합니다. +- [x] 프로젝트의 경로는 스프린트 미션 리포지토리의 경로와 같게 설정합니다. +- [x] Create Git Repository 옵션은 체크하지 않습니다. +- [x] Build system은 Gradle을 사용합니다. Gradle DSL은 Groovy를 사용합니다. +- [x] JDK 17을 선택합니다. +- [x] GroupId는 com.sprint.mission로 설정합니다. +- [x] ArtifactId는 수정하지 않습니다. +- [x] .gitignore에 IntelliJ와 관련된 파일이 형상관리 되지 않도록 .idea디렉토리를 추가합니다. -## 스크린샷 -![image](이미지url) +도메인 모델링 + +- [x] 디스코드 서비스를 활용해보면서 각 도메인 모델에 필요한 정보를 도출하고, Java Class로 구현하세요. + - [x] 패키지명: com.sprint.mission.discodeit.entity + - [x] 도메인 모델 정의 + - [x] 공통 + - [x] id: 객체를 식별하기 위한 id로 UUID 타입으로 선언합니다. + - [x] createdAt, updatedAt: 각각 객체의 생성, 수정 시간을 유닉스 타임스탬프로 나타내기 위한 필드로 Long 타입으로 선언합니다. + - [x] User + - [x] Channel + - [x] Message + - [x] 생성자 + - [x] id는 생성자에서 초기화하세요. + - [x] createdAt는 생성자에서 초기화하세요. + - [x] id, createdAt, updatedAt을 제외한 필드는 생성자의 파라미터를 통해 초기화하세요. + - [x] 메소드 + - [x] 각 필드를 반환하는 Getter 함수를 정의하세요. + - [x] 필드를 수정하는 update 함수를 정의하세요. + +서비스 설계 및 구현 + +- [x] 도메인 모델 별 CRUD(생성, 읽기, 모두 읽기, 수정, 삭제) 기능을 인터페이스로 선언하세요. +- [x] 인터페이스 패키지명: com.sprint.mission.discodeit.service +- [x] 인터페이스 네이밍 규칙: [도메인 모델 이름]Service +- [x] 다음의 조건을 만족하는 서비스 인터페이스의 구현체를 작성하세요. +- [x] 클래스 패키지명: com.sprint.mission.discodeit.service.jcf +- [x] 클래스 네이밍 규칙: JCF[인터페이스 이름] +- [x] Java Collections Framework를 활용하여 데이터를 저장할 수 있는 필드(data)를 final로 선언하고 생성자에서 초기화하세요. +- [x] data 필드를 활용해 생성, 조회, 수정, 삭제하는 메소드를 구현하세요. +메인 클래스 구현 + +- [x] 메인 메소드가 선언된 JavaApplication 클래스를 선언하고, 도메인 별 서비스 구현체를 테스트해보세요. +- [x] 등록 +- [x] 조회(단건, 다건) +- [x] 수정 +- [x] 수정된 데이터 조회 +- [x] 삭제 +- [x] 조회를 통해 삭제되었는지 확인 + + +## 스크린샷 +[User CRUD Results] +![IMG_4673](https://github.com/user-attachments/assets/046328f8-0b6d-41e0-a32d-6905170aa34f) +[Channel CRUD Results] +![IMG_4675](https://github.com/user-attachments/assets/19751bb9-36c1-4510-887f-c420709dd302) +[Message CRUD Results] +![IMG_4670](https://github.com/user-attachments/assets/17f6c010-a829-4df9-a31e-3e7346dd45c1) ## 멘토에게 -- 셀프 코드 리뷰를 통해 질문 이어가겠습니다. -- \ No newline at end of file +- Message 클래스에 update 메소드를 JCFMessageService클래스에서 content가 UUID 타입으로 받아져서 두번 써서 해결했는데 괜찮은건지 궁금합니다 +- 셀프 코드 리뷰를 통해 질문 이어가겠습니다. \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..aa7f43b323 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +.idea + +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.gradle/8.10/executionHistory/executionHistory.bin b/.gradle/8.10/executionHistory/executionHistory.bin index 17728a5f7b529aa57e84fe6e2a21e47df79a558e..f68c9873555ea710281ed9d2cacdaaa55632abc1 100644 GIT binary patch delta 477 zcmX>ykNL-3Q5J%Ni%u6}$_zUOk1)KRdiGg6E*-7<4hCqGy$ zrfpa_UvlBI{n~GmPM(&z@>t>^Sjj#qW(I+8#tZGabi{gfgj%PpX`%{iy%GR9oBtg1Y1hc;y90qjvn%ZCrUky9w_f!ai-76L^+2JD6Wclu$el=ykNLP$X3`Kr*wS5p1% zw;Xuw&OJQ)z|gIS@#y3OTa7mF-@brPU>@J&2ea<*744p^k|o1#d2{o_@My-#r;clI z{9E4i@uX3c%4Dxa2jw!V>z7%*39b$7KVo!1DrenKu;dmg#+h!JIjNH$EEdy#cRy0T z#bKpT>G9b|Uz?;eeE}qMtk+SCU+=KocMI!jK8N{vw-ICy54!Lz0%r# zVb3qi&yvgIfI^l@n>|gp6-;PNKX6d?@~UQ#ZH{l}%sf6PC_`q!t-k^rjG0dR=7;$Q8RZ%{@~^X8U1n_^Twhri{P=I@3XqSN@v$&6FsLN~0Q2L* ArT_o{ diff --git a/.gradle/8.10/executionHistory/executionHistory.lock b/.gradle/8.10/executionHistory/executionHistory.lock index d99fad92b2e9e07ae5a1a9a745fa822b652ad099..84c8eac392146b11a5eed091904cd1277c57f24c 100644 GIT binary patch literal 17 UcmZQx|N2j8|K2|w3=m)m07O0ocmMzZ literal 17 UcmZQx|N2j8|K2|w3=m)n07NFCqoz}laG2%0;#c>9POpY z3}j61@k#^b36nj2!A3eyu7)sN zCa;As95>(hy~b1@wox)PaZ1}epQ1R^Yq#p(gEbbJ`ZIt5n-P%GGX@fxK&%MD0{^?h z7XN$OTz&dbt3B`CO%tIye1Vccz~%}h&~)s2T_bbtc8l%5$6cjcCns-&>hJ@qWCdwS zm~0uS2J(#O#)Vpw6G4m(%{h}N0~vEK-C&-4 z)N>L`lF9A3$$BQ)`szy5Pru85kI+ z%u|@cIoZ<}Xuy$B;mOq?#8w`jagK)mY}fl8~I790+vWD+$rbQ^Aa9j+2jr z7_SS(C;tR7-Z0;stQ`baBRx4bNS~Q?O48(h5WP!d@n+a literal 17 UcmZS1%go#Q|E;$x0|ZZF@S+z{p7Wh0Ro@a+1L48oqGo=xN!4V zNk>M0r?3_B-*1FK1!FhsN+&ZiuH2~jLwut_f$(NW4;i*JW1y@g5DS8^z)_2kiw7T^ z=%1jwhwCWYRTZG19I6U=xm)Yb8sB;6X{NU9sAW_gri#|+*soL6B8qr^&ouen<-8oE F0ss)IIGF$d delta 45 zcmV+|0Mh@%odMmP0kAX}0WPyO7=Qtj%^66uEgCrivwj;|0RdsLA@~=uFt`)5K}Z}1 DbVmkm0=ac&%(S-(WK~qQDhLQX z5{dVOtloqfvqL?mWts6nJKvn=tY1FP{EPxV$WnIY_1wFL6X4CeV-e)AL zsiV|*xr$QUBM^)v4Ba-QJpy|wnr1xJV$&5JwR3kWn-;Xwh}ovyACeqv^RN=1P;jq` zPvTRv;?UA>*+vgFjVBq6<(?EX9@-=QPtk_nQyau;lqp!F;y&CjP_bCC0{I<=Eft9A zJqDdnQ90KNjhRxe;sLA^xTi<&HtOTCh;AP+?M}W~wjQ%Bfd}UC$UMw~sKj~&RVp@M zqdEX@uB`!tn3pZdek0D{ZKAs@_dPRkt5Kt33my{4p^1&{0@}23 zN!yHu_U~_ejDAz_h>B0+Q3~}vAyDTFox!_%~qnx zwCvh^Y{w1-J5|)b*Oc1||oFf(W8n#cn()P~hdWUtIz%^SF9$GAzy$K2!R4FFvoJMa4dumsN|& z%d|o=AiJ5C8nRFxzyaEF`^q)v!eQs=TT{aq19*!0letqiZRB3m1n@~SkybBAXRz9A z_6!Z#(jT2nflTY2*N#mN9-kaMud$UA-pxE3|x|)9y{WU-kLl&TIL+R=!}g{ z4vjdck2@!>d2X)`;E2GwG@*~>oE|E32G38Od}Hd>3}jh}FRB=j9iq_d5PsrY8uHMf z;M)Rg7Oa# zo7!jThx{&C&ZZ{IoFt9dA+Ua7%`%UDpJ*o&KVfi;F#3#kc~S@j^z@lgoY9Hg6NAu* zHxyCY#zjf%H8LB~#*zrWa zz=+?p+!pI2dQ6|tW9?DHTH6$lcPD%288S0!a~9z~dUYQ3%wqLM{MyVh!e>#>aJ87W zQ5(QDHkaF12Ar{B=f$(^gyAv~z;%|rb8dX<%*n|i_QTOJXY8;Gcw3&jV*}3Rs~(NJ zc~fq>14ssocLY}L@ORlGW#8l>eSzI}M$E5>v-4wce#5EMIel#M<#Ffi)u|IV$}-jY zoj_S8a7NoQPkmRv_oOv$PoGi41-zfO##4fuoI)CT9ZA$jb;~j=1s`zUn-k>uVyECQ zG-qK{p4ncYu?FAbuqXePaH8bpjO%fJh4>VF=B&RCamfY0#8rX;6(`))MZh3V@+%K7 z<2xR4RxU?}B0wCy3FWEl$ZNWZAfIaUO%(81w7W_x*0dCsg|jbX#mejyR!v|nkU~Y3 zR;@iKAvqF~lL?V{n^Sl=oGU@OE-35~rBEAI%m%>4b5llg!z_TvxMyb|jN%XYVAu;kLM!t(- zdiuCLv@R{0LM*IGu`zRO4bhZ zbwdhA!xFHv(D%SGmrO=38!~dw^X>)|a;7OlG5=RU<1MZPo3R{qym~fq=Kybq9k>@g zydA!PRis;uA23B;C*~Cf=slF6TxI%Pc7_V{^zfT;*X^c?& zI?+HaMwpxjL>12PEtiw#a{LgZob6u1zi<|>(XQ9=5B!L4dDQbAjNu$-pAU)kW4`56 z*XM{a0+rh8IM25N>Q;iEkV_$cN_|Qx-{X4$iVu5(ur~?Yf+hc_5W+I0?!_tL)XRE{ZNC?IqomSkwxK(IcX>oeiv@ zreoE_Ev!uqa&i?(?lCMoaTrq1Q{nNC!gWQI%yeYnHty)SYvLX@Ze~g(Xa|0uLBF)! zm>+*;s5Xwq6Q#$=ME6Z>;sL{g6LMSfeNt`AZ@O;V#KWX69`wd_+5yeVP;LvKe~P^> z4^Qo`OFNZz;Mne&9SW6?H#PZ1v3}Y9f8F*Na(yljNxLG&gOq9N(m$@Fl1@spJmRZ_ zi=^!h$mf$F4jukMD5}+Ihjx_b+9o-jp*NN#U&w3vT2UfV)RYJmb0A8{)B1?AbE;$% zH(EcyTG!BrC{d_hV||EvtMwiAA-29zMFx*)T_r3~pl$}e#Ug4@{*}<6U31h4O|&Ru zc#`a>TP(`dEjj8}`br<8W{Lz*o&e`k@KZda(^+tR7F?MN-kA&Dng!S9fHfj}BhIU_ bIK@l1B?=>X4@F<<-zft$jj diff --git a/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/Channel.class b/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/Channel.class deleted file mode 100644 index 09bbc324141807ede322be59a94a2cbc267c5256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmb7BO;6iE5PfT$xN)3>rU6>$=c$P)wZxSc2|;^`a!C}a$BnZJTiNT#-c;(pY9(kT z4*URq6k>K0fkbi$T50EFcizl61+5O3X@hIVH67@9=GdVJ_^#BcnSsjZa&gE3obUx*u2WXn%8?)({YcY_iC^S!} z3?JLeNXwbdkUF0dMS|!`C3>@TB=P|tC3co9=E;!f(!`6TtIuV@aL|1MyCVi~B6QC( zY_&Vfb1>BD!`TBll6Fps!S83YJQm-jnJHKZ_SwjU4mLXnnf-=M^86CJIwzL>jQiAy;Xk>ayC!}IQDx$JnIu{UNYoRKd?IF!D4znD!# zc*!Ro-86@R!@V&NrH<3fg1V9s!|Ct_mh?&ORH#vEOS9YC?2N&rgtL_+42BL@R}mzk zJ@O{eyk5Dn3Es&BAK-BcKBqplBtx6ku)d-F&!!ql1a(^^D=H*a+tW$1|Jq~3R%q!5 i8AG@}fa~nZ5cY_D9|oc8)Kd$Gah015;gI^u;ph)5?Zwgn diff --git a/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/User.class b/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/entity/User.class deleted file mode 100644 index a63986adece722c0e5aee8cb7cce9045ae63a7e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcma)3%T59@6g?ez$T)%`zTYchG*03cH8BQP#0^N|vJ4H@Ff(MPnD|$kh$b%l06)rj zTZju`L7MbF+I#Lj=YIcuegU|^z6}d=S)?4KkzqLVqrgl0u?&?L$Rv?b=yhb`M;#%R zCqgCFvv<`_RLp%^yyPg z^CCeCn1BlS2r4RNZ4!68w%Xn__TlG%8q4A~S&9<0z^qUc_4mu$iP0CSIr z$hs#(EWVn8Rl18*0MP#R*68G6V~sKgqcW^xgCYVjZJ6EL6Pm|3`aMv)|`vu&V BmY@It diff --git a/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/ChannelService.class b/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/ChannelService.class deleted file mode 100644 index 8547b8926250290ff7d40c45e5c0c97333726285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 649 zcmb7C%}T>S5dOB>##U2n^AgR)J$Q^i6h#mM9zwmx%@DV2Hzm6%_-Y<}03S-+rco;a zA*W@(8NQ#H`S^T$2XKYJLyzG?6f17lrPP+Mq%pG4Jd;Kg8A;0xl^ZFD-@c?;lS+19 z4~GnsWx7eZN_Ea3pO+*ogD*--Ej7&y$t?bDO03h!qc#%8|5_kzrG5Q&5HXB$vOf|x zjYMUo;)}(@UDTCs?C9o7HH?N~ItzCuYtC32>qLi%%ynw3k{IT#hRaS7t{tCWt+V}6 ziB^vGpxQ{+tbRs{_7)VhRKq7X;H0QZLHAO*u)*KepKljBU|=|KM+EfUCG;`C_98qS c)$b4^S3h>u9!?zYV_f5>m^h5#tgcMI0AP;CfB*mh diff --git a/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/MessageService.class b/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/MessageService.class deleted file mode 100644 index e93a79113ce69d1f7c308c6604a5e63fd5afa52f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 645 zcmbtS%}T>S5dOB>##U2n^AgR)J$Q^i6hsgrBB9>b%@DS1lak#Od^Ha~fDcvNrd1*l zp?DhRhwo=*KGtvV0Im>t=rCN!V!_R_RJr8~WsE9vo+=}Yl$7O$%9WDDAIKPyQL;@v z95RgNVkNj1dBz`K<|HkHFG~`ZcEb!}64yhORhrLc_qWmSc@2_Sry+~N_)kHUTV-Fr z^h6AUjO;hzO^a|}xS@laYP~}=4C6`I5FIOH9ce#NSuSi<62r7LaJiR-Ylr7o%e1+; zrl=9oPOh6DFNK-Yai7d>pg!NXA< a`xvHnn6}Is=RU+g=ix-)!^m!#q0P z-LtsJUi?Ist#;c<6gSlrmNelwod)@r+^<8ZqXMj4c*>6;8^ z>c><>Q&o{;D31i@jxYSTMg*uKi)mTgS%#bQAzDyf!>7b{s>6}uraUvF;~Si37~A3g zdXr&lz8Fj8)vNW@>Le~;R>egf-(rp--Ipn;)#;LWcjKI)qH)eB5@E+=56}xbF5?P8 zQ4$O{PJlY$po(h@)5poIxUTuOE<9i6dqc-f%u`SIO}ooIhVy-O)!MdAJ*Q4pHC#nW z3Rh;xN6bOTV|zlWDmrdSc~jjEHH}M}?{s`G6HmFk)!yeSZZq5-*|pDh81%tJL+m)F z-*q{|Myvy5hNakJ(2)8_hJIgEm#bv58hKHgOgMa_+uG*tujaN*k*RvyGVM*%74kU> zD*mn@#g<0Xd@kffUlV8Aayh9K)ydF^clFDr98Ee<8&&3*t)Py;2XVtQOg6b^xuPT6 z%%ED~o5xT&C5J|??3HmpZjqoH#Z$s11ifb2!JaZ?h-SsMBPMD<|EnmSO|q`^`B(%%plW4Srj)Jv_`w@T6|4N zyUq+GGJQ+nwPD`c278nf~w4wV%L`NYR{bd>VhE$TE^N1G1$9u+kCKtpiNF zhxSLX`)3;EcLErPLbJOx)5HC^hedi~sA4I?dP92@ip?G&yH#E|z|=4+#X-mm zF-39_WT^8K0$j&a8YSTG1UN?jg}wwAmAvvd(s^ZpBwENT@0i3-2J*}V`!A6=1)QaR z&f*H@a6RC=6JqsBC`2U?eju2Xq7Vp{r1PO*3Z7AP9PD4rsU$Z;9nWc$*{w$M=}~q@ Z0f1WH0`$cGa$JPKJgqO#0LGBfF0 z|4};AhM~-K`qYR1rcS13CB?`#fYX_evpBJWE$g86=YT9 zFd?vLv|E~Y;98EawJguG+K$$+Jfqz(Eno9Y_s}v-ZQuA&d$hW~X?mXCH0$B4K&qkp zy1+#3G!@fS6-)}u4+Sg&|bXQSgW4>9#miVNxWGtZA*k1 z6(8V|z(~{dHyQ#{#Zv#$aeRnb1s|#S7?%aIJ-n&iL5EV_jTprAjX1<-BJB8-M4wY} z6`v4_Bm{1p0d>Yg1)mB`pORT|UHw(f@_dPSL&Z%L+2KRo?wFpyrJlN0+qO*yuy552 zuAwYtoEIp>WsJpyQdLykf=0~F0b6JaT#OU#sw&feuHp+>(5P#++J~ls+X7z>?d?0$ z^t&Zpx0;UbcUl(Tr2v7k;`@c4Tj5p~sGO5PhQ{tzd~cxQ(mCN07Rly_xnkQ9EF06i zb>&W=+$%l4my`d~zdrG#O|qfky9GQQC}2>n^OlsY`?~QHT^*S%+c0f2W|QfGoTY7n zOugN44RhU+rkxo$Y;VaX@@N_7O~4Jv-;_MS`G1F3L;_!7lw;lwe16TDWh6NQ^5r9l z@(GlkBcy*v=GP$lE}!yF0mhI*8sBiFhVfWLm2cb}ym&&apNTudxw#YMcjgx=N0?en zm48E~ka~lQh14+$NxUqiUNa^EiJfD1AWO^~Puht9|8|HG;S-G^h4{{RnS807!} diff --git a/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFUserService.class b/1-sprint-mission/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFUserService.class deleted file mode 100644 index 1b9b87d99214530f5f144e220b10448355c350da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2094 zcmb7F?@!xS6g@97F$5<~prg&$Xu57~5}@w3ZvBxg8-=pcrnFK972jqYmp{OzAs(#k=1+k)Y?l!M{)v_Fmz-L zWN|^@j@@mWy**EMe6uZkJ=yJ;E!nfXEl2uh&++!9?U=jvOY`ya>IT=%FeIS0EZ-8i z&^YBGM^#5&pfnQI>G;xrV=A;Xa+p?KT@<)c3Za6&nm$X~sSZcVo9dYv1D9}FU~I?n z*IEKorE;u}jg7UH>LfnItd5Tie2h7P%s`pcX|GS&?#4MoE#sU~B*Kmf9-tQuT*W7Z zVi5w@-vRZG2X%ZZFnwCglIK}(8nWlBdaoO}ffA>=Z@GP^CvbV7ujQ`ma@w3xHH~Yi zDB

3K4TK>sU@G)uMr$O5Rj|j}vng%`F3;tHM*B)9&s&I=&RRHF9LfMi_9wL{si` zEWhtL0#9P{(+0KJGMGkVBz(*f)q0iQTBiS$w`9jz@3*%d?+0t!Wn`++wJmqk@}ycv zLCt?9snxyF9LFsTdzpl3+jA(6YER&Ke3I`s;%K^fO9JD4B6qBI&_Xc$xXbBdr)^1> zjjKF?%6YJL+Al1;7B@m5d-*&-3CTApcXo0DlO$MjUBy9}2VXViT>;%5%jGCO#F)U&q4Mb zUe%Egj6=f&?()tE^KlRNxe}g#R5prAe3kR55ul$1a;&1q1@eqY1UM#-l zb^;1EOJX2H_$&%6P(fG1$0KM0@sm>z=w|UP?-I<;<2x(`ML)oDMErm|s>rOOn?J;r z1pY+sluI=WTnsp7!pswnELQN4`vR-@o_k7^Y9vbj2-mh0<{>^4I6(O2`>9(n2w6f%t)7N{V72Sd!0&f@yfd=s3hbnA7>)5@_Hlud2G0NIoN~&P?FN+4+~~ TsB%m|Bu6m@Lr2Cy7DpMb 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 diff --git a/1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/MessageCRUD.class.uniqueId2 b/1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/MessageCRUD.class.uniqueId2 deleted file mode 100644 index 42aa4098cca375d907969e107f57f5155130b31b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3131 zcmbtW?^6?36g@8qSqK{hL^N6{T5CfB21Q#Xh(*9ci&#al^!Kt^!|G;3HyfsY?0;lu zsthvI_LH6IU(i3M?ex6eN3uc7r1s11dvD)8_q==0z59Ou`^C=yuA`np3~>z!9UVvt z^gc4Sje=vi<-(nfN0#XeB&TfG_NN8n*^xC3odSKqrn+xCg$1LwdE3}ZK|{O?-Ox3p zb@bqfz_?kh6lzG5exYW0+qP*HZdC0Q40b$-jIs|C~A0D;A~Sui;iQJ4QIwH*DItw|GjB#`P4xt-V?~k6AV|qVP!q+ zR{i0J)w)|s;T%S!Aaer86s16tD?Zg!E=n1W3gi!sxeAlgR|#P{@sa6zr zq!^15y{Kaf*9k=u0_R@?^%_GBHw2D0$;^13@np%a`4VwP$4$(#(zgw#Zq)=%w47_U z$~2lXZ`9i~=4BXfF@Mo8M)r)X$xtomSd{ro*0)&HmUQ!pjwMMv=~oG6Yxs4~5?GF8fX!kmG7YM!tzuFtDNYv!O4-9r_DMDRN_*QQRYw7{ z*UhpK%3f!?)^feFVR`qB4TmfJOI6cw)(p>3q|s-DDrLnTZ~@lNrZRtJGR+bCbP-A)0CF403U*tsw6^lLeLzTSDUicmG9?|3`o6 zlI2(t%^!WmhpfTWO118p)-7AsU9Tb}uLKvQ7IB96ju-@PBhJeQFEt$B;k7A-PdVpx zgyVjBpWr*mZymVH=RM9gX%Xl9WNrr{w+C%~2VKvQ%H^M-H#hnW13&U>3@dyN(hkH< zAjM}d2GGa5ML+IybvQ)9D%Ln7Uf@*(Bk5PNdw|cB*FT7)@!LY~C-ml@Z>Sn+`4 zP=Gr~hR4Y-gCR1>;xsOEG|xMToNCL>wmP93qoFr; Ccs*kP diff --git a/1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/UserCRUD.class.uniqueId0 b/1-sprint-mission/build/tmp/compileJava/compileTransaction/stash-dir/UserCRUD.class.uniqueId0 deleted file mode 100644 index fd6b33cf6a03450d48950184676870c21a28db0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2068 zcmb7F?^6?36g@9lvaoD00gI$4rrJspi0jW*O&W_(D>b5H1cz^3k~jEtlQ5eNGyWI; zDR!onL1sGr)DQieI-TD8b_*M@nerhoZ|~kc=iYPAzWwv>kG}!<7SAjskThY~7(q%P z^V;2Y9nbA-J5RS>%Vr>us;Z6(Y68hZal^!@KvpO91LZl7+}^7v?v4c$$uW$>Hj%b5 zfinW-X1DG1c6`+doVM!qRJY@_RIk}>NfkIf>F=thbk=FJ{Cs^yz-YOFD{!WMgigp6 z6Ip@6P%POARPa_qS;%0DdpRpGUkIUeH;sS_*{+<76gT*pX&dJ-BQUZpgVmP6WT6B(yjSH9)NDq`r>g@DMtUGbeP{BB76p657GHdj_jW2MCpr{CeE1!V+ z#DgZj6qq_HX36*6w{_JExZW!^=24&-?z&!I_5@}I`daRK9?h60Q?YOvB^GW$AQv&~ z3CD6msmeC4vb?GO4oyrl%{3d>x$u-P+udDh;-{3soJ`_IYh)S(O-dZNtvA0x5uJzkn(tqJ@c@&wfcbl%a;rfcNqo5JIQlynL zoFm=>JD6y!rY}hn_O!sW`27Cce#1%PjR=hP3Ay98b>VvCac`4*W!qIAwaa+|rPE-W zWV*2MYJB`!?BZ#F5{llR%<*{%j1$3<=P?I~JNSaJUrE2(fIB%@{r}87XDjq%*vC&N z`Us1PYj!ens$SELz-_)Ee@4!+TGEsM8er-Ke{q9KY;^m6Q$AE|zcg3M=DEt#q_=;Z zj$?rv^qb^Ul>TqgIi0|5q-ak^G_7A#q=qEzfJ|u*qI3Xra}Q&`!unZfe?u!D?4V=W zz$os}&JOc&7x(B&pn__I^@ef`ip?G%v$?Rihsm|lFR;oV@L72uxg=he-_z{`7SdNGv&>b#vg6S6aaWR44kvZbx zW`QZqF&$DltB z%`D+&=qOGtD$7hx28OaE2ucZlAgg%vrD3D9 zZ_#VnPolnJdMrHR3@wS7c>)3jKD+Z)G73(fdrfU=Qj~>6u%xe)o3yixm#m(g9QlpvqL&)xeUsAUAdy!=dd0`G>3shZA8 zA_CGAwQJ(8PS<#Mzw3y3^TG34!P?GJB76cS>kO3V-k9>E=bC{!>sQH89bYA00l7P@ zpQc96y)7>Can8a?^4z+iN`eBJ;YuHN2EL5nu_*b~4u*r9xEL527$q2lfTR`!Kaf;s zP+(+W*3{8u&}3v3WfB592}JX&Gw6V51_=fUAkDy_4koq0BtruO52ou0j~B`=t*eFFH6T z)D7fXpfl8C_2OLP9W7PWz+8m{y+mhA5inabNiW$YB{VfC&DjZVQMyY;Xl78BvoJ^` fTQA2YH#9FO-`N1JpunXtv?!?9SpXyg3M~czy8XoV diff --git a/1-sprint-mission/gradle/wrapper/gradle-wrapper.jar b/1-sprint-mission/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index a4b76b9530d66f5e68d973ea569d8e19de379189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/Main.java b/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/Main.java deleted file mode 100644 index f7434e9da2..0000000000 --- a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/Main.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.sprint.mission.discodeit; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.jcf.JCFChannelService; -import com.sprint.mission.discodeit.service.jcf.JCFMessageService; -import com.sprint.mission.discodeit.service.jcf.JCFUserService; - -import java.util.List; - -public class Main { - public static void main(String[] args) { - JCFUserService userService = new JCFUserService(); - JCFChannelService channelService = new JCFChannelService(); - JCFMessageService messageService = new JCFMessageService(userService, channelService); - - User userA = userService.createUser("Jun", "junhan5231@naver.com"); - System.out.println("계정생성: " + userA.getUsername()); - - User userB = userService.createUser("Suyeon", "suyeon@naver.com"); - System.out.println("계정생성: " + userB.getUsername()); - - User retrievedUser = userService.getUser(userA.getId()); - System.out.println("조회된 유저: " + retrievedUser.getUsername()); - - List allUsers = userService.getAllUsers(); - System.out.println("전체계정: " + allUsers.size()); - - Channel channelA = channelService.createChannel("일반", "일반채널"); - System.out.println("채널생성: " + channelA.getName()); - - Channel channelB = channelService.createChannel("공지사항", "공지사항 채널"); - System.out.println("채널생성: " + channelB.getName()); - - Message messageA = messageService.createMessage(userA.getId(), channelA.getId(), "안녕하세요"); - System.out.println("A채널에 메세지 생성: " + messageA.getContent()); - - Message messageB = messageService.createMessage(userB.getId(), channelB.getId(), "공지사항입니다"); - System.out.println("B채널에 메세지 생성: " + messageB.getContent()); - - User updatedUser = userService.updateUser(userA.getId(), "Junhan", "jun5231@naver.com"); - System.out.println("업데이트 유저: " + updatedUser.getUsername()); - - User retrievedUpdatedUser = userService.getUser(userA.getId()); - System.out.println("업데이트된 유저 조회: " + retrievedUpdatedUser.getUsername()); - - messageService.deleteMessage(messageA.getId()); - System.out.println("삭제 메세지: " + messageA.getContent()); - - if (messageService.getMessage(messageA.getId()) == null) { - System.out.println("메시지가 성공적으로 삭제되었습니다."); - } else { - System.out.println("메시지 삭제에 실패했습니다."); - } - - List allChannels = channelService.getAllChannels(); - System.out.println("전체채널: " + allChannels.size()); - } -} diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..6e970f5400 --- /dev/null +++ b/build.gradle @@ -0,0 +1,33 @@ +plugins { + id 'java' + id 'checkstyle' +} + +group = 'com.sprint.mission' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation platform('org.junit:junit-bom:5.10.0') + testImplementation 'org.junit.jupiter:junit-jupiter' +} + + +checkstyle { + toolVersion = '10.12.4' // 최신 안정 버전으로 업데이트 + configFile = rootProject.file('checkstyle.xml') + ignoreFailures = false +} + +test { + useJUnitPlatform() +} +tasks.withType(Checkstyle) { + reports { + html.required = true // HTML 보고서 생성 + xml.required = false // XML 보고서는 비활성화 + } +} diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileChannelRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileChannelRepository.class index a24f511702603973d9f502899b4763c724e5c8d5..4c0e61d2e56f3eee60f8806704d52e782ccd55e0 100644 GIT binary patch delta 116 zcmdlY^;BxZb7n(>Hyc}Cw@i35w?*O2f`&KqmcE@j<8{}R*S#AQ-gGZ{+p_}5e>0=u pP1n}f-5syHm*{Q&&uqnLppVe@dRxcq`D@;N*x-nbQ3c}%P5~sh delta 37 scmX>jwMA-!C98zETViHTYKlThzCuoZVv0g;YH@L5dTR0JOxDNj0QGncT>t<8 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileUserRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileUserRepository.class index ab93917cbbd34c5d2128c7009d11d7c6cd233101..889d1916523d4acc8f25e94d9677e82807dc3b1c 100644 GIT binary patch delta 126 zcmZpd+9$Q)9h>KENFPWbdLg%dNXh7+o>~NcTIWSyFuYi_ma0gD}ekrGaBA> yZGGL{@w$77-saEDR*Yu)2yL&ob-bRx=FN;H__VPzA(K{<4*vu;I|+GDAQ1`qXLxz z4R?%XBbqWY3(?8BJ7&TasJv)pEccQ?StuN@LY07?HXX-UFr6O9%vK|a8V$ORTGR;) zChT<7S;|@&H=4E_$Feigq~#>+q-nX)thr=6mTPBMqVrbDjE-;^&x7449tl**!zsgE z6lfaTv}oET>_RL^jSV^)(L_^Hwvimk+G&X-&=?Bm<#Vo;ijEsgF=<|lj#lguC{G%$ zAyB_XB#1Wb)39I10UQ+Q+|>g!<67=Y)H7P3V!?DrleDu$^Ua&1!?7A1M!SX%9Y=6f zpjJ6jFpP9A<;ZSd$md|5^4Rtr&nsVC6br|7oRCoqI>xd&V@nRC(o;G@2vY-X6F9kp zh8^%UbP69=ez`6hENNn+SdBdwvIY76JmRsU%aeTYf5 z7X@1V4tqHhjt6lbm!!nyO~a%jpNd#sYCy*zh6HNvWi8h%ltBrq7pT1aRUIQT3KfZz z?a+_w1s+wnW)`#dJ!39q25}9q>Ua%f%mpKvoX#yRWtsaXv!~5(a`6W3(J)a!qp_ot zSMMjxB}ue~sRCU}&5axrGi?^nt8hbL?}$O3k{zzyAv2_-P`5!$Vn%XtQy}73?Xl%c zz*1vwk-I_&@*Iq2d=Z+Z%EGaXknb>v+hB6U@s`y4_NL3ytxXISf;isQ@g7*JK}J4V zh(Jpr=Ss^Uj;k8T;UT}~3ELg9bD3n34-NBd4@yL(<8{MXWPb?4l8YnQrZCJOY1c8A+ybvQ1ddFdGwb(dsX_$&5JLjSjMd~X{Jn<>@{!qf&`V>Hsf?KZ`zJclo*27 zTZ5CrY1c^HWm$NUFSBLf4-}=hl|1jX7f)ryZ>t(gc-mBH73(pk;ip1pD?JgI zDxr$z{Qry(PTRR`!jvYmZOUm|4feg^L_# zfo0tDV5d+On!p92l6MRZ}NkWWv$QzC8h|EgN zr|1$`L+@6|!#=kgJ;*$-pAq15e8Euyj(G+)cm|#g?Ckn6)ZjSXKjAaAp=fG@XKFyc zmptUZ89Nz_E9*EvyN5q$gpwhicTpmObLhlnbStYn z6jD3B#8RiIDNjYe12mMZ;sK&cb?<0^mVT5k(wT&=ra8^XV^Qoa}w2*=q1`|;+^50)0F6?%o)XF zAGzq~V^J1LgfVO6>+xHBM`n6y!vlQJfBlNB9~4`|KDI8PVuN4-#ZG(+TYO%5Y;Eu& XnGDJyab3fYUXlOI{a>gyfM5RuezZ$} delta 121 zcmdlY^^1w?)W2Q(7#J9A83ZPB>9esja4<4BO+LsbJF!B2@_*Kv$saki1K1gufJzt` z7=e(LfelD<0(tsiJ_7@*)^-NQjX(h=1}-28l4f9FX5a>rJYY5}kmd#Q7#aA0BohNa E0Hah7ng9R* diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/FileUserRepository.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/FileUserRepository.class.uniqueId0 index 0632b266900ce9bfa313082acdc284885ff7fef0..ab93917cbbd34c5d2128c7009d11d7c6cd233101 100644 GIT binary patch literal 3335 zcmbtWX;&0S6umVpjYETM?hCj?nE@HMC}wa2M2R3qbd>DvObe~UG@0%}$-bF={S|)I zb0QqWInmGgA^8va5_4Zo&(H%Ljyd@-)!kLE?z`{4S8wXie}4Z1z)AcXMFdp_s!i0O zR-x&(HESiZR&FvecJsEK_7!UToSfsIQmE>TrRq?pu&&_Qd9R1VIz&-#z%zeagMy;8oaBDNM0UH&nGnQ{D ztY2ml#b#_Vu+_viY**-9lfIqv9e*w%j1_7oZGSjJk`->RT^k-u)?+8y4Rn~;h207b zI*Jl2syI`isJ)$`=!!}wSIz_>h0>uV*lXe?NmkUeX6>u42p~@Po9IN09>`5$-zpwf z!86dM(7MF&Y(8(zjX0h!hzCscAi)xtwXy}4)+N;NY81UlirYSg z4dH-;f{CS~IEGVVae9fEI10H)7Ol>j=*NIU{oTCd+okHSKn)UAv_EHJNU~6q&bl7s zxKPqjr|are-o0zx%-T_$$EzkTVuZC|WisQ1nVG!pc{ZzObC_~@2l*JdR6--!;jwe~ z()Nr9ZQycAF74(@fmJzem)GlXMWJoTqE49(-|dhJ>CneDiZNUjA+9OJ!+ry)Le*Ev z0cCJI2TIKguN{6>=`s#K-4S2t~CQ&!%Q?_jdppK^H2&#vtw6xc0h ze3eEnj-~Vz4s@=K73LdDahnt?EA+*8=|7EJrhiWQabLLiXt`ql1u5bXqiMO~3dSub zmpPlwE^qkKC>iUiQkCj5lgYjp_bOSc&DdGnr(CTo`BRiC*JW0=7kRDPCW)cAeM8wK z)HAr&Fz#FFJFNX6&sDCZd0W|f#kuC5_VTJ6>lH_X7J)Z?e#(a~Y2e3F@2Xr;7_HEW zbpB^?N5|blK5Yv>b|HCG9<&}g-~1bvOO8U8V~bo=_@3kKCjx^%-VgZg>hBrOu%V-t z<9nPL*870g_ySbC#dwT$@%TK}KSt{#y&=!B1=So)j&kE@;CCZDJ)=0b!bgEmg<0GU zU@xPJz(8C4H?(%mV^h}??5M(ZLho6^ZKRc;uO~(;+BD|I;=TZr2)KtiqAI+P4+8Xl z+6a21Mt_2R5j?}@hn$H(_)2i##YZ?6@fyo`jrb5BX}pi|3GGFMBzee==0(IO1oH{H z6&7%CIpmH|*v$cCQP)oi@EJbmD1ajY!KQ%Vk;v+y??yfLF#NqCs!e68O##)2+=T+< zznD8o#+gMNn^;8eM2oS2R~B$`q)U9w;|$dve1O)`;&a`l?gR4}?tc1!4RR4<6D_ZG zEnxiVBZl0JE$HBX_b%dh@(CQo5sY$0MBI%!j{9lVNxK*=_jA3A7BL*l{`R6P}{z=IK z?ey3|-S_he>_7r(&L#9yzI&-d@j0dEff$?3=9mm3<49m^x4=MI2al1Co8hqPkzB#J^46?MgThl6HuOkfe{E< z8Q6d%Cy=KP<})y`YHep=+z1q4V&DRjAZZ2$W(IB`$pdDy0%=|#kCA~7NHQ_-0|3Bg B4Q>Dc diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index 7c5c7106b83af46779fd48cb7c752d17acb102b8..8c72c5a09fa0f38d9b40e84afddc106ae4215102 100644 GIT binary patch delta 72 zcmV-O0Js094yF#U9sv-@B&+<{w&*^F74yQngLpoZE&;F*^_NszyiuYw)$!nWywhSD ev+e;a0T3~9pBbU%zbouw$;%wn;~29k1N{T{o+9u7 delta 72 zcmV-O0Js094yF#U9sv+~U}8&^KR%3;^TLU`wzavFE&;F*XnTLAI_y(@QIEtjz#43> ev+e;a0TAxrSs#QzsS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..e69de29bb2 diff --git a/1-sprint-mission/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from 1-sprint-mission/gradle/wrapper/gradle-wrapper.properties rename to gradle/wrapper/gradle-wrapper.properties diff --git a/1-sprint-mission/gradlew b/gradlew similarity index 100% rename from 1-sprint-mission/gradlew rename to gradlew diff --git a/1-sprint-mission/gradlew.bat b/gradlew.bat similarity index 96% rename from 1-sprint-mission/gradlew.bat rename to gradlew.bat index 9b42019c79..9d21a21834 100644 --- a/1-sprint-mission/gradlew.bat +++ b/gradlew.bat @@ -1,94 +1,94 @@ -@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 -@rem SPDX-License-Identifier: Apache-2.0 -@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=. -@rem This is normally unused -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. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -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 +@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 +@rem SPDX-License-Identifier: Apache-2.0 +@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=. +@rem This is normally unused +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. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +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/1-sprint-mission/settings.gradle b/settings.gradle similarity index 100% rename from 1-sprint-mission/settings.gradle rename to settings.gradle diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java new file mode 100644 index 0000000000..5db9890117 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -0,0 +1,62 @@ +package com.sprint.mission.discodeit; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.file.FileChannelRepository; +import com.sprint.mission.discodeit.repository.file.FileMessageRepository; +import com.sprint.mission.discodeit.repository.file.FileUserRepository; +import com.sprint.mission.discodeit.repository.jcf.JCFChannelRepository; +import com.sprint.mission.discodeit.repository.jcf.JCFMessageRepository; +import com.sprint.mission.discodeit.repository.jcf.JCFUserRepository; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.basic.BasicChannelService; +import com.sprint.mission.discodeit.service.basic.BasicMessageService; +import com.sprint.mission.discodeit.service.basic.BasicUserService; + +public class JavaApplication { + static User setupUser(UserService userService) { + User user = userService.createUser("woody", "woody@codeit.com"); + return user; + } + + static Channel setupChannel(ChannelService channelService) { + Channel channel = channelService.createChannel("공지", "공지 채널입니다."); + return channel; + } + + static void messageCreateTest(MessageService messageService, Channel channel, User author) { + Message message = messageService.createMessage(author.getId(), channel.getId(), "안녕하세요."); + System.out.println("메시지 생성: " + message.getId()); + } + + public static void main(String[] args) { + // JCF Repository를 사용하는 경우 + UserRepository userJcfRepo = new JCFUserRepository(); + ChannelRepository channelJcfRepo = new JCFChannelRepository(); + MessageRepository messageJcfRepo = new JCFMessageRepository(); + + UserService userService = new BasicUserService(userJcfRepo); + ChannelService channelService = new BasicChannelService(channelJcfRepo); + MessageService messageService = new BasicMessageService(messageJcfRepo, userService, channelService); + + // File Repository를 사용하는 경우 + UserRepository userFileRepo = new FileUserRepository(); + ChannelRepository channelFileRepo = new FileChannelRepository(); + MessageRepository messageFileRepo = new FileMessageRepository(); + + UserService userFileService = new BasicUserService(userFileRepo); + ChannelService channelFileService = new BasicChannelService(channelFileRepo); + MessageService messageFileService = new BasicMessageService(messageFileRepo, userFileService, channelFileService); + + // 테스트 실행 + User user = setupUser(userService); + Channel channel = setupChannel(channelService); + messageCreateTest(messageService, channel, user); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/Main.java b/src/main/java/com/sprint/mission/discodeit/Main.java new file mode 100644 index 0000000000..302807c1e4 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/Main.java @@ -0,0 +1,78 @@ +package com.sprint.mission.discodeit; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.jcf.JCFChannelService; +import com.sprint.mission.discodeit.service.jcf.JCFMessageService; +import com.sprint.mission.discodeit.service.jcf.JCFUserService; + +import java.util.List; + +public class Main { + public static void main(String[] args) { + JCFUserService userService = new JCFUserService(); + JCFChannelService channelService = new JCFChannelService(); + JCFMessageService messageService = new JCFMessageService(userService, channelService); + + User userA = userService.createUser("Jun", "junhan5231@naver.com"); + System.out.println("유저 생성: " + userA.getUsername()); + + User retrievedUser = userService.getUser(userA.getId()); + System.out.println("조회된 유저: " + retrievedUser.getUsername()); + + List allUsers = userService.getAllUsers(); + System.out.println("전체 유저 수: " + allUsers.size()); + + User updatedUser = userService.updateUser(userA.getId(), "Junhan", "jun5231@naver.com"); + System.out.println("수정된 유저: " + updatedUser.getUsername()); + + User retrievedUpdatedUser = userService.getUser(userA.getId()); + System.out.println("수정 후 조회된 유저: " + retrievedUpdatedUser.getUsername()); + + Channel channelA = channelService.createChannel("일반", "일반채널"); + System.out.println("채널 생성: " + channelA.getName()); + + Channel retrievedChannel = channelService.getChannel(channelA.getId()); + System.out.println("조회된 채널: " + retrievedChannel.getName()); + + List allChannels = channelService.getAllChannels(); + System.out.println("전체 채널 수: " + allChannels.size()); + + Channel updatedChannel = channelService.updateChannel(channelA.getId(), "수정된 일반", "수정된 일반채널"); + System.out.println("수정된 채널: " + updatedChannel.getName()); + + Channel retrievedUpdatedChannel = channelService.getChannel(channelA.getId()); + System.out.println("수정 후 조회된 채널: " + retrievedUpdatedChannel.getName()); + + Message messageA = messageService.createMessage(userA.getId(), channelA.getId(), "안녕하세요"); + System.out.println("메시지 생성: " + messageA.getContent()); + + Message retrievedMessage = messageService.getMessage(messageA.getId()); + System.out.println("조회된 메시지: " + retrievedMessage.getContent()); + + List allMessages = messageService.getAllMessages(); + System.out.println("전체 메시지 수: " + allMessages.size()); + + Message updatedMessage = messageService.updateMessage(messageA.getId(), "수정된 메시지입니다"); + System.out.println("수정된 메시지: " + updatedMessage.getContent()); + + Message retrievedUpdatedMessage = messageService.getMessage(messageA.getId()); + System.out.println("수정 후 조회된 메시지: " + retrievedUpdatedMessage.getContent()); + + messageService.deleteMessage(messageA.getId()); + if (messageService.getMessage(messageA.getId()) == null) { + System.out.println("메시지가 성공적으로 삭제되었습니다."); + } + + channelService.deleteChannel(channelA.getId()); + if (channelService.getChannel(channelA.getId()) == null) { + System.out.println("채널이 성공적으로 삭제되었습니다."); + } + + userService.deleteUser(userA.getId()); + if (userService.getUser(userA.getId()) == null) { + System.out.println("유저가 성공적으로 삭제되었습니다."); + } + } +} diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java b/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java similarity index 100% rename from 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java rename to src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java similarity index 100% rename from 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Channel.java rename to src/main/java/com/sprint/mission/discodeit/entity/Channel.java diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java similarity index 100% rename from 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Message.java rename to src/main/java/com/sprint/mission/discodeit/entity/Message.java diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java similarity index 100% rename from 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/User.java rename to src/main/java/com/sprint/mission/discodeit/entity/User.java diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java new file mode 100644 index 0000000000..5bc2163a18 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.Channel; + +import java.util.List; +import java.util.UUID; + +public interface ChannelRepository { + void save(Channel channel); + Channel findById(UUID id); + List findAll(); + void delete(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java new file mode 100644 index 0000000000..37e430ed38 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.Message; + +import java.util.List; +import java.util.UUID; + +public interface MessageRepository { + void save(Message message); + Message findById(UUID id); + List findAll(); + void delete(UUID id); +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java new file mode 100644 index 0000000000..f58057ef8a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.User; + +import java.util.List; +import java.util.UUID; + +public interface UserRepository { + void save(User user); + User findById(UUID id); + List findAll(); + void delete(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java new file mode 100644 index 0000000000..04a8a2b5b6 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -0,0 +1,57 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.repository.ChannelRepository; + +import java.io.*; +import java.util.*; + +public class FileChannelRepository implements ChannelRepository { + private final String filePath = "channels.ser"; + private Map data; + + public FileChannelRepository() { + this.data = loadFromFile(); + } + + @Override + public void save(Channel channel) { + data.put(channel.getId(), channel); + saveToFile(); + } + + @Override + public Channel findById(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public void delete(UUID id) { + data.remove(id); + saveToFile(); + } + + private void saveToFile() { + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) { + oos.writeObject(data); + } catch (IOException e) { + throw new RuntimeException("채널을 저장하는데 실패하였습니다.", e); + } + } + + private Map loadFromFile() { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { + return (Map) ois.readObject(); + } catch (FileNotFoundException e) { + return new HashMap<>(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("채널을 불러오는데 실패하였습니다", e); + } + } +} + diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java new file mode 100644 index 0000000000..1518648a9c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -0,0 +1,56 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.repository.MessageRepository; + +import java.io.*; +import java.util.*; + +public class FileMessageRepository implements MessageRepository { + private final String filePath = "messages.ser"; + private Map data; + + public FileMessageRepository() { + this.data = loadFromFile(); + } + + @Override + public void save(Message message) { + data.put(message.getId(), message); + saveToFile(); + } + + @Override + public Message findById(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public void delete(UUID id) { + data.remove(id); + saveToFile(); + } + + private void saveToFile() { + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) { + oos.writeObject(data); + } catch (IOException e) { + throw new RuntimeException("Failed to save messages", e); + } + } + + private Map loadFromFile() { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { + return (Map) ois.readObject(); + } catch (FileNotFoundException e) { + return new HashMap<>(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("채널을 불러오는데 실패하였습니다", e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java new file mode 100644 index 0000000000..3e573bb680 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -0,0 +1,56 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; + +import java.io.*; +import java.util.*; +public class FileUserRepository implements UserRepository { + private final String filePath = "users.ser"; + private Map data; + + public FileUserRepository() { + this.data = loadFromFile(); + } + + @Override + public void save(User user) { + data.put(user.getId(), user); + saveToFile(); + } + + @Override + public User findById(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public void delete(UUID id) { + data.remove(id); + saveToFile(); + } + + private void saveToFile() { + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) { + oos.writeObject(data); + } catch (IOException e) { + throw new RuntimeException("유저를 저장하는데 실패하였습니다.", e); + } + } + + private Map loadFromFile() { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { + return (Map) ois.readObject(); + } catch (FileNotFoundException e) { + return new HashMap<>(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("유저를 불러오는데 실패하였습니다", e); + } + } +} + diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java new file mode 100644 index 0000000000..18f639b8fa --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -0,0 +1,30 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.repository.ChannelRepository; + +import java.util.*; + +public class JCFChannelRepository implements ChannelRepository { + private final Map data = new HashMap<>(); + + @Override + public void save(Channel channel) { + data.put(channel.getId(), channel); + } + + @Override + public Channel findById(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public void delete(UUID id) { + data.remove(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java new file mode 100644 index 0000000000..b7e1390b5d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -0,0 +1,30 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.repository.MessageRepository; + +import java.util.*; + +public class JCFMessageRepository implements MessageRepository { + private final Map data = new HashMap<>(); + + @Override + public void save(Message message) { + data.put(message.getId(), message); + } + + @Override + public Message findById(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public void delete(UUID id) { + data.remove(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java new file mode 100644 index 0000000000..2c89b4d9b9 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -0,0 +1,30 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; + +import java.util.*; + +public class JCFUserRepository implements UserRepository { + private final Map data = new HashMap<>(); + + @Override + public void save(User user) { + data.put(user.getId(), user); + } + + @Override + public User findById(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public void delete(UUID id) { + data.remove(id); + } +} \ No newline at end of file diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java similarity index 100% rename from 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java rename to src/main/java/com/sprint/mission/discodeit/service/ChannelService.java diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java similarity index 100% rename from 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/MessageService.java rename to src/main/java/com/sprint/mission/discodeit/service/MessageService.java diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java similarity index 100% rename from 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/UserService.java rename to src/main/java/com/sprint/mission/discodeit/service/UserService.java diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java new file mode 100644 index 0000000000..e1533d4ded --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -0,0 +1,50 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.service.ChannelService; + +import java.util.List; +import java.util.UUID; + +public class BasicChannelService implements ChannelService { + private final ChannelRepository repository; + + public BasicChannelService(ChannelRepository repository) { + this.repository = repository; + } + + @Override + public Channel createChannel(String name, String description) { + Channel channel = new Channel(name, description); + repository.save(channel); + return channel; + } + + @Override + public Channel getChannel(UUID id) { + return repository.findById(id); + } + + @Override + public List getAllChannels() { + return repository.findAll(); + } + + @Override + public Channel updateChannel(UUID id, String name, String description) { + Channel channel = repository.findById(id); + if(channel != null) { + channel.update(name, description); + repository.save(channel); + return channel; + } + return null; + } + + @Override + public void deleteChannel(UUID id) { + repository.delete(id); + } +} + diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java new file mode 100644 index 0000000000..a4bffdbc62 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -0,0 +1,67 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.List; +import java.util.UUID; + +public class BasicMessageService implements MessageService { + private final MessageRepository repository; + private final UserService userService; + private final ChannelService channelService; + + public BasicMessageService(MessageRepository repository, UserService userService, ChannelService channelService) { + this.repository = repository; + this.userService = userService; + this.channelService = channelService; + } + + @Override + public Message createMessage(UUID userId, UUID channelId, String content) { + User user = userService.getUser(userId); + Channel channel = channelService.getChannel(channelId); + + if (user == null) { + throw new IllegalArgumentException("유저를 찾을 수 없습니다. userId: " + userId); + } + if (channel == null) { + throw new IllegalArgumentException("채널을 찾을 수 없습니다. channelId: " + channelId); + } + + Message message = new Message(userId, channelId, content); + repository.save(message); + return message; + } + + @Override + public Message getMessage(UUID id) { + return repository.findById(id); + } + + @Override + public List getAllMessages() { + return repository.findAll(); + } + + @Override + public Message updateMessage(UUID id, String content) { + Message message = repository.findById(id); + if (message != null) { + message.update(content); + repository.save(message); + return message; + } + return null; + } + + @Override + public void deleteMessage(UUID id) { + repository.delete(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java new file mode 100644 index 0000000000..a0782e93c5 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -0,0 +1,50 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.List; +import java.util.UUID; + +public class BasicUserService implements UserService { + private final UserRepository repository; + + public BasicUserService(UserRepository repository) { + this.repository = repository; + } + + @Override + public User createUser(String username, String email) { + User user = new User(username, email); + repository.save(user); + return user; + } + + @Override + public User getUser(UUID id) { + return repository.findById(id); + } + + @Override + public List getAllUsers() { + return repository.findAll(); + } + + @Override + public User updateUser(UUID id, String username, String email) { + User user = repository.findById(id); + if (user != null) { + user.update(username, email); + repository.save(user); + return user; + } + return null; + } + + @Override + public void deleteUser(UUID id) { + repository.delete(id); + } +} + diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java new file mode 100644 index 0000000000..582b264c99 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -0,0 +1,50 @@ +package com.sprint.mission.discodeit.service.file; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.file.FileChannelRepository; +import com.sprint.mission.discodeit.service.ChannelService; + +import java.util.List; +import java.util.UUID; + +public class FileChannelService implements ChannelService { + private final ChannelRepository repository; + + public FileChannelService() { + this.repository = new FileChannelRepository(); + } + + @Override + public Channel createChannel(String name, String description) { + Channel channel = new Channel(name, description); + repository.save(channel); + return channel; + } + + @Override + public Channel getChannel(UUID id) { + return repository.findById(id); + } + + @Override + public List getAllChannels() { + return repository.findAll(); + } + + @Override + public Channel updateChannel(UUID id, String name, String description) { + Channel channel = repository.findById(id); + if(channel != null) { + channel.update(name, description); + repository.save(channel); + return channel; + } + return null; + } + + @Override + public void deleteChannel(UUID id) { + repository.delete(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java new file mode 100644 index 0000000000..27858a7f64 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -0,0 +1,68 @@ +package com.sprint.mission.discodeit.service.file; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.file.FileMessageRepository; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.List; +import java.util.UUID; + +public class FileMessageService implements MessageService { + private final MessageRepository repository; + private final UserService userService; + private final ChannelService channelService; + + public FileMessageService(MessageRepository repository, UserService userService, ChannelService channelService) { + this.repository = repository; + this.userService = userService; + this.channelService = channelService; + } + + @Override + public Message createMessage(UUID userId, UUID channelId, String content) { + User user = userService.getUser(userId); + Channel channel = channelService.getChannel(channelId); + + if (user == null) { + throw new IllegalArgumentException("유저를 찾을 수 없습니다. userId: " + userId); + } + if (channel == null) { + throw new IllegalArgumentException("채널을 찾을 수 없습니다. channelId: " + channelId); + } + + Message message = new Message(userId, channelId, content); + repository.save(message); + return message; + } + + @Override + public Message getMessage(UUID id) { + return repository.findById(id); + } + + @Override + public List getAllMessages() { + return repository.findAll(); + } + + @Override + public Message updateMessage(UUID id, String content) { + Message message = repository.findById(id); + if (message != null) { + message.update(content); + repository.save(message); + return message; + } + return null; + } + + @Override + public void deleteMessage(UUID id) { + repository.delete(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java new file mode 100644 index 0000000000..39a25f39de --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -0,0 +1,50 @@ +package com.sprint.mission.discodeit.service.file; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.file.FileUserRepository; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.List; +import java.util.UUID; + +public class FileUserService implements UserService { + private final UserRepository repository; + + public FileUserService(UserRepository repository) { + this.repository = repository; + } + + @Override + public User createUser(String username, String email) { + User user = new User(username, email); + repository.save(user); + return user; + } + + @Override + public User getUser(UUID id) { + return repository.findById(id); + } + + @Override + public List getAllUsers() { + return repository.findAll(); + } + + @Override + public User updateUser(UUID id, String username, String email) { + User user = repository.findById(id); + if (user != null) { + user.update(username, email); + repository.save(user); + return user; + } + return null; + } + + @Override + public void deleteUser(UUID id) { + repository.delete(id); + } +} diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java similarity index 89% rename from 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java rename to src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index 18ccf47665..f366538df4 100644 --- a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -7,7 +7,12 @@ public class JCFChannelService implements ChannelService { - private final Map data = new HashMap<>(); + private final Map data; + + public JCFChannelService() { + this.data = new HashMap<>(); + } + @Override public Channel createChannel(String name, String description){ diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java similarity index 72% rename from 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java rename to src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index 0ecd27643a..1baabb1c4a 100644 --- a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -7,27 +7,37 @@ import java.util.*; -public class JCFMessageService implements MessageService { - private final Map data = new HashMap<>(); +public class JCFMessageService implements MessageService { + private final Map data; private final JCFUserService userService; private final JCFChannelService channelService; - public JCFMessageService(JCFUserService userService, JCFChannelService channelService) { + this.data = new HashMap<>(); this.userService = userService; this.channelService = channelService; } + private void validateUser(User user, UUID userId) { + if (user == null) { + throw new IllegalArgumentException("유저를 찾을 수 없습니다. userId: " + userId); + } + } + + private void validateChannel(Channel channel, UUID channelId) { + if (channel == null) { + throw new IllegalArgumentException("채널을 찾을 수 없습니다. channelId: " + channelId); + } + } + @Override public Message createMessage(UUID userId, UUID channelId, String content) { - User user = userService.getUser(userId); Channel channel = channelService.getChannel(channelId); - if (user == null || channel == null) { - throw new IllegalArgumentException("유저나 채널을 찾을수없습니다."); - } + validateUser(user, userId); + validateChannel(channel, channelId); Message message = new Message(userId, channelId, content); data.put(message.getId(), message); diff --git a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java similarity index 88% rename from 1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java rename to src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index 1200c01252..fab3971364 100644 --- a/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -6,7 +6,11 @@ import java.util.*; public class JCFUserService implements UserService { - private final Map data = new HashMap<>(); + private final Map data; + + public JCFUserService() { + this.data = new HashMap<>(); + } @Override public User createUser(String username, String email) { @@ -26,7 +30,7 @@ public List getAllUsers() { } @Override - public User updateUser(UUID id, String username, String email){ + public User updateUser(UUID id, String username, String email) { User user = data.get(id); if(user != null) { user.update(username, email); @@ -40,3 +44,4 @@ public void deleteUser(UUID id) { data.remove(id); } } + From aa7c76ebe02083d0a7565e9c26217230c2cc38db Mon Sep 17 00:00:00 2001 From: Junanaa Date: Sun, 26 Jan 2025 02:32:53 +0900 Subject: [PATCH 4/7] =?UTF-8?q?git=20ignore=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 0 bytes .github/pull-request-template.md | 67 --- .gitignore | 44 -- .gradle/8.10/checksums/checksums.lock | Bin 17 -> 0 bytes .../8.10/dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.bin | Bin 53060 -> 0 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .gradle/8.10/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/8.10/fileHashes/fileHashes.bin | Bin 22247 -> 0 bytes .gradle/8.10/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .../8.10/fileHashes/resourceHashesCache.bin | Bin 20163 -> 0 bytes .gradle/8.10/gc.properties | 0 .../buildOutputCleanup.lock | Bin 17 -> 0 bytes .gradle/buildOutputCleanup/cache.properties | 2 - .gradle/buildOutputCleanup/outputFiles.bin | Bin 19019 -> 0 bytes .gradle/file-system.probe | Bin 8 -> 0 bytes .gradle/vcs-1/gc.properties | 0 .idea/.gitignore | 8 - .idea/compiler.xml | 6 - .idea/gradle.xml | 17 - .idea/material_theme_project_new.xml | 10 - .idea/misc.xml | 10 - .idea/vcs.xml | 8 - README.md | 1 - build.gradle | 33 -- build/.DS_Store | Bin 6148 -> 0 bytes build/classes/.DS_Store | Bin 6148 -> 0 bytes .../mission/discodeit/JavaApplication.class | Bin 4610 -> 0 bytes .../com/sprint/mission/discodeit/Main.class | Bin 5636 -> 0 bytes .../discodeit/entity/AbstractEntity.class | Bin 1012 -> 0 bytes .../mission/discodeit/entity/Channel.class | Bin 826 -> 0 bytes .../mission/discodeit/entity/Message.class | Bin 1128 -> 0 bytes .../mission/discodeit/entity/User.class | Bin 813 -> 0 bytes .../repository/ChannelRepository.class | Bin 472 -> 0 bytes .../repository/MessageRepository.class | Bin 472 -> 0 bytes .../discodeit/repository/UserRepository.class | Bin 457 -> 0 bytes .../file/FileChannelRepository.class | Bin 3429 -> 0 bytes .../file/FileMessageRepository.class | Bin 3404 -> 0 bytes .../repository/file/FileUserRepository.class | Bin 3390 -> 0 bytes .../repository/jcf/JCFChannelRepository.class | Bin 1668 -> 0 bytes .../repository/jcf/JCFMessageRepository.class | Bin 1668 -> 0 bytes .../repository/jcf/JCFUserRepository.class | Bin 1635 -> 0 bytes .../discodeit/service/ChannelService.class | Bin 649 -> 0 bytes .../discodeit/service/MessageService.class | Bin 645 -> 0 bytes .../discodeit/service/UserService.class | Bin 616 -> 0 bytes .../service/basic/BasicChannelService.class | Bin 2032 -> 0 bytes .../service/basic/BasicMessageService.class | Bin 3605 -> 0 bytes .../service/basic/BasicUserService.class | Bin 1970 -> 0 bytes .../service/file/FileChannelService.class | Bin 2035 -> 0 bytes .../service/file/FileMessageService.class | Bin 3600 -> 0 bytes .../service/file/FileUserService.class | Bin 1965 -> 0 bytes .../service/jcf/JCFChannelService.class | Bin 2151 -> 0 bytes .../service/jcf/JCFMessageService.class | Bin 4033 -> 0 bytes .../service/jcf/JCFUserService.class | Bin 2098 -> 0 bytes .../FileMessageRepository.class.uniqueId1 | Bin 3380 -> 0 bytes .../FileUserRepository.class.uniqueId0 | Bin 3335 -> 0 bytes .../compileJava/previous-compilation-data.bin | Bin 1830 -> 0 bytes checkstyle.xml | 442 ------------------ gradle/wrapper/gradle-wrapper.jar | 0 gradle/wrapper/gradle-wrapper.properties | 7 - gradlew | 252 ---------- gradlew.bat | 94 ---- settings.gradle | 2 - src/.DS_Store | Bin 6148 -> 0 bytes src/main/.DS_Store | Bin 6148 -> 0 bytes src/main/java/.DS_Store | Bin 6148 -> 0 bytes src/main/java/com/.DS_Store | Bin 6148 -> 0 bytes src/main/java/com/sprint/.DS_Store | Bin 6148 -> 0 bytes src/main/java/com/sprint/mission/.DS_Store | Bin 6148 -> 0 bytes .../com/sprint/mission/discodeit/.DS_Store | Bin 6148 -> 0 bytes .../mission/discodeit/JavaApplication.java | 62 --- .../com/sprint/mission/discodeit/Main.java | 78 ---- .../discodeit/entity/AbstractEntity.java | 27 -- .../mission/discodeit/entity/Channel.java | 25 - .../mission/discodeit/entity/Message.java | 38 -- .../sprint/mission/discodeit/entity/User.java | 22 - .../repository/ChannelRepository.java | 13 - .../repository/MessageRepository.java | 13 - .../discodeit/repository/UserRepository.java | 13 - .../file/FileChannelRepository.java | 57 --- .../file/FileMessageRepository.java | 56 --- .../repository/file/FileUserRepository.java | 56 --- .../repository/jcf/JCFChannelRepository.java | 30 -- .../repository/jcf/JCFMessageRepository.java | 30 -- .../repository/jcf/JCFUserRepository.java | 30 -- .../discodeit/service/ChannelService.java | 16 - .../discodeit/service/MessageService.java | 14 - .../discodeit/service/UserService.java | 14 - .../service/basic/BasicChannelService.java | 50 -- .../service/basic/BasicMessageService.java | 67 --- .../service/basic/BasicUserService.java | 50 -- .../service/file/FileChannelService.java | 50 -- .../service/file/FileMessageService.java | 68 --- .../service/file/FileUserService.java | 50 -- .../service/jcf/JCFChannelService.java | 49 -- .../service/jcf/JCFMessageService.java | 71 --- .../discodeit/service/jcf/JCFUserService.java | 47 -- 97 files changed, 2099 deletions(-) delete mode 100644 .DS_Store delete mode 100644 .github/pull-request-template.md delete mode 100644 .gitignore delete mode 100644 .gradle/8.10/checksums/checksums.lock delete mode 100644 .gradle/8.10/dependencies-accessors/gc.properties delete mode 100644 .gradle/8.10/executionHistory/executionHistory.bin delete mode 100644 .gradle/8.10/executionHistory/executionHistory.lock delete mode 100644 .gradle/8.10/fileChanges/last-build.bin delete mode 100644 .gradle/8.10/fileHashes/fileHashes.bin delete mode 100644 .gradle/8.10/fileHashes/fileHashes.lock delete mode 100644 .gradle/8.10/fileHashes/resourceHashesCache.bin delete mode 100644 .gradle/8.10/gc.properties delete mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 .gradle/buildOutputCleanup/cache.properties delete mode 100644 .gradle/buildOutputCleanup/outputFiles.bin delete mode 100644 .gradle/file-system.probe delete mode 100644 .gradle/vcs-1/gc.properties delete mode 100644 .idea/.gitignore delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/material_theme_project_new.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml delete mode 100644 README.md delete mode 100644 build.gradle delete mode 100644 build/.DS_Store delete mode 100644 build/classes/.DS_Store delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/JavaApplication.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/Main.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/entity/AbstractEntity.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/entity/Channel.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/entity/Message.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/entity/User.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/ChannelRepository.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/MessageRepository.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/UserRepository.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileChannelRepository.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileMessageRepository.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileUserRepository.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/ChannelService.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/MessageService.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/UserService.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/basic/BasicChannelService.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/basic/BasicMessageService.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/basic/BasicUserService.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/file/FileChannelService.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/file/FileMessageService.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/file/FileUserService.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFChannelService.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFMessageService.class delete mode 100644 build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFUserService.class delete mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/FileMessageRepository.class.uniqueId1 delete mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/FileUserRepository.class.uniqueId0 delete mode 100644 build/tmp/compileJava/previous-compilation-data.bin delete mode 100644 checkstyle.xml delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100644 gradlew delete mode 100644 gradlew.bat delete mode 100644 settings.gradle delete mode 100644 src/.DS_Store delete mode 100644 src/main/.DS_Store delete mode 100644 src/main/java/.DS_Store delete mode 100644 src/main/java/com/.DS_Store delete mode 100644 src/main/java/com/sprint/.DS_Store delete mode 100644 src/main/java/com/sprint/mission/.DS_Store delete mode 100644 src/main/java/com/sprint/mission/discodeit/.DS_Store delete mode 100644 src/main/java/com/sprint/mission/discodeit/JavaApplication.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/Main.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/entity/Channel.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/entity/Message.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/entity/User.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/ChannelService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/MessageService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/UserService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 1465449866b4ff6f7b92b13d7e229b81b8fa604c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMOK%fN5U$DtdoYkmNZ5oGlC{1dh(d^XMQDXFi6BBKA&x>K9%jbVF|ACdt(h@i zh$8vET=)S$Wb=hW;VZbn87%&VN1`GpV9|QEx zmMOi*dtdjO+%RAm_%0cc_d}K*Df5YJXsNCa%2WtIvX7coqO$txPckbTNahpS(2`mx zp;jfSRWS)MFo_&ct5bhI!8f$j>VRry8Yh_rHBBJMFwlNp137YXKkvw0OUC}ZNBa%CGRv!9}%l!GEAmUhT ztU6)n1Qk|zw!+II&?_HM!%}r2WOB&dwGW!cT>f^ma9S5^$ms$=E?<4E%IV=|QzFq? z3Piwi`32oz(cOO*uEQNzhIM!jFX0vZ27kg^_#58Cf0#lWf5NkP0e{A8cnk01B9_rZ zj-ei)r)lIC!WnC+nZM= z*^6FjjCLwgWVRL->RrT1W3;0)ooJfLB{S}F5#pIP!&tBgvt+Ira@kqZ+1S-U?JhC^ z5g9zD4=1OpP)%OBt#x*;638h#=IbSV2<1+cbb{Sb2kro$>2fAZnY6DA^y<+^GbCsC z{{4Sn*I))W3>XFumI3UWDb5sV4b87n-OG`&c9x#U^vEP}4K0-lWhxveslsuRtv?K@ goF%B#$tSX*CACoc@;?Na_y0E$oGI@x*?uwbKOJ*GBLDyZ diff --git a/.github/pull-request-template.md b/.github/pull-request-template.md deleted file mode 100644 index aa4599b4fb..0000000000 --- a/.github/pull-request-template.md +++ /dev/null @@ -1,67 +0,0 @@ -## 요구사항 - -### 기본 - -프로젝트 초기화 - -- [x] IntelliJ를 통해 다음의 조건으로 Java 프로젝트를 생성합니다. -- [x] IntelliJ에서 제공하는 프로젝트 템플릿 중 Java를 선택합니다. -- [x] 프로젝트의 경로는 스프린트 미션 리포지토리의 경로와 같게 설정합니다. -- [x] Create Git Repository 옵션은 체크하지 않습니다. -- [x] Build system은 Gradle을 사용합니다. Gradle DSL은 Groovy를 사용합니다. -- [x] JDK 17을 선택합니다. -- [x] GroupId는 com.sprint.mission로 설정합니다. -- [x] ArtifactId는 수정하지 않습니다. -- [x] .gitignore에 IntelliJ와 관련된 파일이 형상관리 되지 않도록 .idea디렉토리를 추가합니다. - -도메인 모델링 - -- [x] 디스코드 서비스를 활용해보면서 각 도메인 모델에 필요한 정보를 도출하고, Java Class로 구현하세요. - - [x] 패키지명: com.sprint.mission.discodeit.entity - - [x] 도메인 모델 정의 - - [x] 공통 - - [x] id: 객체를 식별하기 위한 id로 UUID 타입으로 선언합니다. - - [x] createdAt, updatedAt: 각각 객체의 생성, 수정 시간을 유닉스 타임스탬프로 나타내기 위한 필드로 Long 타입으로 선언합니다. - - [x] User - - [x] Channel - - [x] Message - - [x] 생성자 - - [x] id는 생성자에서 초기화하세요. - - [x] createdAt는 생성자에서 초기화하세요. - - [x] id, createdAt, updatedAt을 제외한 필드는 생성자의 파라미터를 통해 초기화하세요. - - [x] 메소드 - - [x] 각 필드를 반환하는 Getter 함수를 정의하세요. - - [x] 필드를 수정하는 update 함수를 정의하세요. - -서비스 설계 및 구현 - -- [x] 도메인 모델 별 CRUD(생성, 읽기, 모두 읽기, 수정, 삭제) 기능을 인터페이스로 선언하세요. -- [x] 인터페이스 패키지명: com.sprint.mission.discodeit.service -- [x] 인터페이스 네이밍 규칙: [도메인 모델 이름]Service -- [x] 다음의 조건을 만족하는 서비스 인터페이스의 구현체를 작성하세요. -- [x] 클래스 패키지명: com.sprint.mission.discodeit.service.jcf -- [x] 클래스 네이밍 규칙: JCF[인터페이스 이름] -- [x] Java Collections Framework를 활용하여 데이터를 저장할 수 있는 필드(data)를 final로 선언하고 생성자에서 초기화하세요. -- [x] data 필드를 활용해 생성, 조회, 수정, 삭제하는 메소드를 구현하세요. - -메인 클래스 구현 - -- [x] 메인 메소드가 선언된 JavaApplication 클래스를 선언하고, 도메인 별 서비스 구현체를 테스트해보세요. -- [x] 등록 -- [x] 조회(단건, 다건) -- [x] 수정 -- [x] 수정된 데이터 조회 -- [x] 삭제 -- [x] 조회를 통해 삭제되었는지 확인 - - -## 스크린샷 -[User CRUD Results] -![IMG_4673](https://github.com/user-attachments/assets/046328f8-0b6d-41e0-a32d-6905170aa34f) -[Channel CRUD Results] -![IMG_4675](https://github.com/user-attachments/assets/19751bb9-36c1-4510-887f-c420709dd302) -[Message CRUD Results] -![IMG_4670](https://github.com/user-attachments/assets/17f6c010-a829-4df9-a31e-3e7346dd45c1) -## 멘토에게 -- Message 클래스에 update 메소드를 JCFMessageService클래스에서 content가 UUID 타입으로 받아져서 두번 써서 해결했는데 괜찮은건지 궁금합니다 -- 셀프 코드 리뷰를 통해 질문 이어가겠습니다. \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index aa7f43b323..0000000000 --- a/.gitignore +++ /dev/null @@ -1,44 +0,0 @@ -.idea - -.gradle -build/ -!gradle/wrapper/gradle-wrapper.jar -!**/src/main/**/build/ -!**/src/test/**/build/ - -### IntelliJ IDEA ### -.idea/modules.xml -.idea/jarRepositories.xml -.idea/compiler.xml -.idea/libraries/ -*.iws -*.iml -*.ipr -out/ -!**/src/main/**/out/ -!**/src/test/**/out/ - -### Eclipse ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache -bin/ -!**/src/main/**/bin/ -!**/src/test/**/bin/ - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ - -### VS Code ### -.vscode/ - -### Mac OS ### -.DS_Store \ No newline at end of file diff --git a/.gradle/8.10/checksums/checksums.lock b/.gradle/8.10/checksums/checksums.lock deleted file mode 100644 index 7719b6cd3787567ce1c99ad719e3f4f5588fa436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZSXUhjQyudoLX0~7!NE(HT_ diff --git a/.gradle/8.10/dependencies-accessors/gc.properties b/.gradle/8.10/dependencies-accessors/gc.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/.gradle/8.10/executionHistory/executionHistory.bin b/.gradle/8.10/executionHistory/executionHistory.bin deleted file mode 100644 index f68c9873555ea710281ed9d2cacdaaa55632abc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53060 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 diff --git a/.gradle/8.10/fileHashes/fileHashes.lock b/.gradle/8.10/fileHashes/fileHashes.lock deleted file mode 100644 index 7ff82264cb292ec6184451a320a97b4c87189824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZS1%go#Q|E;$x0|fjB066^xc>n+a diff --git a/.gradle/8.10/fileHashes/resourceHashesCache.bin b/.gradle/8.10/fileHashes/resourceHashesCache.bin deleted file mode 100644 index 71b9e9ff94de06c41e0733efb36f6825f5579533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20163 zcmeI3`!|$n9Kfd)x==2u5UCYiT%slk5sA66(zq3wwN$9lbkT~jm1^Ca&E;$vC8APB zXLLxqqRDMS%_bxjTO_Hhl6Gf%_kExC?7aO2d%kndnD=~q&i9%3!^c~(;>Gd1MI zgYxe~=if`Xf&x$g3P1rU00p1`6o3Ly017|>C;$bZ02F`%Pyh-*0Vn_k{x1dCpKoLm zels)8zQHc0MpGz@)jnTX9r)?l1JxVqV*J;Pqv-pCBqs)St}u9z;13W_?kH_2FRl;7 zIh})e%1C8c(6Q-HaL!tUc$y&bq~-3`w>bCEMLhcxZK1`TpKcR#P9uKmc!8^_#BBx6 z-47yO#Mxi(G@N6Fb6O_i=WKIVSBYM9;GE%!_@$dOmWXNFKHpBL``mioJ7SIiar4|hW~F$$ zHo?V+TO@0@7~8Ouaqj*Sam%z>QP-cidE%V;9C50%&zafp+t%USBk&7<`}AgM=K>+l zX*&?N|J_oJ8!NRZ=C4BBIeuO@O_=XU%+E*MJ-6(j`)JoroHMo~?zOMiC-uXrv&4Ka z#C;8h%9Pf61Q2r^5D#$RR!n#GC;rcA4-wy(D7_WzuzUgTyVoK9eeVa}(u>OHiFHR2 z-~pICPc@#x67Z4sAbk8sZ7A|4y=s!nBEC;$bZ02F`%Pyh-*0Vn_kpa2wr0#E=7;02a^e$oB>)Wn_|-`$d? zo^W9|UwCK`^=+6Qw!_=-zeek{ovSRW;;+ySG{^LRlaK8&S1>+CNGiMLRC2EL{X8-; zyw#U%&?>JxH=WBGw^>Mepvyc=B^wLnLAK5J_u5*s3rg>OO!gofzigAdEl@cZm-JV$ zZe4&iwkKKPeejri&-QqvlpkzZSF}dA*@bM3l(#*;Y`jlitSzeM(p_GXjgIUNn` zsnnj}_klTky2(bA)NEp@sIdLfqAFhWm^QXYT;Y8DCW9$sm!W9K!>ugLk6Z1_49 zsf*Mv*q=}J^sqnoL`pX9i{G^DQn!xo3a!)h^I3)MoK{%nY-)mkeRz;WY5E>gPuF}!2d1i|3M^{)y*6Dk|#&B_hZpSNg zt%T!kWaGNbRQX7!XNBACm>GA6mM4*o#Kw%AlMSqDUeE43#fMH|r$H1}@jD_fac;ih zlazNN$UB%HL^fi4{4G@IgWhi{Rx&+}H=B};mOQ&fF}<2bYC2wXOZ`J;k&R=%Mb1X7 z$kebk!}XH(bP?HzsvnTsnYhp_m4DpeH}LCM{w^6)xOcj}H($J`wAJNlBp2IBuW&C~ zL(4)8=J)x(xXSO?RF;LEl~FLVjKe2~)Z`_EiuAl*_Hj;=jqBnq8ln9Kqg;k^a;9G$ zc1}ZKMk}?Ky8epK4w_T6k;7bZ8QJjcvZ3dvXlxh76#tXJdRHBzd z?t~skPSWD+d1RwPKXh0i>1QpqFY*6i)z(Kg(r9L8uZQ^OJLI-WV?j08ISYk%n*KpK z^HzI(@y~*_YV!DM>;#d5VK*|DtF(N0ao=pV+AEoG9N8Fc=DKAXxca%MYiT!8OR&=u z3Nv=|Vh6+JB3|N+t_2YldGTbUwM?~6NKG)=x@kgd1$zKH(V{S8*xiepsV6u diff --git a/.gradle/8.10/gc.properties b/.gradle/8.10/gc.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 241933a931aaac0340db705108507e6f933a4f45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZSPF`Ibin%t)E3=mKN05RPJumAu6 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 32cebd6ffc..0000000000 --- a/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Thu Jan 09 09:15:31 KST 2025 -gradle.version=8.10 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index 075e1a9802f569dd553367c2a4ef22f5acc02cc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19019 zcmeI&T}V@L7{~GBqHJYOqQ#<=C}QDe*vo|>qm)cHQ#WK0U6dm$&7h{mKol>^nji{7 zibd8SUqO69L|P<53kDlBBzn~Y>IxlQ3{>hu?X2@WlWxT>s^5Waf4=8`9{7K5cTNd{ zCSipxVf9k4F0q0D1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<;9n82N(b2@A4a2B zL>4NCAf(1gi^MxAn#{W&KHZdW8x8#bf$Ol+Ir+V&SnfFi?(MHy!6b6I#Bwr)1(f^$pyA*pA(JxYIXJ zUCn*DZriu_**&7%a|*dDyIzjFQfq0yv75X4z{2j}W5o&DKh0e;)mZb_B~4 z{#EZ=n!mvPl6A`B81TKKKFa-?IcxOX?3Z+!QxNTodA5#QbN#fxj(b^O+D7~B{a@v7 z(sH-Yx&tFKZChzhEcbG4$z+vERZd;Uy*gmtTOU*EqweR-E&S&iM%tQjo;} diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe deleted file mode 100644 index e233566ec868d9d5d57c3b457b8a71d15e850edc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmZQzV4O1d(qmo#39kb6 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b81b0..0000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index b589d56e9f..0000000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 2a65317ef8..0000000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml deleted file mode 100644 index 12ea55508f..0000000000 --- a/.idea/material_theme_project_new.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index fe0b0daba3..0000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index b1dbd2fa73..0000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 81a8535d90..0000000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# Spring 백엔드 트랙 1기 스프린트 미션 제출 리포지토리 \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 6e970f5400..0000000000 --- a/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ -plugins { - id 'java' - id 'checkstyle' -} - -group = 'com.sprint.mission' -version = '1.0-SNAPSHOT' - -repositories { - mavenCentral() -} - -dependencies { - testImplementation platform('org.junit:junit-bom:5.10.0') - testImplementation 'org.junit.jupiter:junit-jupiter' -} - - -checkstyle { - toolVersion = '10.12.4' // 최신 안정 버전으로 업데이트 - configFile = rootProject.file('checkstyle.xml') - ignoreFailures = false -} - -test { - useJUnitPlatform() -} -tasks.withType(Checkstyle) { - reports { - html.required = true // HTML 보고서 생성 - xml.required = false // XML 보고서는 비활성화 - } -} diff --git a/build/.DS_Store b/build/.DS_Store deleted file mode 100644 index add8f6cd0ce673c7f417941061b92b3dd4b17f16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK&u`N(6n<_CX*41A01_OKEbUs2QZYouC6sa4b)CimP)U{wBC@z@QuR<(%6jU1yrMjmU2 zsDUXL3Ur~$Uon&mN4fUA$Ybr$g_H7^59M1{{)VD#>-fI5bW)K+NksusU|WHvd+qT4 z|L))S|Lq`o69q(p|4ISXIvJe|F(kjY?hKCiS`GgUXJcONa1(-z-HO5Gt@ttA8p<_i WfRV@AAxdC!5U?^xA`0B80>1$RBx{iX diff --git a/build/classes/.DS_Store b/build/classes/.DS_Store deleted file mode 100644 index e3c63e94ee443001e645238790169e8e3f308eb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5Z-O8X(&Pt3VK`cTC@f$7B8{ZgI6nhP^pP27>(J|r1nq>x$6u0BEF8! z>~0ISiZ>BE1GC@E&di4WHtY{$j5i124r2~utPF}+u%Y=vFpfGW1=EAbag38#-UhJ@ zz{dee{yqb^b|rSteD=irPwRIGv8{I{Y9iCTV3_vII==?JI7+ix?Tr_TrKM%dvaO1B z-M*8v`tZo?gq?ef~@_Q7fAA%0Bcv*w<|kEvwE-~?VK z1|cy(3=jj0$AH-y%az5OI?b3EAO?P50QUz0is%{4HL9%x8oWMYyo87Xwz~QQ3gdeQ zbBz!I;kp!1mvZyO;O6DPbveX6lb>tU<&3K@!#L*4+`Le@d3bQ4(i!(OQcDaF1G5Yi zwd>&dfBgOXf3}D`Vt^R97(li^h8?@dpMNzy9 zig%sSar`DaQZO_A0Dp>&f5GuN*=@VI%n}$UGn=z#&-=X3dpqYnfBpN%p8$5?dlfBM zqadWA6>S3Rj_61AcvjC%$M;PfF*1%o+jcW&I`;^y>FzlcMp&TrS<9N74@2ep%JANd zHEEd6V8)t@KtqRuP7Q0ZPT*!v#qE5-%sKHn)3!}37oRk3cYWM83P;V15g+4V)Ex_` znS!A^hMW`F-<@7%H0ls%I$1x{lMYm4q&1~K=(YkO1ajAOHC6` zMY0_O7*r6~a5HYHs*KTj+cD-?5LS`(ak;C=wBq|^nlniaeU1*iRXXstCLQQ0jj|~3 z&~PX2Vq(tevqs9wWpwAT>CA9sJ9^Hs1-91N?!~WCw_cT~NFb?TyT&SK@ouP;Q8h^c zrBa#M9Ia@OnLURT+$*pnFaruk-m*={D$K`^WTxVKQp2)x53J0p*eN%dlmK^$fW4p| z$4e?d)R2T4zIZ6ly?&?%B-Cz!WFV{M!k*A=GZP<@Pv2&xViz8gJ7=0W-NBoX&%SC0 zC8eA93fyzCL_Gg^C8A;k`z4o$3DrE8Iwx1?j9vmA&&Mlt4q!~uIVA97^K|M0l??Xk za(sM2X;Pxvdljo65!e|R1YZoN%&ZX~=A$~8Dh|uMdQ4#GqLJ!Cq2f^q_T;62)j3kd z6Ii1{$Ap56hDjI#{ec|!uobv3pU;}yfp~5UwA+SL%u9m>p1eRz8wKVfj%i7BTEh%X z0j;9e^Nzq|lbUM-9Gpnr!RQHb`_?h5Aq#Hv>*w6FC{^i84jMK${STTXQC$=lNX;4! zO%aySVDbutQtZJ5)~3yzv9~xkVH6JP6Isqg(^f{$9?}b@eD@|p&Wy>EWH4AqO$HbqzD9*=J2N$n)$PI3%bII)fCrujBrp(+P!kJM@UmdV z_$DdTWB{8_z39wX^nl_aHp|6BqB}x!y2*On*!@_8CP(IiUYKTdH#GR{g>X-1N*;y+ zcLlq_x8uo7lQQmM?+eNb)&rGKK^bxU8md24(Zb7IMh49NQ`A`4NLDFln!C!$}pV@Tr2& zWY>3^y`5a@Uck)UQES$SyZxNo2oCER*=Y%!_P1-^LKk$Go}0`X_SUpz%@*?wE=#_Y zsS-RmpEnvT_ves%B~1FeO%EcaXS1WGWAJ|U1ru-S=ac0VU-637Res~^^1_)!m*76W zn|Gr^Dy!SJVJrAr;D$P58`+@XTY=5NOIcQ~!Pvr`yM=8u*n9AbgEl^Me2ep6$l2aS zh%+3tz~WPW2CsT~J~ej%o;_g-RJ82kr*ISS4(S@xQRlP0|NfB@9^n6jdrR0g z-nWQ7iBJh6%vTE-TnFHO7L=Q*3j9EXe zAK-J4_oZ8q!ZxINbsM9np2i)RWmP`UFRvkq-Z+ zhW99|lF3bYpRy6+Zo&tQjYd}ME1A_nO==}dGM*ojQ45)VTwx~g33+{vFZrf&^cB9r HcZmH5>P3@0 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/Main.class b/build/classes/java/main/com/sprint/mission/discodeit/Main.class deleted file mode 100644 index 38739fc5ec80b82733bce133513ecfda1e6c5721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5636 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 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/entity/AbstractEntity.class b/build/classes/java/main/com/sprint/mission/discodeit/entity/AbstractEntity.class deleted file mode 100644 index da051eec3cc742cc25d2a55ee34a5b873458b3ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1012 zcmb7DT~8B16g|^!yL7vy&{70Hs0eCXl~v-4K}`s10;%!_5W+I0?!_tL)XRE{ZNC?IqomSkwxK(IcX>oeiv@ zreoE_Ev!uqa&i?(?lCMoaTrq1Q{nNC!gWQI%yeYnHty)SYvLX@Ze~g(Xa|0uLBF)! zm>+*;s5Xwq6Q#$=ME6Z>;sL{g6LMSfeNt`AZ@O;V#KWX69`wd_+5yeVP;LvKe~P^> z4^Qo`OFNZz;Mne&9SW6?H#PZ1v3}Y9f8F*Na(yljNxLG&gOq9N(m$@Fl1@spJmRZ_ zi=^!h$mf$F4jukMD5}+Ihjx_b+9o-jp*NN#U&w3vT2UfV)RYJmb0A8{)B1?AbE;$% zH(EcyTG!BrC{d_hV||EvtMwiAA-29zMFx*)T_r3~pl$}e#Ug4@{*}<6U31h4O|&Ru zc#`a>TP(`dEjj8}`br<8W{Lz*o&e`k@KZda(^+tR7F?MN-kA&Dng!S9fHfj}BhIU_ bIK@l1B?=>X4@F<<-zft$jj diff --git a/build/classes/java/main/com/sprint/mission/discodeit/entity/Channel.class b/build/classes/java/main/com/sprint/mission/discodeit/entity/Channel.class deleted file mode 100644 index 09bbc324141807ede322be59a94a2cbc267c5256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmb7BO;6iE5PfT$xN)3>rU6>$=c$P)wZxSc2|;^`a!C}a$BnZJTiNT#-c;(pY9(kT z4*URq6k>K0fkbi$T50EFcizl61+5O3X@hIVH67@9=GdVJ_^#BcnSsjZa&gE3obUx*u2WXn%8?)({YcY_iC^S!} z3?JLeNXwbdkUF0dMS|!`C3>@TB=P|tC3co9=E;!f(!`6TtIuV@aL|1MyCVi~B6QC( zY_&Vfb1>BD!`TBll6Fps!S83YJQm-jnJHKZ_SwjU4mLXnnf-=M^86CJIwzL>jQiAy;Xk>ayC!}IQDx$JnIu{UNYoRKd?IF!D4znD!# zc*!Ro-86@R!@V&NrH<3fg1V9s!|Ct_mh?&ORH#vEOS9YC?2N&rgtL_+42BL@R}mzk zJ@O{eyk5Dn3Es&BAK-BcKBqplBtx6ku)d-F&!!ql1a(^^D=H*a+tW$1|Jq~3R%q!5 i8AG@}fa~nZ5cY_D9|oc8)Kd$Gah015;gI^u;ph)5?Zwgn diff --git a/build/classes/java/main/com/sprint/mission/discodeit/entity/User.class b/build/classes/java/main/com/sprint/mission/discodeit/entity/User.class deleted file mode 100644 index a63986adece722c0e5aee8cb7cce9045ae63a7e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcma)3%T59@6g?ez$T)%`zTYchG*03cH8BQP#0^N|vJ4H@Ff(MPnD|$kh$b%l06)rj zTZju`L7MbF+I#Lj=YIcuegU|^z6}d=S)?4KkzqLVqrgl0u?&?L$Rv?b=yhb`M;#%R zCqgCFvv<`_RLp%^yyPg z^CCeCn1BlS2r4RNZ4!68w%Xn__TlG%8q4A~S&9<0z^qUc_4mu$iP0CSIr z$hs#(EWVn8Rl18*0MP#R*68G6V~sKgqcW^xgCYVjZJ6EL6Pm|3`aMv)|`vu&V BmY@It diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/ChannelRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/ChannelRepository.class deleted file mode 100644 index a8d5fce2ea64cf079c236f0f5fab7829a82df0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcmb7>&q~8U5XQf)F=^|+s^Bvu7uTyqEmaW;0l`x5Frx7{=*M(h3x2(u`xgh7r8d;JnY^li0N-eD;Z>zO@_{fb> z`emy`2m}W6e3eU`o0)umo2$YL1TJ4GfvY(C7p;sZzs07>t3daiOnJW^mjc5$Ysj@H zEvM7*W18%Q6Nomjk=6odaq-Acni5QWdwn6&k;D)s&dm4E=NEumoJQyouJdXk+_Kizi-mShS5_3-3TFIriz{T7=hZ-oAbw#CDGQV{OrtR**I z8!?+r9@Ate93k4k#>NoN;^Yr3)6S=a!Bm%4`ljYp$DM|oorc{pFD#T%o?++R&Dq*; zS~Yd9p0weXi_R@CH)cZuVUK?U1bo_kgq*Mu^xHVVkn0Cr?ctF1BOG&1IBAv9FUqru Avj6}9 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/UserRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/UserRepository.class deleted file mode 100644 index 9e943c65b76574f0392a43cf3e3a1334b1fe0398..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcma)(%}T>S5Xb*pW75{IsxOfobZ=f#3l zke=p~-^_pJ=g4STkthiyF7GS6rC zX|g{{AZkf>buDlaC%;G;IiCs)=Csg-Z!9l4*=ZQ>KWW0Suu`@1OuF3NnMDofrm>}Z vpt^1Od%x>eV<;eSz|Q~zKIb7qc31-XogHAv^&_tKaLoA=oU$)))@4Rt-du#{ diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileChannelRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileChannelRepository.class deleted file mode 100644 index 4c0e61d2e56f3eee60f8806704d52e782ccd55e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3429 zcmbtWSyL2O6#nk8Gz`ry?hEeBfDA5C%(wzBBnU=ylYB7=X~ef)Az4`|M(NY zeta8507V*#b(Ek~pyr}6YDAJoYB17w{-POo1xoi>Da$<|P}CHPm7z>Pj}IBCl$mr| z9Wz~yASyKIIx0~m&=I$XBhE(u9b|O zFh-)%y(KytuvDNpVYr4s^&FKTmScs6l{!{owLtTt5tu30a>pW`(*h-frrVvMp9PlB zoaye0R$wjGX=v239vcKIRUkRXNasj~?6x=g0?bk#oxkHn<;#m=VUv!{GHXG{7&TAZ zk^^aUtBxjwXo0>7Y+1m<0(csl1?p#gJe*D&V?CDRO2lnCS`lF_j2g*|=?E+@2)ENt zCRr=YHQfqhyDX+10xLYrDrTQfC?+v?>3B(cS(-M7?NL+19)Xq0zGZvG*Ozfg64P!P z!y5L|Y)&pi^-F_jM^u{KC(z&z*sGaPEQsAWAT$ zSv|}BF6U3s9}T@ZG&~Q;hOVycr7PVX0;-Uwl?3|tK-?DRBDYG{-eBMl-mL)CQvmG~*F(Yls zwYOR94q5CGU5lIXg?E7^vGBJ*+Lq0YwcNBg+#Ih%F#*l{P6=##p|k1(luC4r$;N)r z-^3Jqp%(-TScIvWn*+Lc!Ad0#CzEqO9#Z{%+u*8g;$d-v;mDirv3V3E+UMf4myxT+# z&zib&`Fk4Ga68uu3nc<43#g(y|G(mc{dOiDH>Hd0vvQhu2U}%h;I~~qp#+i~>*O1V z|5JQh1)%ZAcL&$DT90stUkQ|Qe2+Wb>KsrXo`eY3X^&7I4o{%^5$YeR18I(RDCStn zQ9gUBxUPo79i1RN3Ktp90;9O>!Jb4Bfq^CA-%;N@fo08)v8D)T3B7R^w~AWwd^MJE zY*3g>v*$caBH#+fh$`?tKJd^xs3Xy<6#8Rq3E(M~Kj2OP(q9=Iu)>E|mB*{Xhxkb0 zeT+}2FG+~f4|$??3gH2X`4}w%lW3a@xz-nUtp}Oq^(p~A#b+EPV2|fujpyLbz`~(# zLJB`WXQFosF4qX^~7)D476b-1kQZ~;6k?3|oQnDNNxad+7~g)1wKCT8Ef3Um zANi0OuQ@P@!3WvEFRH*9m5h5GEjE(-t(<{1h#=0rh??cPojhdcA+;~pQr?askDo0l zr$!smwi9m$&uphg8+CRl9^1*qUcN5nMF}%!wR~<~$5&*gjXqq%4gTA!*t)6M>hiI* o2PMx57EtWO=CH;0n8((09wd`NImC}^xaD2)uetvX%?5DiKg#2Ig#Z8m diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileMessageRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileMessageRepository.class deleted file mode 100644 index 44a5f4c6350275cfd09a993ef18ca9095e08ffe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3404 zcmbtWNpllN6#iPq9$Ow8FYKGeZpj9jC14`LVjF`KF9d_Y*#~K`2PBQ785x|FB#;o6 zgj6L}TvEAEMGiSYRj`Y=DsavZ$;IXe)${A z1n?Su2qJ(o4NG*Cqe7tWqA_MfQ$}VuI&l7?nQ#Rv4q6$@JtR=p9FA9_Qb13ej$;g) z&Q8b7Rw0OL4Z4mR)CzPY>~z!_%~}~ZnzkIrvNO@7W|>IE%OK5V)@Nyb^? z`OKM~u2?lTph-hW$3|=ts8K`;flZpzmbP7~o&RVWn zI0hxCUZV2$$8>bdER-iwwnH8#3OcHEogT^BmyPo&Gl=7OUB?^fWi1%VQ?tn4uEX9OaC*PdFw0xS*YEVV17Ag@7B#+RWXx-2Zq4EYv=I0qI-9PdcK@6J+| zv}Q3>3gUQQ#|Pk14Knk|LI#!Y?ER+k-Mu<#@ty zM%W*MFlGC*1VU;}L3gGM$C-yviAw^}nMc>Auic&b`C4dt;>PqZzs=mcKYjDZ={pZY zGq>(Pzy0g;pYF}vyE=38@${`5)3@$xNDCZTw4?ZX;sUL(rqj+iu90!$^5h9r4O+t) z!_8&+zrVDR9rV4b2GqN#-_lMNI}~Gs>|~pk4bsY({kimcGkaQAuI$2g!bru9tR>&Q z$tCWH#a7U@xEmk63oMC+TfX!yD^#GZd2zToQHSFKnpf5WJ6>w9`p#sM9pkcpANKbu zrC#_Y!2%Xx>gMKv;a#vY$)l;%+;4>Jt>k^QP}Qm|<>bMaaxC*!ku+1LOZ6J(v!Fm_ zw#_`P%ZIjLb0vo0_T@zrU#H<(&7f-}F7dc{nJ=?t;@1|f=d}XvX)3PDPB8B@(Zchl zj$HAa#x&e1biC3Pfs-XtF`WNj@xehmmra;5M7C4;n0E$u%ErJ?xV$L|q&POns}BEX zc!df;0piV$NQa!36XB101M30egv(KZ)ygO7H-2btIPDgnO0mmDQvuNPpQ7vP@2!qhjT z8e2$zt1r~LVyJaqr~!G8@{s>#?qo8KOkv;96xxRxv`M@=iPw5tq^}7aq1s&!(AbxM zR`s{;m_SeK(+6yvQy3U(c(Y{^gHIokay=yq@w>l~_|1F*ZPFIsRIJ5cHq zDU+``G>PGddEyrpak7%Uo9Hn_?YHv@tVa|H&PCNzzPD3{{BuOj%XhinjuB6vZK$F} z8_{+VZ#VbsqD32Rb}Jp*sl@?aBIQAeFlY6=Ro=k2RHltFT*poRJD}9MrPS*3skI;F mF9;S;>cr=$#cP+R)(dW=l0i8nPH4F89rEuu|2^FXaQ8oHcVgK9 diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileUserRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/file/FileUserRepository.class deleted file mode 100644 index 889d1916523d4acc8f25e94d9677e82807dc3b1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3390 zcmbtWSyL2O7(I7b8ixj1+&6HEG6OQWL@|R4;6?;7qN8MQW?E<+rpa^;O&7?&(n zNtF+�M?&kO!@bP=-|WIX@&X;19@4%(-`Zh900OQ+b$s=Wgda-}%1#_5Jgo-~Irw z7vBaEK#_)G9VI9gs5)!qR_R!cH3AI_(l=AC<&H%pV}X)E)9p%-WP#b!r@IbD z%drl18tQed#|D84U6hIo? zqN4#JS|B%p>582TwzzK$V(MB5u{uj0jU;)JSGbM_@&PyPbA2$rNFf zNh^$PGKaPctn@4^pM85mF^RcT$BU9>Y1$mNM@I3!M5Wm_fu(+jy@UzHg4l(9a>xD|V$zV$L^QjrT}KBx17mP%rFEcWdHXX-g_N?$z z&YvJ34aak6B-_<{=u+GqkwR-Yk&{cAIhkQr4x9P)GMp4>nf~GS^zF-2cYm*EH~r(? zr{CY2y7t}F&HMG!*Y7;N@iWKMw=Pd#dpLFd>eTf+%|Z0yloaW-K-ka8lhK!%g)Gld z)Ld+`;&i2aq3ah|o?Dio^DPE(7R;I$UYB;?n9)M|JAn6eyN0`+Q5L3bt%$C-mr zh6@6b8L6knuTK5+%k-@~3rVeESYX$Jb;egFXIICHPCMneM#_!J`^ZAvXAPzdHOOCzCVt2@5 zb!cDMhR?BcOon;tzcegsn!whEg|Ym6LoptcpCl&l^Pf`RnpC1=OqTIBf5}pEh5idt zz#>M~Y{dn%b5<(Ro=ndEPRRO7U-#t_SY@D`Y``wnNi)H$FwJOL4|(H>$^I6RKU4^jI-9Z0jSK`~pMt$e6da9jyT z%?P%&aFJmzFp7&F>LrPE4fReFD6DUmMF|+*>fHy z5pW4(L=|`!?|JAQ+#}H|75XD=4&Vt^+~-UHlCN|Qd@o6kS-i?TUM1eg2MX^)e8l}y zgeZB)6V;Ol_e;!2XcCw}%WTNCKDVnq$gHlH3GgvKVJiWc^KeTdFBSp3es-5u?v%mCvtE;I(f0_~sL=lfDi#-B;Z``zdMk!JeKzwlfHT!p zWhJ)pOpAxGjsLcD=ML0TT!)4F#z@C7hN7v_>VS^QX`>NTY$Z6V>m+LCR? znJoLfKWf>zrEvuri64OWa_;Xu=RD`$-+zAm1h9(DC;|vd2+0^im?3_uwp2w|jbr8g z;i*=27{YmOaA%Dnm`Yb93^OF$pr*rhWm~mR-l>f!Bm^TEfh=KEMhs&N8&$Ke*bR#t zj#B5g%}qn8al2~PH0~&t)-Y}Em{waktsW_FOIxKA)i5;u!{r|gp_=Nb3}fYg2`O1F ziUg7p#%0{VO@{2iM4I7nr>%H&hM{B4*{LxkQ)wS|e}88)H-bq_Ntl*#3%40YyRuUK zjV85YCDqyH>rw9NipTZ`3Hq#zJGe_I62Y+02i0ezgn5SXe_{%jrMAo5b_DUhj0bo~ zF11v>so4xuU3HaAT_+c*_tdpHJQ6mi7^c0TGO|Kt*wX4|OOvq3@OogA zeQx%#F|x;x4b^E{8pE!y>EvbJ_v(639+;=w%-mXzW~4*|C1!*h+HSLcs97J?L!DNV zWwWa471iS6-CGPfC!Cs89Gu2i&i{r}WVY27| zVp|OGy5B>$cj;@w0-P}MUI$2?NK(-C-a{g0j_NLSO_*5BUn{Y2EnL%d&7tm%U#)@~ z6x}nMR#n^L!pP}wh-SYdo;}Az z5TANkqogP1vL-t59*cJ36;_Bw=L&B;YLQ|DHRe*!F%!TqBtFwh079Rr1XQKa*5So2 zc`@XWcX_K+X~3;G=T)4zz}$ggp5q?F85VkxlfH5j9%^S&;S4c diff --git a/build/classes/java/main/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.class b/build/classes/java/main/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.class deleted file mode 100644 index e5e8a2ae9555ef59c495bdfde70e7370d41f2896..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1668 zcmb7^Yflcb?x02ya2{%gEpy^#*ZtkIA&qV?n1)9YLm9c znl$~~AJz2Cve5-8i64O7;mmX1bKW!a=kL#709LUXh7W!T0U1LGGDJ_+ma6D#y{ddT zI@QWHLomzh++JhwCz2%z!wfMesA+Ru*;cKSU9}O01b+x4kR^=Dh+vFiqioa^t6}oG zt<<<>aigwOxK%bP8n+cwYZw-{4YRGBmXDS9g{@u9vec^f@$wIbKt;7xhOy#RLQ0ki zBZjzyaT&L8n;|_gkyf|4-Bw&W!%$VTcPb3=MACyjIM~_Dj9?N|5~gL`!Ci*YuB=pl zqe<;pNp!Y(dX%}o;*ON!p1L-NC&K0g!?c^(@z4{KED2^xMp~#0np(|hX%ZG0-VSWC z$IU)AhW2^2uG&pgW7zXFoxIF?UL6mL1M_s7nOV!wj1*{~#EkH|w%4p3Y33*ONT-!} z(I~5WNj156cNYWp38yCI2dD9r^S|K~nJu+Nd6pA{VLh6YB?hV1nRSN68|`HnKIZjG zzAXlL-Rq&#yW|aFK2DfuuLC4cB+2P|?;#O0M|J1ACQK}5ZfdZuUA10 z3hx_Dv#f1#VdQkb%V9~J2h7uz;{(G}`ozVxL%&OOvH76TpwnSTkiM5`Wet9M0-~ui zu+#;l!!v}wBmC8gen#KoCIp5NKnTz2N$$ks1zyq{!z;XYS=+=CvC-5wgwsC|O`l`J zkI%iVQPLA}SQDLimqk1A1}j9PbA@*+m9% zya+PLI=oe?)aO*3aVw5pVD3;b&+&la3=6%;Nl&>k7ujjzIw3cZa|Ld?0%ccV(s#Y& U88T$nBT>GTC|^pi(89tV+z$IO~wB3^ZSDL5< zNsOQUqm1Wv%_tjL@WZ2rC#sgduUPH8s`H%tQ6V z{;^(h86tUZa<{+`N@vP41{soGP{ZYhx}`Zs@3eXhGD1-dL6I@6AdV4+m5NnUox06U zSFLf!;g+dZxl^&KI(JoDuUigxExV;2R}R!S#m!wuw?B4P8NyY~)fh%f=h-MzE`}sh zGDa0#!*zyq-z>W6a<`=lG{eB5?rv8ZQt3>9xx2f)ksHD|CS*)1xPhAt!xvIg<@E+N zVmaO37U)i{cg1H1g9LqA!7bb-6p3J%y99N~Mj5jVqvvAQY+GxUxZ?`qT?O}WpZsZR zMniWPCN9)fvFH#kap0c8@rS5dOB>##U2n^AgR)J$Q^i6h#mM9zwmx%@DV2Hzm6%_-Y<}03S-+rco;a zA*W@(8NQ#H`S^T$2XKYJLyzG?6f17lrPP+Mq%pG4Jd;Kg8A;0xl^ZFD-@c?;lS+19 z4~GnsWx7eZN_Ea3pO+*ogD*--Ej7&y$t?bDO03h!qc#%8|5_kzrG5Q&5HXB$vOf|x zjYMUo;)}(@UDTCs?C9o7HH?N~ItzCuYtC32>qLi%%ynw3k{IT#hRaS7t{tCWt+V}6 ziB^vGpxQ{+tbRs{_7)VhRKq7X;H0QZLHAO*u)*KepKljBU|=|KM+EfUCG;`C_98qS c)$b4^S3h>u9!?zYV_f5>m^h5#tgcMI0AP;CfB*mh diff --git a/build/classes/java/main/com/sprint/mission/discodeit/service/MessageService.class b/build/classes/java/main/com/sprint/mission/discodeit/service/MessageService.class deleted file mode 100644 index e93a79113ce69d1f7c308c6604a5e63fd5afa52f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 645 zcmbtS%}T>S5dOB>##U2n^AgR)J$Q^i6hsgrBB9>b%@DS1lak#Od^Ha~fDcvNrd1*l zp?DhRhwo=*KGtvV0Im>t=rCN!V!_R_RJr8~WsE9vo+=}Yl$7O$%9WDDAIKPyQL;@v z95RgNVkNj1dBz`K<|HkHFG~`ZcEb!}64yhORhrLc_qWmSc@2_Sry+~N_)kHUTV-Fr z^h6AUjO;hzO^a|}xS@laYP~}=4C6`I5FIOH9ce#NSuSi<62r7LaJiR-Ylr7o%e1+; zrl=9oPOh6DFNK-Yai7d>pg!NXA< a`xvHnn6}Is=RU+g=ix-)!^m!#q0P z-LtsJUi(+7FuH8zr4a(S7oTQltEB}^~tu2}~DGZ6QO1yNPTX!RMBHO9d z@4|-|5-=4cUh;y^gb>f!Zn8CCsG?l%es}l$e$R8yUHl;H@pgTav(4F+BbgTmD9r&>dyj|VyJ@>;<_Pg1PfE~%^*np;^3RR>pbO`uQgu?S_N*v~07ZVb4#b-h0czZEP^qlYN%#nIdV1bKhoqQc7obRf`&`(AY%iEc<)AogGXlp$)&y5QSrhGPiai=2} zyBy5gP5j`yFa2Tek4k3qaTRuVFp2{CNNGo{{liOlM;{Ds@bxsn_lDnP{etoho@IXq zHMVt*9&z5_uU&ryQE&VN>j#buG}tbn#I^#Hy?HERlcUvaHJZ4?5%;C2f@mJ@=9tg8 z!_;ekMdjPZ<|`~dss9M8d5UEN&6k{c9e;%wm-)Gp;@7jCWBgTofDehQGv8y+;A#h3 z_=vR$e2i;(&Ig>)Jjyy#;}mNKCW$m<@Clm`D324A@d-ZVJYQF=6GDr!m5#M21Utob zF@?3BVmT?UonzhSP6I8*w)sbw$@@LaoMGIZly%>%n!jVMYHl`v#=AORHB)7(=1ZY# zE~VmMlD diff --git a/build/classes/java/main/com/sprint/mission/discodeit/service/basic/BasicMessageService.class b/build/classes/java/main/com/sprint/mission/discodeit/service/basic/BasicMessageService.class deleted file mode 100644 index 0e956e5be0e06e976170a9b18ed67d5b746f1e25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3605 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 U1ohelCv0-Yy-B=5KMgm30Pn}#rvLx| diff --git a/build/classes/java/main/com/sprint/mission/discodeit/service/file/FileChannelService.class b/build/classes/java/main/com/sprint/mission/discodeit/service/file/FileChannelService.class deleted file mode 100644 index 0975a639fe8de543b49ed44f496f4c8a71645219..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2035 zcmb7FTTj$L6#k}LDRc|0fXI5q8|($F_uC@KB_<}TCa#k3Sh@p_mhPsVCE>sLBQ#M7 zn)v90zsVTSv}Jd-v5^Oc&Y3yiIp;gyoc;0Z%QpZIv1UR;&VX*=7zP*$Z=7An_8foP ze!lsJyOLpGLHI&0GUQ6-bpwM8D{gDY4%>n7rM)A>|U{|<2h1rPh3}!DdL#>_(*1Kw_ zQmYv_&QQ(t=e`tj@6gvo0pp6m35MBHy+>g~5=Yy$w57bB$0SY~n6gmBDTe!*;j+?Y z&_idJGh8cW*ZgPBwK#<{7S7@v!{C}VtuP$vlnzAWs zLptu;r%pRj$8fCCZWd;v)d^g#Mjpe-zR8ye;i~EjJ&im~U4{z%jj7p3qj-S6X#&$a zN4pi|=nE)R_Q5J&VQlPU=o8EjWYaKD>j>RYt4`jd^pLL7&We3t;~MQ4uH#06w?+4K zvQ2(PVWT>?kFjT!k1*#CaDw38(@8(-1WcU31ieLtT8TXqRKmbb+=?Pi;x>J0blbum z+>LU+hjU5HB|6c_Kd&NH4{%yTFOVt}I2{F;jIVVA(wAHUhgW}m4kE2 zfl5)3LvG=aRB;G*sER`wQskCY<*!(W{D35tp53)%AzLV1R0G44ZB%^GaG*jAHuo^lh%%48bAI(ClFbe>67Pg-&!y2+8P%%rK;y zb7`wo)(ks6r&*R}8tH;&sb+y|cG}|Qc}?Z%Tbj<(=jk!dElVl#ygSbjD)W+QX|`Ej zV94ZJg4LI%J(#OC2Qm>FJ4yv9p<2Yfjv-HG3f~ ztcl3m*d<}Nj6H}j9Bqq8V=z=U;^NIQoPI+(9zaGyKSO_Ac4NBEi;6x{E>`A<`MEnP zFWIE4FzI!ljQu#k&^xEh@~mm7ihW(PXJ};EieXy}`_^Dn$IjcN)M6%ty@(3I#~8MG z29D&t@3F}+2uebdA<;5JUTQr-hLFG^ftzMH-bCcps=4ote!KB5jz~Bv;~0)J477CK zYDX{xEM=aP)S_*P!;2sjn-mmI$T*1shR$1>Q5anqE4+D`SAYdNYhZ=oI_GqTVS`%cR0uC=3`$e-SC!E@lh#moYZ8rHiF^jdIWDBP=~ZloF4a9> z#b-%14V$b*3YxY$B}~9D#M|=joRI?3g=a{$Wwvsbk>#9w#kFg>vOOrpd0SCu$CZ*( zItd>$L|bluFJXeRgiqT%sXV6c8D1-=Poq5c(5X(F(wijJbmg_8q1cr&scWQZqYkx| znU(m4g^1kUT=RNm9T7DgiT}$B`EZYinvYQ4tdvzQnh&}*ntPB#LNO$ShNhSwHKe2wKdSFLxOHR=SKNM;pX&ucc%bm9w!Wc7zf)kj}1KmIjR zee$yUD}eK-#JUyv#9MxGGdU& zsADQ;b;Yu{C1IXne-o>?WXJGNfBBXe75gX#EMQnab^FEBxb30kk8d|vxUG&z2UTOt* z;3Cb&U3+|h9KDHE!Y^}1!n4mA3EzI29mgfl^IwE1(YLAi&)ASy!ZsfU12o>8T*6y4 z?&u5rfz2{LN5$8ShjL?1BkHZ8zi~|(KK};a(M03IAREuT`m+_$!%@nTCNJKM*tH=|! zOc7rr%K)LC!6dFzL>DPHQ@BA{{)kq}@cn~?gqspR5$)4w81SM$O-KT(TX3f6-}6Bb zcGE3N1f(27+uda~Lf!b>Aw>5L{Z;WfMLb69g+)k!En$!~VI6U>+_Ho`tZB!eN|pt1 zdI~vwONc@a{dHQGQomzsD)|eB#aznCZt4lEr*|g>3!I>`pCqXbP@xC08yQOSDaWfT zkp5Z({ays*#Yv=(EPI`#`JJS7g8hw%L?vRlg|i;BEHPW1un`~X`V@cIfKh~~9}=2e iFKK=h>8lSj(CD{^Mz;yRNbSuh<8U{GM} zMX(=ujUe3ho^QX9wM1ZWS%oTD5y-j4tzisd*n;gK4@cl(t=076y-0yfc2q-p8(cPNsb)q2JCb{?SS79KK;S{8FH+al(-=RU-1IG65ODim zmSLijgY=?}5sc|lFA99?R=UMj6V|Zn_gacud0fJTh06{m@rA&>zOl|sRKSdbeJN0O z`j~_`Ax+Fet+tY)BG7lk|ahKA@Jk*G}S-gX$7$BZ6b$3GcBS=umS_J87TJ8)P4e`&%w5KWs)UsD5`4g zlmJpu3FPTPd1xmxHC$D@VUV;VCbQC`m*w+^UeUy5ipt{u+9RRfzhbZDGej>iQcZ%| z?@xohPWSChzFB;`+G!QKe;n7$Mpho>1tvW!x+Oncaxbn%DBZH@1>}MXdV_im^(1}q3=74{4zKH z2BXhPFJYCBFm9lH$dl9f6U4ZT2_kF!Qg-tMe-hu}HgR?2JA5+e?O+jinHvWiu6AOs z@*OBIqFlC?{NS6${b_>X#1jyq)9`Kwm23#YACS@_*Yf=byglW-(bv?y$Qe3-( zwZxkSeA<@zmdfb;gJ}-X?sn5!G7IM4m@1g_<=42b?FBPsreGclopUZF{|Xxg4lM_> zxX1=h!NpCsZI-9Hj>Qc3qz<=J2VU+ ZLf}mUT_xx@F4$k2(EUmLfqn+o{s9tJ+QkJuJ0ZJ7pEK|| zz91+nf?@s~sB;!-xWzElD`wsIt#>si2t~c~1{SbLGd;H44i6Zv_w`k6xh~C|CRNdK z6D1+s5o7c_Sb+!KYTeco&xa}D2RjV6S*k+jqcX`4fQ$tl0cNz40tK-{z z%Mo^+9@;?fh`H0|F+saK!C3GoT9zzoleXG`Fi8FXaR|;k4@fho}@C{UB;thJD z5OP+~EuG?qf zf#yky1sbi?&IUPlHo3VUG fT%D=lb+~bO1*+2 zBIu0YyqL=d>v;ZE4xD^zo5%hVBZ)yUeWV?h}YMH4iCRAyDIOD!8VVKCC(8 zN3~o63Zg5q3aWxi6;)U*(5c&#X(yLAvu=9QbR5&prbkUjw?_@rO*=+@%G8bYIsI(< zNN?X!!*R4RW6)m}h>dElCa`*-L`9m6q^MC*i#mZ-1!5Ep_6$4?-KmnPhq+e8I;4miWz2A;m;zmkxVI!M6)@fDw6vz%%}6O|QPGOFr%au4 z(FGE8DOeNO|BPM*0Ca2>(kfoU%L3|@W|_=O!$0uerloTue7*&d8= zVA~>4ix?_6B2ZUyraPb4rUy*Nm52i>j^Y?wAp=z~Sc@CV&edzPuyt9<%$I(=A!R%v zkPOQh+T%+#sN$ro(s&^!b4t<-sW>eikLQg^d&*ESEU;tA7_xS}E;_$`t{gPSvYK1S z8v@5d!DA2Y3O#xOSymPY1etvqf%8vD&N-)o)*kM)OLNUL46=LBKVznOh@XXCem&%8 z!OR-R3X>y7{-icyaiw;^)-`KL%bW5!Sd6*jCWG~KJ-l2>9yeB?UjnJ6eGgZ=3@UA8 z0aVXdn;AdoYWf5t5qPQS{#QewZCMm^MK7>2u#`lVdfs3f1>Os2;pFq&qyUPk&Ed(>GS$L9%rfeQ*Q%CY224j-lXn%OCP!btmJ_9vA- zO?U15w7~Vi4ew~dMj!OBmL0VWr*XixCknZ6GY|45ltE>NC#Q49BHPb|_Al}|2q1bj z%NjIYBeMdR1X^c*x-om>!lPe*ZEbk-86M zcm^wPBav#kjp|hEZLGP)w-LO@>pI#2)rg^n47FH8+$68>bG5-o!3WUzL_CjGcz2RF z!aq(;0qaP>TG#RyYVKphaO*u5TDi zP3s*rbylR3F)p>Ik`;V@F3UF?tIbTWRED8BleJj6yM zu$7u`M?IRb1u3+n1^YQC%P1W7S&Q=Yc%n#md*Hh(?<`DG+5~oc;>C#84tcB!{;ok5 zHsU--4j%@m>7fS^VpK{0TJGXd1P{?s@=WdqV=Fya=kF|fP=!2Y68v-E@}11N4B4dx zBi}zPG4JAa!QdaC582^Cs{ZBx(ogFG*QW3huM+Sgfn)rwFLUr%+n-3ZQR6q;ZVCzQ zrpWsveR`KpL;(z5`zs5IQOYr#$ JuHri+{{yj{O5*?k diff --git a/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFUserService.class b/build/classes/java/main/com/sprint/mission/discodeit/service/jcf/JCFUserService.class deleted file mode 100644 index 90d6b3bfeda15682aa6580ec4090c8ccd5b3bfad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2098 zcmb7F+fv(B6kSIa76_TxIH9;Sl!jbvgQK)fnu}dpE+rvxNM>Bf@K#|fL`1e3S!O1G zkxxly+A@@xPM`YFZ|ZcqjwG-gr=IX&S!ZjXwf0_n>FDo&fByr(w|K5YK|+ISU<65l z^uBdynXc8^GoS75+jU| zz=dj$ha6=M8G-yzRJ-Ln{u@)G=}03hySgZFBOgKqebs!Hv{xRC6t?A_DFdHiT3}?) z_BR>=lleldj;*bYwemPV#f*l}3|z*nK&r1y>U7YhZ1>`vp_XyZC=y}E1P{>X419qr zgkli_*FOODfsGoj3S@i5EPI~yrs{NjS?_fNH<0Hv4=uNAcLb*U`dV$fE~m{Im37Rc zD1}=P$VJS-tYbN$R3!s9rM$`R0Viflnp+0Gl!YffyV*XpHGC~_Yv{;MjnLT}CFW?YiY|Tb?7= zQBd_?In?U@aE{X!2E9x|z3$l*N46*MJU+?)H{x)*cuNAKT_U%vX3#<~{J6{MW4mcN zE*qD50>$%SYqVcjcqMLxK=#6UfE0&sQu_VL35=6q*>xocW$u5~q;sj?QlC#{u=4TD za^iaE&ajW42Koq#ifc9)IajZ#ns3!#)2We%^oH%)rv}Il@E5jOVy)fv>h`)LjhO8} z4sXht@-!IdK`rnVf0Ocj<^OG-;0o>_$$K8&yne&T3KF~n(#0c);t8~!BaHnD{pTS2 zF0T{J0P$29#7W^ES4Ox8_wj%$fifx)-fQNmjLn=Ny|b`*gvrg~FVIWB;Zo@sxddL6 z-tn=59&`pei_9S#Ko`U95j27L*;xwcX7C;F6lQ1eJ(h#QSFjopukeXN)m8M|>N;3o4FJo^uNfA|gn diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/FileMessageRepository.class.uniqueId1 b/build/tmp/compileJava/compileTransaction/stash-dir/FileMessageRepository.class.uniqueId1 deleted file mode 100644 index 9c9b64ff58a80e9dccdd7e766f56726619ca554b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3380 zcmbtW*-{%v6g@4L0Ws`g;}yJ1Vi8_qL*&?IF*XTX43A(K{<4*vu;I|+GDAQ1`qXLxz z4R?%XBbqWY3(?8BJ7&TasJv)pEccQ?StuN@LY07?HXX-UFr6O9%vK|a8V$ORTGR;) zChT<7S;|@&H=4E_$Feigq~#>+q-nX)thr=6mTPBMqVrbDjE-;^&x7449tl**!zsgE z6lfaTv}oET>_RL^jSV^)(L_^Hwvimk+G&X-&=?Bm<#Vo;ijEsgF=<|lj#lguC{G%$ zAyB_XB#1Wb)39I10UQ+Q+|>g!<67=Y)H7P3V!?DrleDu$^Ua&1!?7A1M!SX%9Y=6f zpjJ6jFpP9A<;ZSd$md|5^4Rtr&nsVC6br|7oRCoqI>xd&V@nRC(o;G@2vY-X6F9kp zh8^%UbP69=ez`6hENNn+SdBdwvIY76JmRsU%aeTYf5 z7X@1V4tqHhjt6lbm!!nyO~a%jpNd#sYCy*zh6HNvWi8h%ltBrq7pT1aRUIQT3KfZz z?a+_w1s+wnW)`#dJ!39q25}9q>Ua%f%mpKvoX#yRWtsaXv!~5(a`6W3(J)a!qp_ot zSMMjxB}ue~sRCU}&5axrGi?^nt8hbL?}$O3k{zzyAv2_-P`5!$Vn%XtQy}73?Xl%c zz*1vwk-I_&@*Iq2d=Z+Z%EGaXknb>v+hB6U@s`y4_NL3ytxXISf;isQ@g7*JK}J4V zh(Jpr=Ss^Uj;k8T;UT}~3ELg9bD3n34-NBd4@yL(<8{MXWPb?4l8YnQrZCJOY1c8A+ybvQ1ddFdGwb(dsX_$&5JLjSjMd~X{Jn<>@{!qf&`V>Hsf?KZ`zJclo*27 zTZ5CrY1c^HWm$NUFSBLf4-}=hl|1jX7f)ryZ>t(gc-mBH73(pk;ip1pD?JgI zDxr$z{Qry(PTRR`!jvYmZOUm|4feg^L_# zfo0tDV5d+On!p92l6MRZ}NkWWv$QzC8h|EgN zr|1$`L+@6|!#=kgJ;*$-pAq15e8Euyj(G+)cm|#g?Ckn6)ZjSXKjAaAp=fG@XKFyc zmptUZ89Nz_E9*EvyN5q$gpwhicTpmObLhlnbStYn z6jD3B#8RiIDNjYe12mMZ;sK&cb?<0^mVT5k(wT&=ra8^XV^Qoa}w2*=q1`|;+^50)0F6?%o)XF zAGzq~V^J1LgfVO6>+xHBM`n6y!vlQJfBlNB9~4`|KDI8PVuN4-#ZG(+TYO%5Y;Eu& XnGDJyab3fYUXlOI{a>gyfM5RuezZ$} diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/FileUserRepository.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/FileUserRepository.class.uniqueId0 deleted file mode 100644 index ab93917cbbd34c5d2128c7009d11d7c6cd233101..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3335 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 diff --git a/checkstyle.xml b/checkstyle.xml deleted file mode 100644 index 98e3c8f0ce..0000000000 --- a/checkstyle.xml +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9355b41557..0000000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew deleted file mode 100644 index f5feea6d6b..0000000000 --- a/gradlew +++ /dev/null @@ -1,252 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit - -# 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 - if ! command -v java >/dev/null 2>&1 - then - 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 -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - 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 - - -# 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"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -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 deleted file mode 100644 index 9d21a21834..0000000000 --- a/gradlew.bat +++ /dev/null @@ -1,94 +0,0 @@ -@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 -@rem SPDX-License-Identifier: Apache-2.0 -@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=. -@rem This is normally unused -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. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -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 deleted file mode 100644 index b710045467..0000000000 --- a/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = '1-sprint-mission' - diff --git a/src/.DS_Store b/src/.DS_Store deleted file mode 100644 index 0e61f4f0fd8f37b530b429d93b80fb27f3a71ea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5T0$LX(&Pu3VI88E!q~P7B8{ZgI6nhP^pP67)-Opr1Ve%y&HQYbZ^Lc|07P@xtpbz)pnyu4b8z@Z$WOW;Ib+Eq3R>edl6OHQ z1AL|hS^hr*w09Qt!G{pyx&1pr-_E-dRmdzZ7$pO<&#%EC3X`-_c@w$3wX$m4j$O2G z+V^tQPW^P4H2udbdODXf3Z`>ExCncrPHFvE#;G61y+@T0c6%6deHq4GIcmyb+)Y$& zTRR-5;B-n`<8kevQZKvv)%v9DjvKW~+1+c@CKIQyvAuhE)_I8fv3%0p3;ZyZtQnlb zGfpf>p$7@1bA`X4?{neP97bk<8DIvMgaLCj7K%$!50}9VFay8G0G$smDxqgE)2NOP z98?Q{XrWmN&eg9!qDuxu&tRqzEhs{#BI;COS`1-22cgr^@0s{aqfQ5*-i+&*Hw)9D z2-A27SA~P{H1fy{Fauv1pxzIqMEC#6&;7p&;(-}p29}cnVYS+=Ce~)|)`cqRu60pw rQAsE+(>P1PiMon0magJWR3&J4X@ck(%rv3}g?|JT4LmRdf6BlITU=Yh diff --git a/src/main/.DS_Store b/src/main/.DS_Store deleted file mode 100644 index b73a780e59707cb10a52003fc2886d3f56be8fb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!A{#i5SNTPv0s-RU1~_nSs&Z(nU?-6<7%z&G<`6~l9sY$g zKf>?8o83(W2^?EB)r>Uz#~0fPiKq-^EO;2+5T0jUkb?8902Qxs zn&?iH=m^iepvb?^0H0lvE-9qn6waOB7tC!v88I7~#YLm+#+~y+bd$u{pk9Aeg_Yv! zhf>KaRZ72F7kbnhgo9z$4EsO$>6_L`G_}L%d)ynftLsNP9fWb(>zjnQ+e66DvpDVQ zQBx1oZf0^@cEa<@Uc0(E9yj*udo_P|dv8+n#|Mpi&EGj_OeS9WYZBWn()a0kPqKJ_RgO+#26w&y6gN7PFSrrCnRfG{8oEHwk}YAjcldKdEJg#lsU zPcXpugAZj49Of3y)q%mZ0Kg*LMqryyf1u9}VBj#f2oFTrRG>{&uEkKUb5J%N^MQ-c zE!uQa=FM2gy;->qMY+a9`6irHU{OY4Kp1$<0QY{7D%by$_xpbnB!e&@4E&!AsN!+! zxQV^F+PbhyuC+e&9LmCRxy4xu3{#2`%cXb&Y6O0t4Pf9fw+IhJJ_HO6G6(~Im4RpQ COI_Rm diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store deleted file mode 100644 index 1b70e5c489a2c8fe2c47fabc8c79ff80f093eaa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!AiqG5Z$%aBorYB1-%8l7EOy%i7)-OJP067Ya@Qa7NBkX~ z+1(t9#iO8|f!#Ngnb~As>CP@=jQg{=#hA?)GhrZdR8|N+Ug_Gm~ z-w^!v8XGXdMpx<5_n(93@KcH`MMp)&bgZj-&0Y6{Z`A6WTZUm74dXF*7DbSU z`E2TklY6vogh-=G52M>;SoH0k3z6kvk_{&^A&G|&@^F`Au_$~o%i^ib4V1&OOsjA2 z&*$w^x6^b^TAfAHnRnZ6(>d<87YobWJvchM?!Tm?OuQ=YIs7P6wl!ApRw;zU05L!e z5CiMTfNl?FV;zg9nu!5o;70~eRtq09sHh-FBPhE#^sw~9sTC&^1}7igF7;uaZe%5!~ij{%s@?bhq?S3VYWd@<;p~ zok>z*se&gFI|GxKOlCHlmyk&SK(r@=IzSZw%BX}n2a7L+`bn20XDx(6eilvfM zs+4ZK4{F*?`pG12_s7@Nx=84Rbr>c)wRl70{k$2uSw4AJH0Du@PZ+E$Zj z5bM~k>2RE~)2nXJW{pF)S(69#=Da3nt%h5Z`>n=&?vyuo_KwbbkKt3Kp7n2ozzwQp z-QogX78OQjfEi#0R)+z5B$g|yGi9DBGr$b|kO4X$Br2h2F*T@<4lL;UNc{yu60Fm; zkx*LnET#sr2Su1rL=!6P6GNDAv`g#fSxgO@a1eTA{Ei)2*cXb>qoZAFcMzUIE|~#l zAj?4BG^>>VPrrZvXM?!K3@`)#iUCpRbUSUFlFhA4lcQWKQSVSm$S*bc8G;p^iqV%+ d@fNBUv`eZWdKOcIXhGqNfTn>9X5d#D_yF6}Qo8^E diff --git a/src/main/java/com/sprint/.DS_Store b/src/main/java/com/sprint/.DS_Store deleted file mode 100644 index 415cd18fd1f531cde81690f51a588a89119ada75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5Z-O8Nhm@N3VK`cTC^=nEnZ@*2d_r-pi&!KFqmeGN$H^!a@QB~MSLBd z+1-jIdhjA*XUgn1J3ra(m#{yKG47B14aQu?m<@_pa-jJ_FpgS~lJOvN^^Ax~mYl}& zE{qG=3H{Lx|vKaRj>arUa})b~s5#VXU%W!ciQhS-t+sOXbSS zs%1G=)w&7pou|0Zq8ry~n%FPvn>vHf5ljj-CHR^K4)yVK1Gcq?f6s|@GzfkFndm5=F z28e-02FkkY;{Jc~{r!Kjh+N2pt3z4b%_=zskTnxt~)M diff --git a/src/main/java/com/sprint/mission/.DS_Store b/src/main/java/com/sprint/mission/.DS_Store deleted file mode 100644 index 0d34151425c0440ad9ea0fa581e2ea080902cac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}N6?5T3Nv?NWpu6!aGGTC^=nEne1I4_>Y4L8W%P1sB&%akunP3VYWV@!$v|c=jlo^n;>@s@^lWPsOhlTs?Eq71sYe!MAOL3ggL*x@hvCe!lLul4WbGSAAY z+r3hajpl>RAP9r4;KSgPnGUMBnw0%`{Elm9#^lMZ9Vc(IbUJK5dToj-&Wdzw1F}&H zm-pvcF*4J>nG~ba#tvLZ7`DP;`{``fd)eLZ=ofqY^NyY!^tv7W{Gd0VhporkyN9R4 zFZtKP{IJ6&g$-)up~qYJ2_vKviZT6ycIY##ZxkSIbix2{Z%bFGGcgtD+-?eI?s44aDK%c=MY a)C$@)8^Fk8?GP;xxd>Pqq!0%FD+4#aYiy$c diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java deleted file mode 100644 index 5db9890117..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.sprint.mission.discodeit; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.repository.MessageRepository; -import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.repository.file.FileChannelRepository; -import com.sprint.mission.discodeit.repository.file.FileMessageRepository; -import com.sprint.mission.discodeit.repository.file.FileUserRepository; -import com.sprint.mission.discodeit.repository.jcf.JCFChannelRepository; -import com.sprint.mission.discodeit.repository.jcf.JCFMessageRepository; -import com.sprint.mission.discodeit.repository.jcf.JCFUserRepository; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.basic.BasicChannelService; -import com.sprint.mission.discodeit.service.basic.BasicMessageService; -import com.sprint.mission.discodeit.service.basic.BasicUserService; - -public class JavaApplication { - static User setupUser(UserService userService) { - User user = userService.createUser("woody", "woody@codeit.com"); - return user; - } - - static Channel setupChannel(ChannelService channelService) { - Channel channel = channelService.createChannel("공지", "공지 채널입니다."); - return channel; - } - - static void messageCreateTest(MessageService messageService, Channel channel, User author) { - Message message = messageService.createMessage(author.getId(), channel.getId(), "안녕하세요."); - System.out.println("메시지 생성: " + message.getId()); - } - - public static void main(String[] args) { - // JCF Repository를 사용하는 경우 - UserRepository userJcfRepo = new JCFUserRepository(); - ChannelRepository channelJcfRepo = new JCFChannelRepository(); - MessageRepository messageJcfRepo = new JCFMessageRepository(); - - UserService userService = new BasicUserService(userJcfRepo); - ChannelService channelService = new BasicChannelService(channelJcfRepo); - MessageService messageService = new BasicMessageService(messageJcfRepo, userService, channelService); - - // File Repository를 사용하는 경우 - UserRepository userFileRepo = new FileUserRepository(); - ChannelRepository channelFileRepo = new FileChannelRepository(); - MessageRepository messageFileRepo = new FileMessageRepository(); - - UserService userFileService = new BasicUserService(userFileRepo); - ChannelService channelFileService = new BasicChannelService(channelFileRepo); - MessageService messageFileService = new BasicMessageService(messageFileRepo, userFileService, channelFileService); - - // 테스트 실행 - User user = setupUser(userService); - Channel channel = setupChannel(channelService); - messageCreateTest(messageService, channel, user); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/Main.java b/src/main/java/com/sprint/mission/discodeit/Main.java deleted file mode 100644 index 302807c1e4..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/Main.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.sprint.mission.discodeit; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.jcf.JCFChannelService; -import com.sprint.mission.discodeit.service.jcf.JCFMessageService; -import com.sprint.mission.discodeit.service.jcf.JCFUserService; - -import java.util.List; - -public class Main { - public static void main(String[] args) { - JCFUserService userService = new JCFUserService(); - JCFChannelService channelService = new JCFChannelService(); - JCFMessageService messageService = new JCFMessageService(userService, channelService); - - User userA = userService.createUser("Jun", "junhan5231@naver.com"); - System.out.println("유저 생성: " + userA.getUsername()); - - User retrievedUser = userService.getUser(userA.getId()); - System.out.println("조회된 유저: " + retrievedUser.getUsername()); - - List allUsers = userService.getAllUsers(); - System.out.println("전체 유저 수: " + allUsers.size()); - - User updatedUser = userService.updateUser(userA.getId(), "Junhan", "jun5231@naver.com"); - System.out.println("수정된 유저: " + updatedUser.getUsername()); - - User retrievedUpdatedUser = userService.getUser(userA.getId()); - System.out.println("수정 후 조회된 유저: " + retrievedUpdatedUser.getUsername()); - - Channel channelA = channelService.createChannel("일반", "일반채널"); - System.out.println("채널 생성: " + channelA.getName()); - - Channel retrievedChannel = channelService.getChannel(channelA.getId()); - System.out.println("조회된 채널: " + retrievedChannel.getName()); - - List allChannels = channelService.getAllChannels(); - System.out.println("전체 채널 수: " + allChannels.size()); - - Channel updatedChannel = channelService.updateChannel(channelA.getId(), "수정된 일반", "수정된 일반채널"); - System.out.println("수정된 채널: " + updatedChannel.getName()); - - Channel retrievedUpdatedChannel = channelService.getChannel(channelA.getId()); - System.out.println("수정 후 조회된 채널: " + retrievedUpdatedChannel.getName()); - - Message messageA = messageService.createMessage(userA.getId(), channelA.getId(), "안녕하세요"); - System.out.println("메시지 생성: " + messageA.getContent()); - - Message retrievedMessage = messageService.getMessage(messageA.getId()); - System.out.println("조회된 메시지: " + retrievedMessage.getContent()); - - List allMessages = messageService.getAllMessages(); - System.out.println("전체 메시지 수: " + allMessages.size()); - - Message updatedMessage = messageService.updateMessage(messageA.getId(), "수정된 메시지입니다"); - System.out.println("수정된 메시지: " + updatedMessage.getContent()); - - Message retrievedUpdatedMessage = messageService.getMessage(messageA.getId()); - System.out.println("수정 후 조회된 메시지: " + retrievedUpdatedMessage.getContent()); - - messageService.deleteMessage(messageA.getId()); - if (messageService.getMessage(messageA.getId()) == null) { - System.out.println("메시지가 성공적으로 삭제되었습니다."); - } - - channelService.deleteChannel(channelA.getId()); - if (channelService.getChannel(channelA.getId()) == null) { - System.out.println("채널이 성공적으로 삭제되었습니다."); - } - - userService.deleteUser(userA.getId()); - if (userService.getUser(userA.getId()) == null) { - System.out.println("유저가 성공적으로 삭제되었습니다."); - } - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java b/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java deleted file mode 100644 index 5d12e4aef2..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.sprint.mission.discodeit.entity; -import java.util.UUID; - -public abstract class AbstractEntity { - protected final UUID id; - protected final Long createAt; - protected Long updateAt; - - public AbstractEntity() { - this.id = UUID.randomUUID(); - this.createAt = System.currentTimeMillis(); - this.updateAt = this.createAt; - } - public UUID getId() { - return id; - } - public Long getCreateAt() { - return createAt; - } - public Long getUpdateAt() { - return updateAt; - } - protected void updateTimestamp(){ - this.updateAt = System.currentTimeMillis(); - } - -} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java deleted file mode 100644 index 0d3c9a907a..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sprint.mission.discodeit.entity; - -public class Channel extends AbstractEntity { - private String name; - private String description; - - public Channel(String name, String description) { - super(); - this.name = name; - this.description = description; - } - public String getName() { - return name; - } - public String getDescription() { - return description; - } - - public void update(String name, String description){ - this.name = name; - this.description = description; - updateTimestamp(); - } -} - diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java deleted file mode 100644 index 1df7fb8b0c..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.sprint.mission.discodeit.entity; - -import java.util.UUID; - -public class Message extends AbstractEntity { - private UUID userId; - private UUID channelId; - private String content; - - public Message(UUID userId, UUID channelId, String content) { - super(); - this.userId = userId; - this.channelId = channelId; - this.content = content; - } - public UUID getUserId() { - return userId; - } - public UUID getChannelId() { - return channelId; - } - public String getContent() { - return content; - } - - public void update(String content) { - this.content = content; - updateTimestamp(); - } - - public void update(UUID userId, UUID channelId, String content) { - this.userId = userId; - this.channelId = channelId; - this.content = content; - updateTimestamp(); - } - -} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java deleted file mode 100644 index ad44d09649..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.sprint.mission.discodeit.entity; - -public class User extends AbstractEntity { - private String username; - private String email; - - public User(String username, String email) { - this.username = username; - this.email = email; - } - public String getUsername() { - return username; - } - public String getEmail() { - return email; - } - public void update(String username, String email){ - this.username = username; - this.email = email; - updateTimestamp(); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java deleted file mode 100644 index 5bc2163a18..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sprint.mission.discodeit.repository; - -import com.sprint.mission.discodeit.entity.Channel; - -import java.util.List; -import java.util.UUID; - -public interface ChannelRepository { - void save(Channel channel); - Channel findById(UUID id); - List findAll(); - void delete(UUID id); -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java deleted file mode 100644 index 37e430ed38..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sprint.mission.discodeit.repository; - -import com.sprint.mission.discodeit.entity.Message; - -import java.util.List; -import java.util.UUID; - -public interface MessageRepository { - void save(Message message); - Message findById(UUID id); - List findAll(); - void delete(UUID id); -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java deleted file mode 100644 index f58057ef8a..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sprint.mission.discodeit.repository; - -import com.sprint.mission.discodeit.entity.User; - -import java.util.List; -import java.util.UUID; - -public interface UserRepository { - void save(User user); - User findById(UUID id); - List findAll(); - void delete(UUID id); -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java deleted file mode 100644 index 04a8a2b5b6..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.sprint.mission.discodeit.repository.file; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.repository.ChannelRepository; - -import java.io.*; -import java.util.*; - -public class FileChannelRepository implements ChannelRepository { - private final String filePath = "channels.ser"; - private Map data; - - public FileChannelRepository() { - this.data = loadFromFile(); - } - - @Override - public void save(Channel channel) { - data.put(channel.getId(), channel); - saveToFile(); - } - - @Override - public Channel findById(UUID id) { - return data.get(id); - } - - @Override - public List findAll() { - return new ArrayList<>(data.values()); - } - - @Override - public void delete(UUID id) { - data.remove(id); - saveToFile(); - } - - private void saveToFile() { - try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) { - oos.writeObject(data); - } catch (IOException e) { - throw new RuntimeException("채널을 저장하는데 실패하였습니다.", e); - } - } - - private Map loadFromFile() { - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { - return (Map) ois.readObject(); - } catch (FileNotFoundException e) { - return new HashMap<>(); - } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException("채널을 불러오는데 실패하였습니다", e); - } - } -} - diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java deleted file mode 100644 index 1518648a9c..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.sprint.mission.discodeit.repository.file; - -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.repository.MessageRepository; - -import java.io.*; -import java.util.*; - -public class FileMessageRepository implements MessageRepository { - private final String filePath = "messages.ser"; - private Map data; - - public FileMessageRepository() { - this.data = loadFromFile(); - } - - @Override - public void save(Message message) { - data.put(message.getId(), message); - saveToFile(); - } - - @Override - public Message findById(UUID id) { - return data.get(id); - } - - @Override - public List findAll() { - return new ArrayList<>(data.values()); - } - - @Override - public void delete(UUID id) { - data.remove(id); - saveToFile(); - } - - private void saveToFile() { - try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) { - oos.writeObject(data); - } catch (IOException e) { - throw new RuntimeException("Failed to save messages", e); - } - } - - private Map loadFromFile() { - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { - return (Map) ois.readObject(); - } catch (FileNotFoundException e) { - return new HashMap<>(); - } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException("채널을 불러오는데 실패하였습니다", e); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java deleted file mode 100644 index 3e573bb680..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.sprint.mission.discodeit.repository.file; - -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.repository.UserRepository; - -import java.io.*; -import java.util.*; -public class FileUserRepository implements UserRepository { - private final String filePath = "users.ser"; - private Map data; - - public FileUserRepository() { - this.data = loadFromFile(); - } - - @Override - public void save(User user) { - data.put(user.getId(), user); - saveToFile(); - } - - @Override - public User findById(UUID id) { - return data.get(id); - } - - @Override - public List findAll() { - return new ArrayList<>(data.values()); - } - - @Override - public void delete(UUID id) { - data.remove(id); - saveToFile(); - } - - private void saveToFile() { - try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) { - oos.writeObject(data); - } catch (IOException e) { - throw new RuntimeException("유저를 저장하는데 실패하였습니다.", e); - } - } - - private Map loadFromFile() { - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { - return (Map) ois.readObject(); - } catch (FileNotFoundException e) { - return new HashMap<>(); - } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException("유저를 불러오는데 실패하였습니다", e); - } - } -} - diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java deleted file mode 100644 index 18f639b8fa..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.sprint.mission.discodeit.repository.jcf; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.repository.ChannelRepository; - -import java.util.*; - -public class JCFChannelRepository implements ChannelRepository { - private final Map data = new HashMap<>(); - - @Override - public void save(Channel channel) { - data.put(channel.getId(), channel); - } - - @Override - public Channel findById(UUID id) { - return data.get(id); - } - - @Override - public List findAll() { - return new ArrayList<>(data.values()); - } - - @Override - public void delete(UUID id) { - data.remove(id); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java deleted file mode 100644 index b7e1390b5d..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.sprint.mission.discodeit.repository.jcf; - -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.repository.MessageRepository; - -import java.util.*; - -public class JCFMessageRepository implements MessageRepository { - private final Map data = new HashMap<>(); - - @Override - public void save(Message message) { - data.put(message.getId(), message); - } - - @Override - public Message findById(UUID id) { - return data.get(id); - } - - @Override - public List findAll() { - return new ArrayList<>(data.values()); - } - - @Override - public void delete(UUID id) { - data.remove(id); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java deleted file mode 100644 index 2c89b4d9b9..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.sprint.mission.discodeit.repository.jcf; - -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.repository.UserRepository; - -import java.util.*; - -public class JCFUserRepository implements UserRepository { - private final Map data = new HashMap<>(); - - @Override - public void save(User user) { - data.put(user.getId(), user); - } - - @Override - public User findById(UUID id) { - return data.get(id); - } - - @Override - public List findAll() { - return new ArrayList<>(data.values()); - } - - @Override - public void delete(UUID id) { - data.remove(id); - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java deleted file mode 100644 index a175ec3c90..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.entity.Channel; - -import java.util.List; -import java.util.UUID; - -public interface ChannelService { - - Channel createChannel(String name, String description); - Channel getChannel(UUID id); - List getAllChannels(); - Channel updateChannel(UUID id, String name, String description); - void deleteChannel(UUID id); -} - - diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java deleted file mode 100644 index e0939eb65e..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sprint.mission.discodeit.service; - -import com.sprint.mission.discodeit.entity.Message; - -import java.util.List; -import java.util.UUID; - -public interface MessageService { - Message createMessage(UUID userId, UUID channelId, String content); - Message getMessage(UUID id); - List getAllMessages(); - Message updateMessage(UUID id, String content); - void deleteMessage(UUID id); -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java deleted file mode 100644 index 508964331e..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sprint.mission.discodeit.service; - -import com.sprint.mission.discodeit.entity.User; - -import java.util.List; -import java.util.UUID; - -public interface UserService { - User createUser(String username, String email); - User getUser(UUID id); - List getAllUsers(); - User updateUser(UUID id, String username, String email); - void deleteUser(UUID id); -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java deleted file mode 100644 index e1533d4ded..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.sprint.mission.discodeit.service.basic; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.service.ChannelService; - -import java.util.List; -import java.util.UUID; - -public class BasicChannelService implements ChannelService { - private final ChannelRepository repository; - - public BasicChannelService(ChannelRepository repository) { - this.repository = repository; - } - - @Override - public Channel createChannel(String name, String description) { - Channel channel = new Channel(name, description); - repository.save(channel); - return channel; - } - - @Override - public Channel getChannel(UUID id) { - return repository.findById(id); - } - - @Override - public List getAllChannels() { - return repository.findAll(); - } - - @Override - public Channel updateChannel(UUID id, String name, String description) { - Channel channel = repository.findById(id); - if(channel != null) { - channel.update(name, description); - repository.save(channel); - return channel; - } - return null; - } - - @Override - public void deleteChannel(UUID id) { - repository.delete(id); - } -} - diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java deleted file mode 100644 index a4bffdbc62..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.sprint.mission.discodeit.service.basic; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.repository.MessageRepository; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; - -import java.util.List; -import java.util.UUID; - -public class BasicMessageService implements MessageService { - private final MessageRepository repository; - private final UserService userService; - private final ChannelService channelService; - - public BasicMessageService(MessageRepository repository, UserService userService, ChannelService channelService) { - this.repository = repository; - this.userService = userService; - this.channelService = channelService; - } - - @Override - public Message createMessage(UUID userId, UUID channelId, String content) { - User user = userService.getUser(userId); - Channel channel = channelService.getChannel(channelId); - - if (user == null) { - throw new IllegalArgumentException("유저를 찾을 수 없습니다. userId: " + userId); - } - if (channel == null) { - throw new IllegalArgumentException("채널을 찾을 수 없습니다. channelId: " + channelId); - } - - Message message = new Message(userId, channelId, content); - repository.save(message); - return message; - } - - @Override - public Message getMessage(UUID id) { - return repository.findById(id); - } - - @Override - public List getAllMessages() { - return repository.findAll(); - } - - @Override - public Message updateMessage(UUID id, String content) { - Message message = repository.findById(id); - if (message != null) { - message.update(content); - repository.save(message); - return message; - } - return null; - } - - @Override - public void deleteMessage(UUID id) { - repository.delete(id); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java deleted file mode 100644 index a0782e93c5..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.sprint.mission.discodeit.service.basic; - -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.service.UserService; - -import java.util.List; -import java.util.UUID; - -public class BasicUserService implements UserService { - private final UserRepository repository; - - public BasicUserService(UserRepository repository) { - this.repository = repository; - } - - @Override - public User createUser(String username, String email) { - User user = new User(username, email); - repository.save(user); - return user; - } - - @Override - public User getUser(UUID id) { - return repository.findById(id); - } - - @Override - public List getAllUsers() { - return repository.findAll(); - } - - @Override - public User updateUser(UUID id, String username, String email) { - User user = repository.findById(id); - if (user != null) { - user.update(username, email); - repository.save(user); - return user; - } - return null; - } - - @Override - public void deleteUser(UUID id) { - repository.delete(id); - } -} - diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java deleted file mode 100644 index 582b264c99..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.sprint.mission.discodeit.service.file; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.repository.file.FileChannelRepository; -import com.sprint.mission.discodeit.service.ChannelService; - -import java.util.List; -import java.util.UUID; - -public class FileChannelService implements ChannelService { - private final ChannelRepository repository; - - public FileChannelService() { - this.repository = new FileChannelRepository(); - } - - @Override - public Channel createChannel(String name, String description) { - Channel channel = new Channel(name, description); - repository.save(channel); - return channel; - } - - @Override - public Channel getChannel(UUID id) { - return repository.findById(id); - } - - @Override - public List getAllChannels() { - return repository.findAll(); - } - - @Override - public Channel updateChannel(UUID id, String name, String description) { - Channel channel = repository.findById(id); - if(channel != null) { - channel.update(name, description); - repository.save(channel); - return channel; - } - return null; - } - - @Override - public void deleteChannel(UUID id) { - repository.delete(id); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java deleted file mode 100644 index 27858a7f64..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.sprint.mission.discodeit.service.file; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.repository.MessageRepository; -import com.sprint.mission.discodeit.repository.file.FileMessageRepository; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; - -import java.util.List; -import java.util.UUID; - -public class FileMessageService implements MessageService { - private final MessageRepository repository; - private final UserService userService; - private final ChannelService channelService; - - public FileMessageService(MessageRepository repository, UserService userService, ChannelService channelService) { - this.repository = repository; - this.userService = userService; - this.channelService = channelService; - } - - @Override - public Message createMessage(UUID userId, UUID channelId, String content) { - User user = userService.getUser(userId); - Channel channel = channelService.getChannel(channelId); - - if (user == null) { - throw new IllegalArgumentException("유저를 찾을 수 없습니다. userId: " + userId); - } - if (channel == null) { - throw new IllegalArgumentException("채널을 찾을 수 없습니다. channelId: " + channelId); - } - - Message message = new Message(userId, channelId, content); - repository.save(message); - return message; - } - - @Override - public Message getMessage(UUID id) { - return repository.findById(id); - } - - @Override - public List getAllMessages() { - return repository.findAll(); - } - - @Override - public Message updateMessage(UUID id, String content) { - Message message = repository.findById(id); - if (message != null) { - message.update(content); - repository.save(message); - return message; - } - return null; - } - - @Override - public void deleteMessage(UUID id) { - repository.delete(id); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java deleted file mode 100644 index 39a25f39de..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.sprint.mission.discodeit.service.file; - -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.repository.file.FileUserRepository; -import com.sprint.mission.discodeit.service.UserService; - -import java.util.List; -import java.util.UUID; - -public class FileUserService implements UserService { - private final UserRepository repository; - - public FileUserService(UserRepository repository) { - this.repository = repository; - } - - @Override - public User createUser(String username, String email) { - User user = new User(username, email); - repository.save(user); - return user; - } - - @Override - public User getUser(UUID id) { - return repository.findById(id); - } - - @Override - public List getAllUsers() { - return repository.findAll(); - } - - @Override - public User updateUser(UUID id, String username, String email) { - User user = repository.findById(id); - if (user != null) { - user.update(username, email); - repository.save(user); - return user; - } - return null; - } - - @Override - public void deleteUser(UUID id) { - repository.delete(id); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java deleted file mode 100644 index f366538df4..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.service.ChannelService; - -import java.util.*; - -public class JCFChannelService implements ChannelService { - - private final Map data; - - public JCFChannelService() { - this.data = new HashMap<>(); - } - - - @Override - public Channel createChannel(String name, String description){ - Channel channel = new Channel(name, description); - data.put(channel.getId(), channel); - return channel; - } - - @Override - public Channel getChannel(UUID id) { - return data.get(id); - } - - @Override - public List getAllChannels() { - return new ArrayList<>(data.values()); - } - - @Override - public Channel updateChannel(UUID id, String name, String description) { - Channel channel = data.get(id); - if(channel != null) { - channel.update(name, description); - return channel; - - } - return null; - } - - @Override - public void deleteChannel(UUID id) { - data.remove(id); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java deleted file mode 100644 index 1baabb1c4a..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.service.MessageService; - -import java.util.*; - - -public class JCFMessageService implements MessageService { - private final Map data; - private final JCFUserService userService; - private final JCFChannelService channelService; - - public JCFMessageService(JCFUserService userService, JCFChannelService channelService) { - this.data = new HashMap<>(); - this.userService = userService; - this.channelService = channelService; - } - - private void validateUser(User user, UUID userId) { - if (user == null) { - throw new IllegalArgumentException("유저를 찾을 수 없습니다. userId: " + userId); - } - } - - private void validateChannel(Channel channel, UUID channelId) { - if (channel == null) { - throw new IllegalArgumentException("채널을 찾을 수 없습니다. channelId: " + channelId); - } - } - - @Override - public Message createMessage(UUID userId, UUID channelId, String content) { - User user = userService.getUser(userId); - Channel channel = channelService.getChannel(channelId); - - validateUser(user, userId); - validateChannel(channel, channelId); - - Message message = new Message(userId, channelId, content); - data.put(message.getId(), message); - return message; - } - - @Override - public Message getMessage(UUID id) { - return data.get(id); - } - - @Override - public List getAllMessages() { - return new ArrayList<>(data.values()); - } - - @Override - public Message updateMessage(UUID id, String content) { - Message message = data.get(id); - if (message != null) { - message.update(content); - return message; - } - return null; - } - - @Override - public void deleteMessage(UUID id) { - data.remove(id); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java deleted file mode 100644 index fab3971364..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.UserService; - -import java.util.*; - -public class JCFUserService implements UserService { - private final Map data; - - public JCFUserService() { - this.data = new HashMap<>(); - } - - @Override - public User createUser(String username, String email) { - User user = new User(username, email); - data.put(user.getId(), user); - return user; - } - - @Override - public User getUser(UUID id) { - return data.get(id); - } - - @Override - public List getAllUsers() { - return new ArrayList<>(data.values()); - } - - @Override - public User updateUser(UUID id, String username, String email) { - User user = data.get(id); - if(user != null) { - user.update(username, email); - return user; - } - return null; - } - - @Override - public void deleteUser(UUID id) { - data.remove(id); - } -} - From 95e9f3b5493d988088774eca1f384f5736935317 Mon Sep 17 00:00:00 2001 From: Junanaa Date: Sun, 26 Jan 2025 02:35:10 +0900 Subject: [PATCH 5/7] =?UTF-8?q?git=20ignore=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/pull-request-template.md | 67 +++ .gitignore | 44 ++ README.md | 1 + build.gradle | 33 ++ checkstyle.xml | 442 ++++++++++++++++++ gradle/wrapper/gradle-wrapper.jar | 0 gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 252 ++++++++++ gradlew.bat | 94 ++++ settings.gradle | 2 + .../mission/discodeit/JavaApplication.java | 62 +++ .../com/sprint/mission/discodeit/Main.java | 78 ++++ .../discodeit/entity/AbstractEntity.java | 27 ++ .../mission/discodeit/entity/Channel.java | 25 + .../mission/discodeit/entity/Message.java | 38 ++ .../sprint/mission/discodeit/entity/User.java | 22 + .../repository/ChannelRepository.java | 13 + .../repository/MessageRepository.java | 13 + .../discodeit/repository/UserRepository.java | 13 + .../file/FileChannelRepository.java | 57 +++ .../file/FileMessageRepository.java | 56 +++ .../repository/file/FileUserRepository.java | 56 +++ .../repository/jcf/JCFChannelRepository.java | 30 ++ .../repository/jcf/JCFMessageRepository.java | 30 ++ .../repository/jcf/JCFUserRepository.java | 30 ++ .../discodeit/service/ChannelService.java | 16 + .../discodeit/service/MessageService.java | 14 + .../discodeit/service/UserService.java | 14 + .../service/basic/BasicChannelService.java | 50 ++ .../service/basic/BasicMessageService.java | 67 +++ .../service/basic/BasicUserService.java | 50 ++ .../service/file/FileChannelService.java | 50 ++ .../service/file/FileMessageService.java | 68 +++ .../service/file/FileUserService.java | 50 ++ .../service/jcf/JCFChannelService.java | 49 ++ .../service/jcf/JCFMessageService.java | 71 +++ .../discodeit/service/jcf/JCFUserService.java | 47 ++ 37 files changed, 2038 insertions(+) create mode 100644 .github/pull-request-template.md create mode 100644 .gitignore create mode 100644 README.md create mode 100644 build.gradle create mode 100644 checkstyle.xml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/com/sprint/mission/discodeit/JavaApplication.java create mode 100644 src/main/java/com/sprint/mission/discodeit/Main.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/Channel.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/Message.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/User.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/ChannelService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/MessageService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/UserService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java diff --git a/.github/pull-request-template.md b/.github/pull-request-template.md new file mode 100644 index 0000000000..aa4599b4fb --- /dev/null +++ b/.github/pull-request-template.md @@ -0,0 +1,67 @@ +## 요구사항 + +### 기본 + +프로젝트 초기화 + +- [x] IntelliJ를 통해 다음의 조건으로 Java 프로젝트를 생성합니다. +- [x] IntelliJ에서 제공하는 프로젝트 템플릿 중 Java를 선택합니다. +- [x] 프로젝트의 경로는 스프린트 미션 리포지토리의 경로와 같게 설정합니다. +- [x] Create Git Repository 옵션은 체크하지 않습니다. +- [x] Build system은 Gradle을 사용합니다. Gradle DSL은 Groovy를 사용합니다. +- [x] JDK 17을 선택합니다. +- [x] GroupId는 com.sprint.mission로 설정합니다. +- [x] ArtifactId는 수정하지 않습니다. +- [x] .gitignore에 IntelliJ와 관련된 파일이 형상관리 되지 않도록 .idea디렉토리를 추가합니다. + +도메인 모델링 + +- [x] 디스코드 서비스를 활용해보면서 각 도메인 모델에 필요한 정보를 도출하고, Java Class로 구현하세요. + - [x] 패키지명: com.sprint.mission.discodeit.entity + - [x] 도메인 모델 정의 + - [x] 공통 + - [x] id: 객체를 식별하기 위한 id로 UUID 타입으로 선언합니다. + - [x] createdAt, updatedAt: 각각 객체의 생성, 수정 시간을 유닉스 타임스탬프로 나타내기 위한 필드로 Long 타입으로 선언합니다. + - [x] User + - [x] Channel + - [x] Message + - [x] 생성자 + - [x] id는 생성자에서 초기화하세요. + - [x] createdAt는 생성자에서 초기화하세요. + - [x] id, createdAt, updatedAt을 제외한 필드는 생성자의 파라미터를 통해 초기화하세요. + - [x] 메소드 + - [x] 각 필드를 반환하는 Getter 함수를 정의하세요. + - [x] 필드를 수정하는 update 함수를 정의하세요. + +서비스 설계 및 구현 + +- [x] 도메인 모델 별 CRUD(생성, 읽기, 모두 읽기, 수정, 삭제) 기능을 인터페이스로 선언하세요. +- [x] 인터페이스 패키지명: com.sprint.mission.discodeit.service +- [x] 인터페이스 네이밍 규칙: [도메인 모델 이름]Service +- [x] 다음의 조건을 만족하는 서비스 인터페이스의 구현체를 작성하세요. +- [x] 클래스 패키지명: com.sprint.mission.discodeit.service.jcf +- [x] 클래스 네이밍 규칙: JCF[인터페이스 이름] +- [x] Java Collections Framework를 활용하여 데이터를 저장할 수 있는 필드(data)를 final로 선언하고 생성자에서 초기화하세요. +- [x] data 필드를 활용해 생성, 조회, 수정, 삭제하는 메소드를 구현하세요. + +메인 클래스 구현 + +- [x] 메인 메소드가 선언된 JavaApplication 클래스를 선언하고, 도메인 별 서비스 구현체를 테스트해보세요. +- [x] 등록 +- [x] 조회(단건, 다건) +- [x] 수정 +- [x] 수정된 데이터 조회 +- [x] 삭제 +- [x] 조회를 통해 삭제되었는지 확인 + + +## 스크린샷 +[User CRUD Results] +![IMG_4673](https://github.com/user-attachments/assets/046328f8-0b6d-41e0-a32d-6905170aa34f) +[Channel CRUD Results] +![IMG_4675](https://github.com/user-attachments/assets/19751bb9-36c1-4510-887f-c420709dd302) +[Message CRUD Results] +![IMG_4670](https://github.com/user-attachments/assets/17f6c010-a829-4df9-a31e-3e7346dd45c1) +## 멘토에게 +- Message 클래스에 update 메소드를 JCFMessageService클래스에서 content가 UUID 타입으로 받아져서 두번 써서 해결했는데 괜찮은건지 궁금합니다 +- 셀프 코드 리뷰를 통해 질문 이어가겠습니다. \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..aa7f43b323 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +.idea + +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000000..81a8535d90 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Spring 백엔드 트랙 1기 스프린트 미션 제출 리포지토리 \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..6e970f5400 --- /dev/null +++ b/build.gradle @@ -0,0 +1,33 @@ +plugins { + id 'java' + id 'checkstyle' +} + +group = 'com.sprint.mission' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation platform('org.junit:junit-bom:5.10.0') + testImplementation 'org.junit.jupiter:junit-jupiter' +} + + +checkstyle { + toolVersion = '10.12.4' // 최신 안정 버전으로 업데이트 + configFile = rootProject.file('checkstyle.xml') + ignoreFailures = false +} + +test { + useJUnitPlatform() +} +tasks.withType(Checkstyle) { + reports { + html.required = true // HTML 보고서 생성 + xml.required = false // XML 보고서는 비활성화 + } +} diff --git a/checkstyle.xml b/checkstyle.xml new file mode 100644 index 0000000000..98e3c8f0ce --- /dev/null +++ b/checkstyle.xml @@ -0,0 +1,442 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..9355b41557 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000000..f5feea6d6b --- /dev/null +++ b/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# 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 + if ! command -v java >/dev/null 2>&1 + then + 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 +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + 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 + + +# 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"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +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 0000000000..9d21a21834 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,94 @@ +@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 +@rem SPDX-License-Identifier: Apache-2.0 +@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=. +@rem This is normally unused +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. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +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 0000000000..b710045467 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = '1-sprint-mission' + diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java new file mode 100644 index 0000000000..5db9890117 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -0,0 +1,62 @@ +package com.sprint.mission.discodeit; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.file.FileChannelRepository; +import com.sprint.mission.discodeit.repository.file.FileMessageRepository; +import com.sprint.mission.discodeit.repository.file.FileUserRepository; +import com.sprint.mission.discodeit.repository.jcf.JCFChannelRepository; +import com.sprint.mission.discodeit.repository.jcf.JCFMessageRepository; +import com.sprint.mission.discodeit.repository.jcf.JCFUserRepository; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.basic.BasicChannelService; +import com.sprint.mission.discodeit.service.basic.BasicMessageService; +import com.sprint.mission.discodeit.service.basic.BasicUserService; + +public class JavaApplication { + static User setupUser(UserService userService) { + User user = userService.createUser("woody", "woody@codeit.com"); + return user; + } + + static Channel setupChannel(ChannelService channelService) { + Channel channel = channelService.createChannel("공지", "공지 채널입니다."); + return channel; + } + + static void messageCreateTest(MessageService messageService, Channel channel, User author) { + Message message = messageService.createMessage(author.getId(), channel.getId(), "안녕하세요."); + System.out.println("메시지 생성: " + message.getId()); + } + + public static void main(String[] args) { + // JCF Repository를 사용하는 경우 + UserRepository userJcfRepo = new JCFUserRepository(); + ChannelRepository channelJcfRepo = new JCFChannelRepository(); + MessageRepository messageJcfRepo = new JCFMessageRepository(); + + UserService userService = new BasicUserService(userJcfRepo); + ChannelService channelService = new BasicChannelService(channelJcfRepo); + MessageService messageService = new BasicMessageService(messageJcfRepo, userService, channelService); + + // File Repository를 사용하는 경우 + UserRepository userFileRepo = new FileUserRepository(); + ChannelRepository channelFileRepo = new FileChannelRepository(); + MessageRepository messageFileRepo = new FileMessageRepository(); + + UserService userFileService = new BasicUserService(userFileRepo); + ChannelService channelFileService = new BasicChannelService(channelFileRepo); + MessageService messageFileService = new BasicMessageService(messageFileRepo, userFileService, channelFileService); + + // 테스트 실행 + User user = setupUser(userService); + Channel channel = setupChannel(channelService); + messageCreateTest(messageService, channel, user); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/Main.java b/src/main/java/com/sprint/mission/discodeit/Main.java new file mode 100644 index 0000000000..302807c1e4 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/Main.java @@ -0,0 +1,78 @@ +package com.sprint.mission.discodeit; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.jcf.JCFChannelService; +import com.sprint.mission.discodeit.service.jcf.JCFMessageService; +import com.sprint.mission.discodeit.service.jcf.JCFUserService; + +import java.util.List; + +public class Main { + public static void main(String[] args) { + JCFUserService userService = new JCFUserService(); + JCFChannelService channelService = new JCFChannelService(); + JCFMessageService messageService = new JCFMessageService(userService, channelService); + + User userA = userService.createUser("Jun", "junhan5231@naver.com"); + System.out.println("유저 생성: " + userA.getUsername()); + + User retrievedUser = userService.getUser(userA.getId()); + System.out.println("조회된 유저: " + retrievedUser.getUsername()); + + List allUsers = userService.getAllUsers(); + System.out.println("전체 유저 수: " + allUsers.size()); + + User updatedUser = userService.updateUser(userA.getId(), "Junhan", "jun5231@naver.com"); + System.out.println("수정된 유저: " + updatedUser.getUsername()); + + User retrievedUpdatedUser = userService.getUser(userA.getId()); + System.out.println("수정 후 조회된 유저: " + retrievedUpdatedUser.getUsername()); + + Channel channelA = channelService.createChannel("일반", "일반채널"); + System.out.println("채널 생성: " + channelA.getName()); + + Channel retrievedChannel = channelService.getChannel(channelA.getId()); + System.out.println("조회된 채널: " + retrievedChannel.getName()); + + List allChannels = channelService.getAllChannels(); + System.out.println("전체 채널 수: " + allChannels.size()); + + Channel updatedChannel = channelService.updateChannel(channelA.getId(), "수정된 일반", "수정된 일반채널"); + System.out.println("수정된 채널: " + updatedChannel.getName()); + + Channel retrievedUpdatedChannel = channelService.getChannel(channelA.getId()); + System.out.println("수정 후 조회된 채널: " + retrievedUpdatedChannel.getName()); + + Message messageA = messageService.createMessage(userA.getId(), channelA.getId(), "안녕하세요"); + System.out.println("메시지 생성: " + messageA.getContent()); + + Message retrievedMessage = messageService.getMessage(messageA.getId()); + System.out.println("조회된 메시지: " + retrievedMessage.getContent()); + + List allMessages = messageService.getAllMessages(); + System.out.println("전체 메시지 수: " + allMessages.size()); + + Message updatedMessage = messageService.updateMessage(messageA.getId(), "수정된 메시지입니다"); + System.out.println("수정된 메시지: " + updatedMessage.getContent()); + + Message retrievedUpdatedMessage = messageService.getMessage(messageA.getId()); + System.out.println("수정 후 조회된 메시지: " + retrievedUpdatedMessage.getContent()); + + messageService.deleteMessage(messageA.getId()); + if (messageService.getMessage(messageA.getId()) == null) { + System.out.println("메시지가 성공적으로 삭제되었습니다."); + } + + channelService.deleteChannel(channelA.getId()); + if (channelService.getChannel(channelA.getId()) == null) { + System.out.println("채널이 성공적으로 삭제되었습니다."); + } + + userService.deleteUser(userA.getId()); + if (userService.getUser(userA.getId()) == null) { + System.out.println("유저가 성공적으로 삭제되었습니다."); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java b/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java new file mode 100644 index 0000000000..5d12e4aef2 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/AbstractEntity.java @@ -0,0 +1,27 @@ +package com.sprint.mission.discodeit.entity; +import java.util.UUID; + +public abstract class AbstractEntity { + protected final UUID id; + protected final Long createAt; + protected Long updateAt; + + public AbstractEntity() { + this.id = UUID.randomUUID(); + this.createAt = System.currentTimeMillis(); + this.updateAt = this.createAt; + } + public UUID getId() { + return id; + } + public Long getCreateAt() { + return createAt; + } + public Long getUpdateAt() { + return updateAt; + } + protected void updateTimestamp(){ + this.updateAt = System.currentTimeMillis(); + } + +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java new file mode 100644 index 0000000000..0d3c9a907a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -0,0 +1,25 @@ +package com.sprint.mission.discodeit.entity; + +public class Channel extends AbstractEntity { + private String name; + private String description; + + public Channel(String name, String description) { + super(); + this.name = name; + this.description = description; + } + public String getName() { + return name; + } + public String getDescription() { + return description; + } + + public void update(String name, String description){ + this.name = name; + this.description = description; + updateTimestamp(); + } +} + diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java new file mode 100644 index 0000000000..1df7fb8b0c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -0,0 +1,38 @@ +package com.sprint.mission.discodeit.entity; + +import java.util.UUID; + +public class Message extends AbstractEntity { + private UUID userId; + private UUID channelId; + private String content; + + public Message(UUID userId, UUID channelId, String content) { + super(); + this.userId = userId; + this.channelId = channelId; + this.content = content; + } + public UUID getUserId() { + return userId; + } + public UUID getChannelId() { + return channelId; + } + public String getContent() { + return content; + } + + public void update(String content) { + this.content = content; + updateTimestamp(); + } + + public void update(UUID userId, UUID channelId, String content) { + this.userId = userId; + this.channelId = channelId; + this.content = content; + updateTimestamp(); + } + +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java new file mode 100644 index 0000000000..ad44d09649 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -0,0 +1,22 @@ +package com.sprint.mission.discodeit.entity; + +public class User extends AbstractEntity { + private String username; + private String email; + + public User(String username, String email) { + this.username = username; + this.email = email; + } + public String getUsername() { + return username; + } + public String getEmail() { + return email; + } + public void update(String username, String email){ + this.username = username; + this.email = email; + updateTimestamp(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java new file mode 100644 index 0000000000..5bc2163a18 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.Channel; + +import java.util.List; +import java.util.UUID; + +public interface ChannelRepository { + void save(Channel channel); + Channel findById(UUID id); + List findAll(); + void delete(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java new file mode 100644 index 0000000000..37e430ed38 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.Message; + +import java.util.List; +import java.util.UUID; + +public interface MessageRepository { + void save(Message message); + Message findById(UUID id); + List findAll(); + void delete(UUID id); +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java new file mode 100644 index 0000000000..f58057ef8a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.User; + +import java.util.List; +import java.util.UUID; + +public interface UserRepository { + void save(User user); + User findById(UUID id); + List findAll(); + void delete(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java new file mode 100644 index 0000000000..04a8a2b5b6 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -0,0 +1,57 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.repository.ChannelRepository; + +import java.io.*; +import java.util.*; + +public class FileChannelRepository implements ChannelRepository { + private final String filePath = "channels.ser"; + private Map data; + + public FileChannelRepository() { + this.data = loadFromFile(); + } + + @Override + public void save(Channel channel) { + data.put(channel.getId(), channel); + saveToFile(); + } + + @Override + public Channel findById(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public void delete(UUID id) { + data.remove(id); + saveToFile(); + } + + private void saveToFile() { + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) { + oos.writeObject(data); + } catch (IOException e) { + throw new RuntimeException("채널을 저장하는데 실패하였습니다.", e); + } + } + + private Map loadFromFile() { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { + return (Map) ois.readObject(); + } catch (FileNotFoundException e) { + return new HashMap<>(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("채널을 불러오는데 실패하였습니다", e); + } + } +} + diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java new file mode 100644 index 0000000000..1518648a9c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -0,0 +1,56 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.repository.MessageRepository; + +import java.io.*; +import java.util.*; + +public class FileMessageRepository implements MessageRepository { + private final String filePath = "messages.ser"; + private Map data; + + public FileMessageRepository() { + this.data = loadFromFile(); + } + + @Override + public void save(Message message) { + data.put(message.getId(), message); + saveToFile(); + } + + @Override + public Message findById(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public void delete(UUID id) { + data.remove(id); + saveToFile(); + } + + private void saveToFile() { + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) { + oos.writeObject(data); + } catch (IOException e) { + throw new RuntimeException("Failed to save messages", e); + } + } + + private Map loadFromFile() { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { + return (Map) ois.readObject(); + } catch (FileNotFoundException e) { + return new HashMap<>(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("채널을 불러오는데 실패하였습니다", e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java new file mode 100644 index 0000000000..3e573bb680 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -0,0 +1,56 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; + +import java.io.*; +import java.util.*; +public class FileUserRepository implements UserRepository { + private final String filePath = "users.ser"; + private Map data; + + public FileUserRepository() { + this.data = loadFromFile(); + } + + @Override + public void save(User user) { + data.put(user.getId(), user); + saveToFile(); + } + + @Override + public User findById(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public void delete(UUID id) { + data.remove(id); + saveToFile(); + } + + private void saveToFile() { + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) { + oos.writeObject(data); + } catch (IOException e) { + throw new RuntimeException("유저를 저장하는데 실패하였습니다.", e); + } + } + + private Map loadFromFile() { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { + return (Map) ois.readObject(); + } catch (FileNotFoundException e) { + return new HashMap<>(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("유저를 불러오는데 실패하였습니다", e); + } + } +} + diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java new file mode 100644 index 0000000000..18f639b8fa --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -0,0 +1,30 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.repository.ChannelRepository; + +import java.util.*; + +public class JCFChannelRepository implements ChannelRepository { + private final Map data = new HashMap<>(); + + @Override + public void save(Channel channel) { + data.put(channel.getId(), channel); + } + + @Override + public Channel findById(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public void delete(UUID id) { + data.remove(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java new file mode 100644 index 0000000000..b7e1390b5d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -0,0 +1,30 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.repository.MessageRepository; + +import java.util.*; + +public class JCFMessageRepository implements MessageRepository { + private final Map data = new HashMap<>(); + + @Override + public void save(Message message) { + data.put(message.getId(), message); + } + + @Override + public Message findById(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public void delete(UUID id) { + data.remove(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java new file mode 100644 index 0000000000..2c89b4d9b9 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -0,0 +1,30 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; + +import java.util.*; + +public class JCFUserRepository implements UserRepository { + private final Map data = new HashMap<>(); + + @Override + public void save(User user) { + data.put(user.getId(), user); + } + + @Override + public User findById(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public void delete(UUID id) { + data.remove(id); + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java new file mode 100644 index 0000000000..a175ec3c90 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -0,0 +1,16 @@ +package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.entity.Channel; + +import java.util.List; +import java.util.UUID; + +public interface ChannelService { + + Channel createChannel(String name, String description); + Channel getChannel(UUID id); + List getAllChannels(); + Channel updateChannel(UUID id, String name, String description); + void deleteChannel(UUID id); +} + + diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java new file mode 100644 index 0000000000..e0939eb65e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -0,0 +1,14 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.entity.Message; + +import java.util.List; +import java.util.UUID; + +public interface MessageService { + Message createMessage(UUID userId, UUID channelId, String content); + Message getMessage(UUID id); + List getAllMessages(); + Message updateMessage(UUID id, String content); + void deleteMessage(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java new file mode 100644 index 0000000000..508964331e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -0,0 +1,14 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.entity.User; + +import java.util.List; +import java.util.UUID; + +public interface UserService { + User createUser(String username, String email); + User getUser(UUID id); + List getAllUsers(); + User updateUser(UUID id, String username, String email); + void deleteUser(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java new file mode 100644 index 0000000000..e1533d4ded --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -0,0 +1,50 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.service.ChannelService; + +import java.util.List; +import java.util.UUID; + +public class BasicChannelService implements ChannelService { + private final ChannelRepository repository; + + public BasicChannelService(ChannelRepository repository) { + this.repository = repository; + } + + @Override + public Channel createChannel(String name, String description) { + Channel channel = new Channel(name, description); + repository.save(channel); + return channel; + } + + @Override + public Channel getChannel(UUID id) { + return repository.findById(id); + } + + @Override + public List getAllChannels() { + return repository.findAll(); + } + + @Override + public Channel updateChannel(UUID id, String name, String description) { + Channel channel = repository.findById(id); + if(channel != null) { + channel.update(name, description); + repository.save(channel); + return channel; + } + return null; + } + + @Override + public void deleteChannel(UUID id) { + repository.delete(id); + } +} + diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java new file mode 100644 index 0000000000..a4bffdbc62 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -0,0 +1,67 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.List; +import java.util.UUID; + +public class BasicMessageService implements MessageService { + private final MessageRepository repository; + private final UserService userService; + private final ChannelService channelService; + + public BasicMessageService(MessageRepository repository, UserService userService, ChannelService channelService) { + this.repository = repository; + this.userService = userService; + this.channelService = channelService; + } + + @Override + public Message createMessage(UUID userId, UUID channelId, String content) { + User user = userService.getUser(userId); + Channel channel = channelService.getChannel(channelId); + + if (user == null) { + throw new IllegalArgumentException("유저를 찾을 수 없습니다. userId: " + userId); + } + if (channel == null) { + throw new IllegalArgumentException("채널을 찾을 수 없습니다. channelId: " + channelId); + } + + Message message = new Message(userId, channelId, content); + repository.save(message); + return message; + } + + @Override + public Message getMessage(UUID id) { + return repository.findById(id); + } + + @Override + public List getAllMessages() { + return repository.findAll(); + } + + @Override + public Message updateMessage(UUID id, String content) { + Message message = repository.findById(id); + if (message != null) { + message.update(content); + repository.save(message); + return message; + } + return null; + } + + @Override + public void deleteMessage(UUID id) { + repository.delete(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java new file mode 100644 index 0000000000..a0782e93c5 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -0,0 +1,50 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.List; +import java.util.UUID; + +public class BasicUserService implements UserService { + private final UserRepository repository; + + public BasicUserService(UserRepository repository) { + this.repository = repository; + } + + @Override + public User createUser(String username, String email) { + User user = new User(username, email); + repository.save(user); + return user; + } + + @Override + public User getUser(UUID id) { + return repository.findById(id); + } + + @Override + public List getAllUsers() { + return repository.findAll(); + } + + @Override + public User updateUser(UUID id, String username, String email) { + User user = repository.findById(id); + if (user != null) { + user.update(username, email); + repository.save(user); + return user; + } + return null; + } + + @Override + public void deleteUser(UUID id) { + repository.delete(id); + } +} + diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java new file mode 100644 index 0000000000..582b264c99 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -0,0 +1,50 @@ +package com.sprint.mission.discodeit.service.file; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.file.FileChannelRepository; +import com.sprint.mission.discodeit.service.ChannelService; + +import java.util.List; +import java.util.UUID; + +public class FileChannelService implements ChannelService { + private final ChannelRepository repository; + + public FileChannelService() { + this.repository = new FileChannelRepository(); + } + + @Override + public Channel createChannel(String name, String description) { + Channel channel = new Channel(name, description); + repository.save(channel); + return channel; + } + + @Override + public Channel getChannel(UUID id) { + return repository.findById(id); + } + + @Override + public List getAllChannels() { + return repository.findAll(); + } + + @Override + public Channel updateChannel(UUID id, String name, String description) { + Channel channel = repository.findById(id); + if(channel != null) { + channel.update(name, description); + repository.save(channel); + return channel; + } + return null; + } + + @Override + public void deleteChannel(UUID id) { + repository.delete(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java new file mode 100644 index 0000000000..27858a7f64 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -0,0 +1,68 @@ +package com.sprint.mission.discodeit.service.file; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.file.FileMessageRepository; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.List; +import java.util.UUID; + +public class FileMessageService implements MessageService { + private final MessageRepository repository; + private final UserService userService; + private final ChannelService channelService; + + public FileMessageService(MessageRepository repository, UserService userService, ChannelService channelService) { + this.repository = repository; + this.userService = userService; + this.channelService = channelService; + } + + @Override + public Message createMessage(UUID userId, UUID channelId, String content) { + User user = userService.getUser(userId); + Channel channel = channelService.getChannel(channelId); + + if (user == null) { + throw new IllegalArgumentException("유저를 찾을 수 없습니다. userId: " + userId); + } + if (channel == null) { + throw new IllegalArgumentException("채널을 찾을 수 없습니다. channelId: " + channelId); + } + + Message message = new Message(userId, channelId, content); + repository.save(message); + return message; + } + + @Override + public Message getMessage(UUID id) { + return repository.findById(id); + } + + @Override + public List getAllMessages() { + return repository.findAll(); + } + + @Override + public Message updateMessage(UUID id, String content) { + Message message = repository.findById(id); + if (message != null) { + message.update(content); + repository.save(message); + return message; + } + return null; + } + + @Override + public void deleteMessage(UUID id) { + repository.delete(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java new file mode 100644 index 0000000000..39a25f39de --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -0,0 +1,50 @@ +package com.sprint.mission.discodeit.service.file; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.file.FileUserRepository; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.List; +import java.util.UUID; + +public class FileUserService implements UserService { + private final UserRepository repository; + + public FileUserService(UserRepository repository) { + this.repository = repository; + } + + @Override + public User createUser(String username, String email) { + User user = new User(username, email); + repository.save(user); + return user; + } + + @Override + public User getUser(UUID id) { + return repository.findById(id); + } + + @Override + public List getAllUsers() { + return repository.findAll(); + } + + @Override + public User updateUser(UUID id, String username, String email) { + User user = repository.findById(id); + if (user != null) { + user.update(username, email); + repository.save(user); + return user; + } + return null; + } + + @Override + public void deleteUser(UUID id) { + repository.delete(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java new file mode 100644 index 0000000000..f366538df4 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -0,0 +1,49 @@ +package com.sprint.mission.discodeit.service.jcf; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.service.ChannelService; + +import java.util.*; + +public class JCFChannelService implements ChannelService { + + private final Map data; + + public JCFChannelService() { + this.data = new HashMap<>(); + } + + + @Override + public Channel createChannel(String name, String description){ + Channel channel = new Channel(name, description); + data.put(channel.getId(), channel); + return channel; + } + + @Override + public Channel getChannel(UUID id) { + return data.get(id); + } + + @Override + public List getAllChannels() { + return new ArrayList<>(data.values()); + } + + @Override + public Channel updateChannel(UUID id, String name, String description) { + Channel channel = data.get(id); + if(channel != null) { + channel.update(name, description); + return channel; + + } + return null; + } + + @Override + public void deleteChannel(UUID id) { + data.remove(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java new file mode 100644 index 0000000000..1baabb1c4a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -0,0 +1,71 @@ +package com.sprint.mission.discodeit.service.jcf; + +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.service.MessageService; + +import java.util.*; + + +public class JCFMessageService implements MessageService { + private final Map data; + private final JCFUserService userService; + private final JCFChannelService channelService; + + public JCFMessageService(JCFUserService userService, JCFChannelService channelService) { + this.data = new HashMap<>(); + this.userService = userService; + this.channelService = channelService; + } + + private void validateUser(User user, UUID userId) { + if (user == null) { + throw new IllegalArgumentException("유저를 찾을 수 없습니다. userId: " + userId); + } + } + + private void validateChannel(Channel channel, UUID channelId) { + if (channel == null) { + throw new IllegalArgumentException("채널을 찾을 수 없습니다. channelId: " + channelId); + } + } + + @Override + public Message createMessage(UUID userId, UUID channelId, String content) { + User user = userService.getUser(userId); + Channel channel = channelService.getChannel(channelId); + + validateUser(user, userId); + validateChannel(channel, channelId); + + Message message = new Message(userId, channelId, content); + data.put(message.getId(), message); + return message; + } + + @Override + public Message getMessage(UUID id) { + return data.get(id); + } + + @Override + public List getAllMessages() { + return new ArrayList<>(data.values()); + } + + @Override + public Message updateMessage(UUID id, String content) { + Message message = data.get(id); + if (message != null) { + message.update(content); + return message; + } + return null; + } + + @Override + public void deleteMessage(UUID id) { + data.remove(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java new file mode 100644 index 0000000000..fab3971364 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -0,0 +1,47 @@ +package com.sprint.mission.discodeit.service.jcf; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.*; + +public class JCFUserService implements UserService { + private final Map data; + + public JCFUserService() { + this.data = new HashMap<>(); + } + + @Override + public User createUser(String username, String email) { + User user = new User(username, email); + data.put(user.getId(), user); + return user; + } + + @Override + public User getUser(UUID id) { + return data.get(id); + } + + @Override + public List getAllUsers() { + return new ArrayList<>(data.values()); + } + + @Override + public User updateUser(UUID id, String username, String email) { + User user = data.get(id); + if(user != null) { + user.update(username, email); + return user; + } + return null; + } + + @Override + public void deleteUser(UUID id) { + data.remove(id); + } +} + From c612539d539f9e42143f7915c6d8068655c4a397 Mon Sep 17 00:00:00 2001 From: Junanaa Date: Mon, 24 Feb 2025 02:01:12 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=EC=8A=A4=ED=94=84=EB=A6=B0=ED=8A=B8=20?= =?UTF-8?q?=EB=AF=B8=EC=85=98=204=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- build.gradle | 43 ++++++------ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 0 settings.gradle | 3 +- .../discodeit/DiscodeitApplication.java | 12 ++++ .../mission/discodeit/JavaApplication.java | 62 ------------------ .../mission/discodeit/entity/Channel.java | 2 + .../mission/discodeit/entity/Message.java | 59 +++++++++-------- .../sprint/mission/discodeit/entity/User.java | 57 ++++++++++++---- .../repository/ChannelRepository.java | 8 ++- .../repository/MessageRepository.java | 13 ++-- .../discodeit/repository/UserRepository.java | 11 +++- .../file/FileChannelRepository.java | 3 + .../file/FileMessageRepository.java | 3 + .../repository/file/FileUserRepository.java | 3 + .../repository/jcf/JCFChannelRepository.java | 30 ++++++--- .../repository/jcf/JCFMessageRepository.java | 38 ++++++++--- .../repository/jcf/JCFUserRepository.java | 49 +++++++++++--- .../discodeit/service/ChannelService.java | 22 ++++--- .../discodeit/service/MessageService.java | 13 ++-- .../discodeit/service/UserService.java | 15 +++-- .../service/basic/BasicChannelService.java | 24 +++---- .../service/basic/BasicMessageService.java | 38 +++++------ .../service/basic/BasicUserService.java | 22 +++---- .../service/file/FileChannelService.java | 2 + src/main/resources/application.yml | 5 ++ 28 files changed, 319 insertions(+), 223 deletions(-) mode change 100644 => 100755 gradlew create mode 100644 src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/JavaApplication.java create mode 100644 src/main/resources/application.yml diff --git a/README.md b/README.md index 81a8535d90..815bede54f 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -# Spring 백엔드 트랙 1기 스프린트 미션 제출 리포지토리 \ No newline at end of file +# 0-spring-mission +스프린트 미션 모범 답안 리포지토리입니다. diff --git a/build.gradle b/build.gradle index 6e970f5400..2adfcfcaa8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,33 +1,36 @@ plugins { - id 'java' - id 'checkstyle' + id 'java' + id 'org.springframework.boot' version '3.4.0' + id 'io.spring.dependency-management' version '1.1.6' } group = 'com.sprint.mission' -version = '1.0-SNAPSHOT' +version = '0.0.1-SNAPSHOT' -repositories { - mavenCentral() +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } } -dependencies { - testImplementation platform('org.junit:junit-bom:5.10.0') - testImplementation 'org.junit.jupiter:junit-jupiter' +configurations { + compileOnly { + extendsFrom annotationProcessor + } } - -checkstyle { - toolVersion = '10.12.4' // 최신 안정 버전으로 업데이트 - configFile = rootProject.file('checkstyle.xml') - ignoreFailures = false +repositories { + mavenCentral() } -test { - useJUnitPlatform() +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } -tasks.withType(Checkstyle) { - reports { - html.required = true // HTML 보고서 생성 - xml.required = false // XML 보고서는 비활성화 - } + +tasks.named('test') { + useJUnitPlatform() } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9355b41557..e2847c8200 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/settings.gradle b/settings.gradle index b710045467..2437dfb29c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1 @@ -rootProject.name = '1-sprint-mission' - +rootProject.name = 'discodeit' diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java new file mode 100644 index 0000000000..039e1d9009 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DiscodeitApplication { + + public static void main(String[] args) { + SpringApplication.run(DiscodeitApplication.class, args); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java deleted file mode 100644 index 5db9890117..0000000000 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.sprint.mission.discodeit; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.repository.MessageRepository; -import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.repository.file.FileChannelRepository; -import com.sprint.mission.discodeit.repository.file.FileMessageRepository; -import com.sprint.mission.discodeit.repository.file.FileUserRepository; -import com.sprint.mission.discodeit.repository.jcf.JCFChannelRepository; -import com.sprint.mission.discodeit.repository.jcf.JCFMessageRepository; -import com.sprint.mission.discodeit.repository.jcf.JCFUserRepository; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.basic.BasicChannelService; -import com.sprint.mission.discodeit.service.basic.BasicMessageService; -import com.sprint.mission.discodeit.service.basic.BasicUserService; - -public class JavaApplication { - static User setupUser(UserService userService) { - User user = userService.createUser("woody", "woody@codeit.com"); - return user; - } - - static Channel setupChannel(ChannelService channelService) { - Channel channel = channelService.createChannel("공지", "공지 채널입니다."); - return channel; - } - - static void messageCreateTest(MessageService messageService, Channel channel, User author) { - Message message = messageService.createMessage(author.getId(), channel.getId(), "안녕하세요."); - System.out.println("메시지 생성: " + message.getId()); - } - - public static void main(String[] args) { - // JCF Repository를 사용하는 경우 - UserRepository userJcfRepo = new JCFUserRepository(); - ChannelRepository channelJcfRepo = new JCFChannelRepository(); - MessageRepository messageJcfRepo = new JCFMessageRepository(); - - UserService userService = new BasicUserService(userJcfRepo); - ChannelService channelService = new BasicChannelService(channelJcfRepo); - MessageService messageService = new BasicMessageService(messageJcfRepo, userService, channelService); - - // File Repository를 사용하는 경우 - UserRepository userFileRepo = new FileUserRepository(); - ChannelRepository channelFileRepo = new FileChannelRepository(); - MessageRepository messageFileRepo = new FileMessageRepository(); - - UserService userFileService = new BasicUserService(userFileRepo); - ChannelService channelFileService = new BasicChannelService(channelFileRepo); - MessageService messageFileService = new BasicMessageService(messageFileRepo, userFileService, channelFileService); - - // 테스트 실행 - User user = setupUser(userService); - Channel channel = setupChannel(channelService); - messageCreateTest(messageService, channel, user); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 0d3c9a907a..fd7096d5b7 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,5 +1,7 @@ package com.sprint.mission.discodeit.entity; +import lombok.Getter; + public class Channel extends AbstractEntity { private String name; private String description; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 1df7fb8b0c..870f90b5f9 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -1,38 +1,45 @@ package com.sprint.mission.discodeit.entity; +import lombok.Getter; + +import java.io.Serializable; +import java.time.Instant; +import java.util.List; import java.util.UUID; -public class Message extends AbstractEntity { - private UUID userId; - private UUID channelId; +@Getter +public class Message implements Serializable { + private static final long serialVersionUID = 1L; + + private UUID id; + private Instant createdAt; + private Instant updatedAt; + // private String content; + // + private UUID channelId; + private UUID authorId; + private List attachmentIds; - public Message(UUID userId, UUID channelId, String content) { - super(); - this.userId = userId; - this.channelId = channelId; + public Message(String content, UUID channelId, UUID authorId, List attachmentIds) { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); + // this.content = content; - } - public UUID getUserId() { - return userId; - } - public UUID getChannelId() { - return channelId; - } - public String getContent() { - return content; + this.channelId = channelId; + this.authorId = authorId; + this.attachmentIds = attachmentIds; } - public void update(String content) { - this.content = content; - updateTimestamp(); - } + public void update(String newContent) { + boolean anyValueUpdated = false; + if (newContent != null && !newContent.equals(this.content)) { + this.content = newContent; + anyValueUpdated = true; + } - public void update(UUID userId, UUID channelId, String content) { - this.userId = userId; - this.channelId = channelId; - this.content = content; - updateTimestamp(); + if (anyValueUpdated) { + this.updatedAt = Instant.now(); + } } - } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index ad44d09649..089ac73025 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -1,22 +1,55 @@ package com.sprint.mission.discodeit.entity; -public class User extends AbstractEntity { +import lombok.Getter; + +import java.io.Serializable; +import java.time.Instant; +import java.util.UUID; + +@Getter +public class User implements Serializable { + private static final long serialVersionUID = 1L; + + private UUID id; + private Instant createdAt; + private Instant updatedAt; + // private String username; private String email; + private String password; + private UUID profileId; // BinaryContent - public User(String username, String email) { + public User(String username, String email, String password, UUID profileId) { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); + // this.username = username; this.email = email; + this.password = password; + this.profileId = profileId; } - public String getUsername() { - return username; - } - public String getEmail() { - return email; - } - public void update(String username, String email){ - this.username = username; - this.email = email; - updateTimestamp(); + + public void update(String newUsername, String newEmail, String newPassword, UUID newProfileId) { + boolean anyValueUpdated = false; + if (newUsername != null && !newUsername.equals(this.username)) { + this.username = newUsername; + anyValueUpdated = true; + } + if (newEmail != null && !newEmail.equals(this.email)) { + this.email = newEmail; + anyValueUpdated = true; + } + if (newPassword != null && !newPassword.equals(this.password)) { + this.password = newPassword; + anyValueUpdated = true; + } + if (newProfileId != null && !newProfileId.equals(this.profileId)) { + this.profileId = newProfileId; + anyValueUpdated = true; + } + + if (anyValueUpdated) { + this.updatedAt = Instant.now(); + } } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 5bc2163a18..326a84f4ba 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -3,11 +3,13 @@ import com.sprint.mission.discodeit.entity.Channel; import java.util.List; +import java.util.Optional; import java.util.UUID; public interface ChannelRepository { - void save(Channel channel); - Channel findById(UUID id); + Channel save(Channel channel); + Optional findById(UUID id); List findAll(); - void delete(UUID id); + boolean existsById(UUID id); + void deleteById(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index 37e430ed38..69547b2226 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -3,11 +3,14 @@ import com.sprint.mission.discodeit.entity.Message; import java.util.List; +import java.util.Optional; import java.util.UUID; public interface MessageRepository { - void save(Message message); - Message findById(UUID id); - List findAll(); - void delete(UUID id); -} \ No newline at end of file + Message save(Message message); + Optional findById(UUID id); + List findAllByChannelId(UUID channelId); + boolean existsById(UUID id); + void deleteById(UUID id); + void deleteAllByChannelId(UUID channelId); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index f58057ef8a..75c52fa8af 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -3,11 +3,16 @@ import com.sprint.mission.discodeit.entity.User; import java.util.List; +import java.util.Optional; import java.util.UUID; public interface UserRepository { - void save(User user); - User findById(UUID id); + User save(User user); + Optional findById(UUID id); + Optional findByUsername(String username); List findAll(); - void delete(UUID id); + boolean existsById(UUID id); + void deleteById(UUID id); + boolean existsByEmail(String email); + boolean existsByUsername(String username); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 04a8a2b5b6..80ea52c62a 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -2,14 +2,17 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; +import org.springframework.stereotype.Repository; import java.io.*; import java.util.*; +@Repository public class FileChannelRepository implements ChannelRepository { private final String filePath = "channels.ser"; private Map data; + public FileChannelRepository() { this.data = loadFromFile(); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index 1518648a9c..b96af20b26 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -2,14 +2,17 @@ import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.repository.MessageRepository; +import org.springframework.stereotype.Repository; import java.io.*; import java.util.*; +@Repository public class FileMessageRepository implements MessageRepository { private final String filePath = "messages.ser"; private Map data; + public FileMessageRepository() { this.data = loadFromFile(); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 3e573bb680..08d2a417b1 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -2,13 +2,16 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.UserRepository; +import org.springframework.stereotype.Repository; import java.io.*; import java.util.*; +@Repository public class FileUserRepository implements UserRepository { private final String filePath = "users.ser"; private Map data; + public FileUserRepository() { this.data = loadFromFile(); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index 18f639b8fa..5e4ec92829 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -2,29 +2,43 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; import java.util.*; +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true) +@Repository public class JCFChannelRepository implements ChannelRepository { - private final Map data = new HashMap<>(); + private final Map data; + + public JCFChannelRepository() { + this.data = new HashMap<>(); + } @Override - public void save(Channel channel) { - data.put(channel.getId(), channel); + public Channel save(Channel channel) { + this.data.put(channel.getId(), channel); + return channel; } @Override - public Channel findById(UUID id) { - return data.get(id); + public Optional findById(UUID id) { + return Optional.ofNullable(this.data.get(id)); } @Override public List findAll() { - return new ArrayList<>(data.values()); + return this.data.values().stream().toList(); + } + + @Override + public boolean existsById(UUID id) { + return this.data.containsKey(id); } @Override - public void delete(UUID id) { - data.remove(id); + public void deleteById(UUID id) { + this.data.remove(id); } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index b7e1390b5d..c0039f9624 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -2,29 +2,49 @@ import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.repository.MessageRepository; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; import java.util.*; +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true) +@Repository public class JCFMessageRepository implements MessageRepository { - private final Map data = new HashMap<>(); + private final Map data; + + public JCFMessageRepository() { + this.data = new HashMap<>(); + } + + @Override + public Message save(Message message) { + this.data.put(message.getId(), message); + return message; + } + + @Override + public Optional findById(UUID id) { + return Optional.ofNullable(this.data.get(id)); + } @Override - public void save(Message message) { - data.put(message.getId(), message); + public List findAllByChannelId(UUID channelId) { + return this.data.values().stream().filter(message -> message.getChannelId().equals(channelId)).toList(); } @Override - public Message findById(UUID id) { - return data.get(id); + public boolean existsById(UUID id) { + return this.data.containsKey(id); } @Override - public List findAll() { - return new ArrayList<>(data.values()); + public void deleteById(UUID id) { + this.data.remove(id); } @Override - public void delete(UUID id) { - data.remove(id); + public void deleteAllByChannelId(UUID channelId) { + this.findAllByChannelId(channelId) + .forEach(message -> this.deleteById(message.getId())); } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index 2c89b4d9b9..ec1bc555fb 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -2,29 +2,60 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.UserRepository; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; import java.util.*; +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true) +@Repository public class JCFUserRepository implements UserRepository { - private final Map data = new HashMap<>(); + private final Map data; + + public JCFUserRepository() { + this.data = new HashMap<>(); + } @Override - public void save(User user) { - data.put(user.getId(), user); + public User save(User user) { + this.data.put(user.getId(), user); + return user; } @Override - public User findById(UUID id) { - return data.get(id); + public Optional findById(UUID id) { + return Optional.ofNullable(this.data.get(id)); + } + + @Override + public Optional findByUsername(String username) { + return this.findAll().stream() + .filter(user -> user.getUsername().equals(username)) + .findFirst(); } @Override public List findAll() { - return new ArrayList<>(data.values()); + return this.data.values().stream().toList(); + } + + @Override + public boolean existsById(UUID id) { + return this.data.containsKey(id); + } + + @Override + public void deleteById(UUID id) { + this.data.remove(id); + } + + @Override + public boolean existsByEmail(String email) { + return this.findAll().stream().anyMatch(user -> user.getEmail().equals(email)); } @Override - public void delete(UUID id) { - data.remove(id); + public boolean existsByUsername(String username) { + return this.findAll().stream().anyMatch(user -> user.getUsername().equals(username)); } -} \ No newline at end of file +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index a175ec3c90..e64bda71fd 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,16 +1,20 @@ package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest; import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.ChannelType; import java.util.List; import java.util.UUID; public interface ChannelService { - - Channel createChannel(String name, String description); - Channel getChannel(UUID id); - List getAllChannels(); - Channel updateChannel(UUID id, String name, String description); - void deleteChannel(UUID id); -} - - + Channel create(PublicChannelCreateRequest request); + Channel create(PrivateChannelCreateRequest request); + ChannelDto find(UUID channelId); + List findAllByUserId(UUID userId); + Channel update(UUID channelId, PublicChannelUpdateRequest request); + void delete(UUID channelId); +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index e0939eb65e..fa517ef918 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,14 +1,17 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest; import com.sprint.mission.discodeit.entity.Message; import java.util.List; import java.util.UUID; public interface MessageService { - Message createMessage(UUID userId, UUID channelId, String content); - Message getMessage(UUID id); - List getAllMessages(); - Message updateMessage(UUID id, String content); - void deleteMessage(UUID id); + Message create(MessageCreateRequest messageCreateRequest, List binaryContentCreateRequests); + Message find(UUID messageId); + List findAllByChannelId(UUID channelId); + Message update(UUID messageId, MessageUpdateRequest request); + void delete(UUID messageId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 508964331e..d824a7806c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,14 +1,19 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserUpdateRequest; import com.sprint.mission.discodeit.entity.User; import java.util.List; +import java.util.Optional; import java.util.UUID; public interface UserService { - User createUser(String username, String email); - User getUser(UUID id); - List getAllUsers(); - User updateUser(UUID id, String username, String email); - void deleteUser(UUID id); + User create(UserCreateRequest userCreateRequest, Optional profileCreateRequest); + UserDto find(UUID userId); + List findAll(); + User update(UUID userId, UserUpdateRequest userUpdateRequest, Optional profileCreateRequest); + void delete(UUID userId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index e1533d4ded..62391b100f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -3,40 +3,41 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.service.ChannelService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import java.util.List; import java.util.UUID; +@Service +@RequiredArgsConstructor public class BasicChannelService implements ChannelService { - private final ChannelRepository repository; - public BasicChannelService(ChannelRepository repository) { - this.repository = repository; - } + private final ChannelRepository channelRepository; @Override public Channel createChannel(String name, String description) { Channel channel = new Channel(name, description); - repository.save(channel); + channelRepository.save(channel); return channel; } @Override public Channel getChannel(UUID id) { - return repository.findById(id); + return channelRepository.findById(id); } @Override public List getAllChannels() { - return repository.findAll(); + return channelRepository.findAll(); } @Override public Channel updateChannel(UUID id, String name, String description) { - Channel channel = repository.findById(id); - if(channel != null) { + Channel channel = channelRepository.findById(id); + if (channel != null) { channel.update(name, description); - repository.save(channel); + channelRepository.save(channel); return channel; } return null; @@ -44,7 +45,6 @@ public Channel updateChannel(UUID id, String name, String description) { @Override public void deleteChannel(UUID id) { - repository.delete(id); + channelRepository.delete(id); } } - diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index a4bffdbc62..eb99323d3d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,60 +1,58 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import java.util.List; import java.util.UUID; +@Service +@RequiredArgsConstructor public class BasicMessageService implements MessageService { - private final MessageRepository repository; + + @Autowired + private final MessageRepository messageRepository; + @Autowired private final UserService userService; - private final ChannelService channelService; - public BasicMessageService(MessageRepository repository, UserService userService, ChannelService channelService) { - this.repository = repository; - this.userService = userService; - this.channelService = channelService; - } + private final ChannelService channelService; @Override public Message createMessage(UUID userId, UUID channelId, String content) { - User user = userService.getUser(userId); - Channel channel = channelService.getChannel(channelId); - - if (user == null) { + if (userService.getUser(userId) == null) { throw new IllegalArgumentException("유저를 찾을 수 없습니다. userId: " + userId); } - if (channel == null) { + if (channelService.getChannel(channelId) == null) { throw new IllegalArgumentException("채널을 찾을 수 없습니다. channelId: " + channelId); } Message message = new Message(userId, channelId, content); - repository.save(message); + messageRepository.save(message); return message; } @Override public Message getMessage(UUID id) { - return repository.findById(id); + return messageRepository.findById(id); } @Override public List getAllMessages() { - return repository.findAll(); + return messageRepository.findAll(); } @Override public Message updateMessage(UUID id, String content) { - Message message = repository.findById(id); + Message message = messageRepository.findById(id); if (message != null) { message.update(content); - repository.save(message); + messageRepository.save(message); return message; } return null; @@ -62,6 +60,6 @@ public Message updateMessage(UUID id, String content) { @Override public void deleteMessage(UUID id) { - repository.delete(id); + messageRepository.delete(id); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index a0782e93c5..152d7ffd0d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -3,40 +3,41 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import java.util.List; import java.util.UUID; +@Service +@RequiredArgsConstructor public class BasicUserService implements UserService { - private final UserRepository repository; - public BasicUserService(UserRepository repository) { - this.repository = repository; - } + private final UserRepository userRepository; @Override public User createUser(String username, String email) { User user = new User(username, email); - repository.save(user); + userRepository.save(user); return user; } @Override public User getUser(UUID id) { - return repository.findById(id); + return userRepository.findById(id); } @Override public List getAllUsers() { - return repository.findAll(); + return userRepository.findAll(); } @Override public User updateUser(UUID id, String username, String email) { - User user = repository.findById(id); + User user = userRepository.findById(id); if (user != null) { user.update(username, email); - repository.save(user); + userRepository.save(user); return user; } return null; @@ -44,7 +45,6 @@ public User updateUser(UUID id, String username, String email) { @Override public void deleteUser(UUID id) { - repository.delete(id); + userRepository.delete(id); } } - diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index 582b264c99..c003b7e36e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -4,10 +4,12 @@ import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.file.FileChannelRepository; import com.sprint.mission.discodeit.service.ChannelService; +import org.springframework.stereotype.Service; import java.util.List; import java.util.UUID; +@Service public class FileChannelService implements ChannelService { private final ChannelRepository repository; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000000..bb9f48db5f --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,5 @@ +spring: + application: + name: discodeit + main: + banner-mode: "off" From 91916a3a0fba90cb485e072e84ff3e1b005a8f08 Mon Sep 17 00:00:00 2001 From: Junanaa Date: Mon, 24 Feb 2025 02:17:14 +0900 Subject: [PATCH 7/7] =?UTF-8?q?=EC=8A=A4=ED=94=84=EB=A6=B0=ED=8A=B8=20?= =?UTF-8?q?=EB=AF=B8=EC=85=98=204=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HELP.md | 22 +++ .../mission/discodeit/api/AuthController.java | 23 +++ .../api/BinaryContentController.java | 41 ++++++ .../discodeit/api/ChannelController.java | 54 +++++++ .../discodeit/api/GlobalExceptionHandler.java | 27 ++++ .../discodeit/api/MessageController.java | 46 ++++++ .../discodeit/api/ReadStatusController.java | 40 +++++ .../mission/discodeit/api/UserController.java | 59 ++++++++ .../discodeit/dto/data/ChannelDto.java | 17 +++ .../mission/discodeit/dto/data/UserDto.java | 15 ++ .../request/BinaryContentCreateRequest.java | 8 + .../discodeit/dto/request/LoginRequest.java | 7 + .../dto/request/MessageCreateRequest.java | 10 ++ .../dto/request/MessageUpdateRequest.java | 6 + .../request/PrivateChannelCreateRequest.java | 9 ++ .../request/PublicChannelCreateRequest.java | 7 + .../request/PublicChannelUpdateRequest.java | 7 + .../dto/request/ReadStatusCreateRequest.java | 11 ++ .../dto/request/ReadStatusUpdateRequest.java | 8 + .../dto/request/UserCreateRequest.java | 8 + .../dto/request/UserStatusCreateRequest.java | 10 ++ .../dto/request/UserStatusUpdateRequest.java | 8 + .../dto/request/UserUpdateRequest.java | 8 + .../response/ResponseBinaryContentDto.java | 11 ++ .../discodeit/entity/BinaryContent.java | 29 ++++ .../mission/discodeit/entity/ChannelType.java | 6 + .../mission/discodeit/entity/ReadStatus.java | 40 +++++ .../mission/discodeit/entity/UserStatus.java | 45 ++++++ .../repository/BinaryContentRepository.java | 15 ++ .../repository/ReadStatusRepository.java | 17 +++ .../repository/UserStatusRepository.java | 17 +++ .../file/FileBinaryContentRepository.java | 109 ++++++++++++++ .../file/FileReadStatusRepository.java | 137 ++++++++++++++++++ .../file/FileUserStatusRepository.java | 121 ++++++++++++++++ .../jcf/JCFBinaryContentRepository.java | 46 ++++++ .../jcf/JCFReadStatusRepository.java | 59 ++++++++ .../jcf/JCFUserStatusRepository.java | 57 ++++++++ .../discodeit/service/AuthService.java | 8 + .../service/BinaryContentService.java | 14 ++ .../discodeit/service/ReadStatusService.java | 16 ++ .../discodeit/service/UserStatusService.java | 17 +++ .../service/basic/BasicAuthService.java | 31 ++++ .../basic/BasicBinaryContentService.java | 52 +++++++ .../service/basic/BasicReadStatusService.java | 74 ++++++++++ .../service/basic/BasicUserStatusService.java | 80 ++++++++++ src/main/resources/application.yaml | 10 ++ src/main/resources/application.yml | 5 - .../discodeit/DiscodeitApplicationTests.java | 13 ++ 48 files changed, 1475 insertions(+), 5 deletions(-) create mode 100644 HELP.md create mode 100644 src/main/java/com/sprint/mission/discodeit/api/AuthController.java create mode 100644 src/main/java/com/sprint/mission/discodeit/api/BinaryContentController.java create mode 100644 src/main/java/com/sprint/mission/discodeit/api/ChannelController.java create mode 100644 src/main/java/com/sprint/mission/discodeit/api/GlobalExceptionHandler.java create mode 100644 src/main/java/com/sprint/mission/discodeit/api/MessageController.java create mode 100644 src/main/java/com/sprint/mission/discodeit/api/ReadStatusController.java create mode 100644 src/main/java/com/sprint/mission/discodeit/api/UserController.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/MessageUpdateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/PrivateChannelCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelUpdateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusUpdateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusUpdateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/response/ResponseBinaryContentDto.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/AuthService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java create mode 100644 src/main/resources/application.yaml delete mode 100644 src/main/resources/application.yml create mode 100644 src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java diff --git a/HELP.md b/HELP.md new file mode 100644 index 0000000000..42c5f00231 --- /dev/null +++ b/HELP.md @@ -0,0 +1,22 @@ +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Gradle documentation](https://docs.gradle.org) +* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.0/gradle-plugin) +* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.0/gradle-plugin/packaging-oci-image.html) +* [Spring Web](https://docs.spring.io/spring-boot/3.4.0/reference/web/servlet.html) + +### Guides +The following guides illustrate how to use some features concretely: + +* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) +* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) +* [Building REST services with Spring](https://spring.io/guides/tutorials/rest/) + +### Additional Links +These additional references should also help you: + +* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle) + diff --git a/src/main/java/com/sprint/mission/discodeit/api/AuthController.java b/src/main/java/com/sprint/mission/discodeit/api/AuthController.java new file mode 100644 index 0000000000..367604f70a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/api/AuthController.java @@ -0,0 +1,23 @@ +package com.sprint.mission.discodeit.api; + +import com.sprint.mission.discodeit.dto.request.LoginRequest; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.AuthService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/auth") +public class AuthController { + private final AuthService authService; + + public AuthController(AuthService authService) { + this.authService = authService; + } + + @RequestMapping(value = "/login", method = RequestMethod.POST) + public ResponseEntity login(@RequestBody LoginRequest request) { + User user = authService.login(request); + return ResponseEntity.ok(user); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/api/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/api/BinaryContentController.java new file mode 100644 index 0000000000..7cde90b3ce --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/api/BinaryContentController.java @@ -0,0 +1,41 @@ +package com.sprint.mission.discodeit.api; + +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.service.BinaryContentService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/api/binary-contents") +public class BinaryContentController { + private final BinaryContentService binaryContentService; + + public BinaryContentController(BinaryContentService binaryContentService) { + this.binaryContentService = binaryContentService; + } + + // POST: 바이너리 파일 업로드 + @RequestMapping(method = RequestMethod.POST) + public ResponseEntity createBinaryContent( BinaryContentCreateRequest request) { + BinaryContent binaryContent = binaryContentService.create(request); + return ResponseEntity.status(201).body(binaryContent); + } + + // GET: 단일 바이너리 파일 조회 + @RequestMapping(value = "/{binaryContentId}", method = RequestMethod.GET) + public ResponseEntity getBinaryContent(@PathVariable UUID binaryContentId) { + BinaryContent binaryContent = binaryContentService.find(binaryContentId); + return ResponseEntity.ok(binaryContent); + } + + // GET: 여러 바이너리 파일 조회 + @RequestMapping(method = RequestMethod.GET) + public ResponseEntity> getBinaryContents(@RequestParam List ids) { + List binaryContents = binaryContentService.findAllByIdIn(ids); + return ResponseEntity.ok(binaryContents); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/api/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/api/ChannelController.java new file mode 100644 index 0000000000..031d878483 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/api/ChannelController.java @@ -0,0 +1,54 @@ +package com.sprint.mission.discodeit.api; + +import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.service.ChannelService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/api/channels") +public class ChannelController { + private final ChannelService channelService; + + public ChannelController(ChannelService channelService) { + this.channelService = channelService; + } + + @RequestMapping(value = "/public", method = RequestMethod.POST) + public ResponseEntity createPublicChannel(@RequestBody PublicChannelCreateRequest request) { + Channel channel = channelService.create(request); + return ResponseEntity.status(HttpStatus.CREATED).body(channel); + } + + @RequestMapping(value = "/private", method = RequestMethod.POST) + public ResponseEntity createPrivateChannel(@RequestBody PrivateChannelCreateRequest request) { + Channel channel = channelService.create(request); + return ResponseEntity.status(HttpStatus.CREATED).body(channel); + } + + @RequestMapping(value = "/{channelId}", method = RequestMethod.PUT) + public ResponseEntity updatePublicChannel(@PathVariable UUID channelId, @RequestBody PublicChannelUpdateRequest request) { + Channel updatedChannel = channelService.update(channelId, request); + return ResponseEntity.ok(updatedChannel); + } + + @RequestMapping(value = "/{channelId}", method = RequestMethod.DELETE) + public ResponseEntity deleteChannel(@PathVariable UUID channelId) { + channelService.delete(channelId); + return ResponseEntity.noContent().build(); + } + + @RequestMapping(value = "/user/{userId}", method = RequestMethod.GET) + public ResponseEntity> getChannelsForUser(@PathVariable UUID userId) { + List channels = channelService.findAllByUserId(userId); + return ResponseEntity.ok(channels); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/api/GlobalExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/api/GlobalExceptionHandler.java new file mode 100644 index 0000000000..5f139d9c00 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/api/GlobalExceptionHandler.java @@ -0,0 +1,27 @@ +package com.sprint.mission.discodeit.api; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.NoSuchElementException; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(NoSuchElementException.class) + public ResponseEntity handleNoSuchElementException(NoSuchElementException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Resource not found: " + e.getMessage()); + } + + @ExceptionHandler(IllegalArgumentException.class) + public ResponseEntity handleIllegalArgumentException(IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid argument: " + e.getMessage()); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleGeneralException(Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("An error occurred: " + e.getMessage()); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/api/MessageController.java b/src/main/java/com/sprint/mission/discodeit/api/MessageController.java new file mode 100644 index 0000000000..eba3230f5d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/api/MessageController.java @@ -0,0 +1,46 @@ +package com.sprint.mission.discodeit.api; + +import com.sprint.mission.discodeit.dto.request.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.service.MessageService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/api/messages") +public class MessageController { + private final MessageService messageService; + + public MessageController(MessageService messageService) { + this.messageService = messageService; + } + + @RequestMapping(method = RequestMethod.POST) + public ResponseEntity createMessage(@RequestBody MessageCreateRequest request) { + Message message = messageService.create(request, List.of()); + return ResponseEntity.status(HttpStatus.CREATED).body(message); + } + + @RequestMapping(value = "/{messageId}", method = RequestMethod.PUT) + public ResponseEntity updateMessage(@PathVariable UUID messageId, @RequestBody MessageUpdateRequest request) { + Message updatedMessage = messageService.update(messageId, request); + return ResponseEntity.ok(updatedMessage); + } + + @RequestMapping(value = "/{messageId}", method = RequestMethod.DELETE) + public ResponseEntity deleteMessage(@PathVariable UUID messageId) { + messageService.delete(messageId); + return ResponseEntity.noContent().build(); + } + + @RequestMapping(value = "/channel/{channelId}", method = RequestMethod.GET) + public ResponseEntity> getMessagesForChannel(@PathVariable UUID channelId) { + List messages = messageService.findAllByChannelId(channelId); + return ResponseEntity.ok(messages); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/api/ReadStatusController.java b/src/main/java/com/sprint/mission/discodeit/api/ReadStatusController.java new file mode 100644 index 0000000000..2976af8127 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/api/ReadStatusController.java @@ -0,0 +1,40 @@ +package com.sprint.mission.discodeit.api; + +import com.sprint.mission.discodeit.dto.request.ReadStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.ReadStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.service.ReadStatusService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/api/read-status") +public class ReadStatusController { + private final ReadStatusService readStatusService; + + public ReadStatusController(ReadStatusService readStatusService) { + this.readStatusService = readStatusService; + } + + @RequestMapping(method = RequestMethod.POST) + public ResponseEntity createReadStatus(@RequestBody ReadStatusCreateRequest request) { + ReadStatus readStatus = readStatusService.create(request); + return ResponseEntity.status(HttpStatus.CREATED).body(readStatus); + } + + @RequestMapping(value = "/{readStatusId}", method = RequestMethod.PUT) + public ResponseEntity updateReadStatus(@PathVariable UUID readStatusId, @RequestBody ReadStatusUpdateRequest request) { + ReadStatus updatedReadStatus = readStatusService.update(readStatusId, request); + return ResponseEntity.ok(updatedReadStatus); + } + + @RequestMapping(value = "/user/{userId}", method = RequestMethod.GET) + public ResponseEntity> getReadStatusForUser(@PathVariable UUID userId) { + List readStatuses = readStatusService.findAllByUserId(userId); + return ResponseEntity.ok(readStatuses); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/api/UserController.java b/src/main/java/com/sprint/mission/discodeit/api/UserController.java new file mode 100644 index 0000000000..01c152717a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/api/UserController.java @@ -0,0 +1,59 @@ +package com.sprint.mission.discodeit.api; + +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.UserCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserUpdateRequest; +import com.sprint.mission.discodeit.dto.request.UserStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.UserStatusService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@RestController +@RequestMapping("/api/users") +public class UserController { + private final UserService userService; + private final UserStatusService userStatusService; + + public UserController(UserService userService, UserStatusService userStatusService) { + this.userService = userService; + this.userStatusService = userStatusService; + } + + @RequestMapping(method = RequestMethod.POST) + public ResponseEntity createUser(@RequestBody UserCreateRequest request) { + User user = userService.create(request, Optional.empty()); + return ResponseEntity.status(HttpStatus.CREATED).body(user); + } + + @RequestMapping(value = "/{userId}", method = RequestMethod.PUT) + public ResponseEntity updateUser(@PathVariable UUID userId, @RequestBody UserUpdateRequest request) { + User updatedUser = userService.update(userId, request, Optional.empty()); + return ResponseEntity.ok(updatedUser); + } + + @RequestMapping(value = "/{userId}", method = RequestMethod.DELETE) + public ResponseEntity deleteUser(@PathVariable UUID userId) { + userService.delete(userId); + return ResponseEntity.noContent().build(); + } + + @RequestMapping(method = RequestMethod.GET) + public ResponseEntity> getAllUsers() { + List users = userService.findAll(); + return ResponseEntity.ok(users); + } + + @RequestMapping(value = "/{userId}/status", method = RequestMethod.PUT) + public ResponseEntity updateUserStatus(@PathVariable UUID userId, @RequestBody UserStatusUpdateRequest request) { + UserStatus updatedStatus = userStatusService.updateByUserId(userId, request); + return ResponseEntity.ok(updatedStatus); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java b/src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java new file mode 100644 index 0000000000..2005105e10 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.dto.data; + +import com.sprint.mission.discodeit.entity.ChannelType; + +import java.time.Instant; +import java.util.List; +import java.util.UUID; + +public record ChannelDto( + UUID id, + ChannelType type, + String name, + String description, + List participantIds, + Instant lastMessageAt +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java b/src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java new file mode 100644 index 0000000000..46881b9d4d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java @@ -0,0 +1,15 @@ +package com.sprint.mission.discodeit.dto.data; + +import java.time.Instant; +import java.util.UUID; + +public record UserDto( + UUID id, + Instant createdAt, + Instant updatedAt, + String username, + String email, + UUID profileId, + Boolean online +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentCreateRequest.java new file mode 100644 index 0000000000..b787a127dd --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentCreateRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.request; + +public record BinaryContentCreateRequest( + String fileName, + String contentType, + byte[] bytes +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java new file mode 100644 index 0000000000..2ab978e2af --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java @@ -0,0 +1,7 @@ +package com.sprint.mission.discodeit.dto.request; + +public record LoginRequest( + String username, + String password +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java new file mode 100644 index 0000000000..dd8c3d24cd --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java @@ -0,0 +1,10 @@ +package com.sprint.mission.discodeit.dto.request; + +import java.util.UUID; + +public record MessageCreateRequest( + String content, + UUID channelId, + UUID authorId +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/MessageUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/MessageUpdateRequest.java new file mode 100644 index 0000000000..d1830fbb94 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/MessageUpdateRequest.java @@ -0,0 +1,6 @@ +package com.sprint.mission.discodeit.dto.request; + +public record MessageUpdateRequest( + String newContent +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/PrivateChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/PrivateChannelCreateRequest.java new file mode 100644 index 0000000000..6b203baa7f --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/PrivateChannelCreateRequest.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.dto.request; + +import java.util.List; +import java.util.UUID; + +public record PrivateChannelCreateRequest( + List participantIds +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java new file mode 100644 index 0000000000..c5b15cc330 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java @@ -0,0 +1,7 @@ +package com.sprint.mission.discodeit.dto.request; + +public record PublicChannelCreateRequest( + String name, + String description +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelUpdateRequest.java new file mode 100644 index 0000000000..6c02341628 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelUpdateRequest.java @@ -0,0 +1,7 @@ +package com.sprint.mission.discodeit.dto.request; + +public record PublicChannelUpdateRequest( + String newName, + String newDescription +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java new file mode 100644 index 0000000000..f2d520af97 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.request; + +import java.time.Instant; +import java.util.UUID; + +public record ReadStatusCreateRequest( + UUID userId, + UUID channelId, + Instant lastReadAt +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusUpdateRequest.java new file mode 100644 index 0000000000..3921ffc754 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusUpdateRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.request; + +import java.time.Instant; + +public record ReadStatusUpdateRequest( + Instant newLastReadAt +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java new file mode 100644 index 0000000000..e1daa625b0 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.request; + +public record UserCreateRequest( + String username, + String email, + String password +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java new file mode 100644 index 0000000000..272a0d4c7b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java @@ -0,0 +1,10 @@ +package com.sprint.mission.discodeit.dto.request; + +import java.time.Instant; +import java.util.UUID; + +public record UserStatusCreateRequest( + UUID userId, + Instant lastActiveAt +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusUpdateRequest.java new file mode 100644 index 0000000000..9a001937a6 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusUpdateRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.request; + +import java.time.Instant; + +public record UserStatusUpdateRequest( + Instant newLastActiveAt +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java new file mode 100644 index 0000000000..d1da4c7a3b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.request; + +public record UserUpdateRequest( + String newUsername, + String newEmail, + String newPassword +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/response/ResponseBinaryContentDto.java b/src/main/java/com/sprint/mission/discodeit/dto/response/ResponseBinaryContentDto.java new file mode 100644 index 0000000000..314d811b66 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/response/ResponseBinaryContentDto.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.response; + +import java.util.UUID; + +public record ResponseBinaryContentDto( + UUID id, + String fileName, + String contentType, + long size +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java new file mode 100644 index 0000000000..3af46c7d17 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -0,0 +1,29 @@ +package com.sprint.mission.discodeit.entity; + +import lombok.Getter; + +import java.io.Serializable; +import java.time.Instant; +import java.util.UUID; + +@Getter +public class BinaryContent implements Serializable { + private static final long serialVersionUID = 1L; + private UUID id; + private Instant createdAt; + // + private String fileName; + private Long size; + private String contentType; + private byte[] bytes; + + public BinaryContent(String fileName, Long size, String contentType, byte[] bytes) { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); + // + this.fileName = fileName; + this.size = size; + this.contentType = contentType; + this.bytes = bytes; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java b/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java new file mode 100644 index 0000000000..9a2ff3f0fd --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java @@ -0,0 +1,6 @@ +package com.sprint.mission.discodeit.entity; + +public enum ChannelType { + PUBLIC, + PRIVATE, +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java new file mode 100644 index 0000000000..79db72e4e2 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java @@ -0,0 +1,40 @@ +package com.sprint.mission.discodeit.entity; + +import lombok.Getter; + +import java.io.Serializable; +import java.time.Instant; +import java.util.UUID; + +@Getter +public class ReadStatus implements Serializable { + private static final long serialVersionUID = 1L; + private UUID id; + private Instant createdAt; + private Instant updatedAt; + // + private UUID userId; + private UUID channelId; + private Instant lastReadAt; + + public ReadStatus(UUID userId, UUID channelId, Instant lastReadAt) { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); + // + this.userId = userId; + this.channelId = channelId; + this.lastReadAt = lastReadAt; + } + + public void update(Instant newLastReadAt) { + boolean anyValueUpdated = false; + if (newLastReadAt != null && !newLastReadAt.equals(this.lastReadAt)) { + this.lastReadAt = newLastReadAt; + anyValueUpdated = true; + } + + if (anyValueUpdated) { + this.updatedAt = Instant.now(); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java new file mode 100644 index 0000000000..53c7865a2e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -0,0 +1,45 @@ +package com.sprint.mission.discodeit.entity; + +import lombok.Getter; + +import java.io.Serializable; +import java.time.Duration; +import java.time.Instant; +import java.util.UUID; + +@Getter +public class UserStatus implements Serializable { + private static final long serialVersionUID = 1L; + private UUID id; + private Instant createdAt; + private Instant updatedAt; + // + private UUID userId; + private Instant lastActiveAt; + + public UserStatus(UUID userId, Instant lastActiveAt) { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); + // + this.userId = userId; + this.lastActiveAt = lastActiveAt; + } + + public void update(Instant lastActiveAt) { + boolean anyValueUpdated = false; + if (lastActiveAt != null && !lastActiveAt.equals(this.lastActiveAt)) { + this.lastActiveAt = lastActiveAt; + anyValueUpdated = true; + } + + if (anyValueUpdated) { + this.updatedAt = Instant.now(); + } + } + + public Boolean isOnline() { + Instant instantFiveMinutesAgo = Instant.now().minus(Duration.ofMinutes(5)); + + return lastActiveAt.isAfter(instantFiveMinutesAgo); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java new file mode 100644 index 0000000000..15e0098747 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -0,0 +1,15 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.BinaryContent; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface BinaryContentRepository { + BinaryContent save(BinaryContent binaryContent); + Optional findById(UUID id); + List findAllByIdIn(List ids); + boolean existsById(UUID id); + void deleteById(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java new file mode 100644 index 0000000000..e0ef9c69b7 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.ReadStatus; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface ReadStatusRepository { + ReadStatus save(ReadStatus readStatus); + Optional findById(UUID id); + List findAllByUserId(UUID userId); + List findAllByChannelId(UUID channelId); + boolean existsById(UUID id); + void deleteById(UUID id); + void deleteAllByChannelId(UUID channelId); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java new file mode 100644 index 0000000000..6651bd2011 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.UserStatus; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface UserStatusRepository { + UserStatus save(UserStatus userStatus); + Optional findById(UUID id); + Optional findByUserId(UUID userId); + List findAll(); + boolean existsById(UUID id); + void deleteById(UUID id); + void deleteByUserId(UUID userId); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java new file mode 100644 index 0000000000..42a5861f34 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java @@ -0,0 +1,109 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file") +@Repository +public class FileBinaryContentRepository implements BinaryContentRepository { + private final Path DIRECTORY; + private final String EXTENSION = ".ser"; + + public FileBinaryContentRepository( + @Value("${discodeit.repository.file-directory:data}") String fileDirectory + ) { + this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory, BinaryContent.class.getSimpleName()); + if (Files.notExists(DIRECTORY)) { + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + private Path resolvePath(UUID id) { + return DIRECTORY.resolve(id + EXTENSION); + } + + @Override + public BinaryContent save(BinaryContent binaryContent) { + Path path = resolvePath(binaryContent.getId()); + try ( + FileOutputStream fos = new FileOutputStream(path.toFile()); + ObjectOutputStream oos = new ObjectOutputStream(fos) + ) { + oos.writeObject(binaryContent); + } catch (IOException e) { + throw new RuntimeException(e); + } + return binaryContent; + } + + @Override + public Optional findById(UUID id) { + BinaryContent binaryContentNullable = null; + Path path = resolvePath(id); + if (Files.exists(path)) { + try ( + FileInputStream fis = new FileInputStream(path.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + binaryContentNullable = (BinaryContent) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + return Optional.ofNullable(binaryContentNullable); + } + + @Override + public List findAllByIdIn(List ids) { + try (Stream paths = Files.list(DIRECTORY)) { + return paths + .filter(path -> path.toString().endsWith(EXTENSION)) + .map(path -> { + try ( + FileInputStream fis = new FileInputStream(path.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + return (BinaryContent) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + }) + .filter(content -> ids.contains(content.getId())) + .toList(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public boolean existsById(UUID id) { + Path path = resolvePath(id); + return Files.exists(path); + } + + @Override + public void deleteById(UUID id) { + Path path = resolvePath(id); + try { + Files.delete(path); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java new file mode 100644 index 0000000000..6a0e8fba9c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java @@ -0,0 +1,137 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file") +@Repository +public class FileReadStatusRepository implements ReadStatusRepository { + private final Path DIRECTORY; + private final String EXTENSION = ".ser"; + + public FileReadStatusRepository( + @Value("${discodeit.repository.file-directory:data}") String fileDirectory + ) { + this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory, ReadStatus.class.getSimpleName()); + if (Files.notExists(DIRECTORY)) { + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + private Path resolvePath(UUID id) { + return DIRECTORY.resolve(id + EXTENSION); + } + + @Override + public ReadStatus save(ReadStatus readStatus) { + Path path = resolvePath(readStatus.getId()); + try ( + FileOutputStream fos = new FileOutputStream(path.toFile()); + ObjectOutputStream oos = new ObjectOutputStream(fos) + ) { + oos.writeObject(readStatus); + } catch (IOException e) { + throw new RuntimeException(e); + } + return readStatus; + } + + @Override + public Optional findById(UUID id) { + ReadStatus readStatusNullable = null; + Path path = resolvePath(id); + if (Files.exists(path)) { + try ( + FileInputStream fis = new FileInputStream(path.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + readStatusNullable = (ReadStatus) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + return Optional.ofNullable(readStatusNullable); + } + + @Override + public List findAllByUserId(UUID userId) { + try (Stream paths = Files.list(DIRECTORY)) { + return paths + .filter(path -> path.toString().endsWith(EXTENSION)) + .map(path -> { + try ( + FileInputStream fis = new FileInputStream(path.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + return (ReadStatus) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + }) + .filter(readStatus -> readStatus.getUserId().equals(userId)) + .toList(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public List findAllByChannelId(UUID channelId) { + try (Stream paths = Files.list(DIRECTORY)) { + return paths + .filter(path -> path.toString().endsWith(EXTENSION)) + .map(path -> { + try ( + FileInputStream fis = new FileInputStream(path.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + return (ReadStatus) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + }) + .filter(readStatus -> readStatus.getChannelId().equals(channelId)) + .toList(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public boolean existsById(UUID id) { + Path path = resolvePath(id); + return Files.exists(path); + } + + @Override + public void deleteById(UUID id) { + Path path = resolvePath(id); + try { + Files.delete(path); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void deleteAllByChannelId(UUID channelId) { + this.findAllByChannelId(channelId) + .forEach(readStatus -> this.deleteById(readStatus.getId())); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java new file mode 100644 index 0000000000..732538dbdb --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java @@ -0,0 +1,121 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.repository.UserStatusRepository; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file") +@Repository +public class FileUserStatusRepository implements UserStatusRepository { + private final Path DIRECTORY; + private final String EXTENSION = ".ser"; + + public FileUserStatusRepository( + @Value("${discodeit.repository.file-directory:data}") String fileDirectory + ) { + this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory, UserStatus.class.getSimpleName()); + if (Files.notExists(DIRECTORY)) { + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + private Path resolvePath(UUID id) { + return DIRECTORY.resolve(id + EXTENSION); + } + + @Override + public UserStatus save(UserStatus userStatus) { + Path path = resolvePath(userStatus.getId()); + try ( + FileOutputStream fos = new FileOutputStream(path.toFile()); + ObjectOutputStream oos = new ObjectOutputStream(fos) + ) { + oos.writeObject(userStatus); + } catch (IOException e) { + throw new RuntimeException(e); + } + return userStatus; + } + + @Override + public Optional findById(UUID id) { + UserStatus userStatusNullable = null; + Path path = resolvePath(id); + if (Files.exists(path)) { + try ( + FileInputStream fis = new FileInputStream(path.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + userStatusNullable = (UserStatus) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + return Optional.ofNullable(userStatusNullable); + } + + @Override + public Optional findByUserId(UUID userId) { + return findAll().stream() + .filter(userStatus -> userStatus.getUserId().equals(userId)) + .findFirst(); + } + + @Override + public List findAll() { + try (Stream paths = Files.list(DIRECTORY)) { + return paths + .filter(path -> path.toString().endsWith(EXTENSION)) + .map(path -> { + try ( + FileInputStream fis = new FileInputStream(path.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + return (UserStatus) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + }) + .toList(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public boolean existsById(UUID id) { + Path path = resolvePath(id); + return Files.exists(path); + } + + @Override + public void deleteById(UUID id) { + Path path = resolvePath(id); + try { + Files.delete(path); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void deleteByUserId(UUID userId) { + this.findByUserId(userId) + .ifPresent(userStatus -> this.deleteById(userStatus.getId())); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java new file mode 100644 index 0000000000..48f55a3ff5 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java @@ -0,0 +1,46 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +import java.util.*; + +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true) +@Repository +public class JCFBinaryContentRepository implements BinaryContentRepository { + private final Map data; + + public JCFBinaryContentRepository() { + this.data = new HashMap<>(); + } + + @Override + public BinaryContent save(BinaryContent binaryContent) { + this.data.put(binaryContent.getId(), binaryContent); + return binaryContent; + } + + @Override + public Optional findById(UUID id) { + return Optional.ofNullable(this.data.get(id)); + } + + @Override + public List findAllByIdIn(List ids) { + return this.data.values().stream() + .filter(content -> ids.contains(content.getId())) + .toList(); + } + + @Override + public boolean existsById(UUID id) { + return this.data.containsKey(id); + } + + @Override + public void deleteById(UUID id) { + this.data.remove(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java new file mode 100644 index 0000000000..9c483eeb95 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java @@ -0,0 +1,59 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +import java.util.*; + +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true) +@Repository +public class JCFReadStatusRepository implements ReadStatusRepository { + private final Map data; + + public JCFReadStatusRepository() { + this.data = new HashMap<>(); + } + + @Override + public ReadStatus save(ReadStatus readStatus) { + this.data.put(readStatus.getId(), readStatus); + return readStatus; + } + + @Override + public Optional findById(UUID id) { + return Optional.ofNullable(this.data.get(id)); + } + + @Override + public List findAllByUserId(UUID userId) { + return this.data.values().stream() + .filter(readStatus -> readStatus.getUserId().equals(userId)) + .toList(); + } + + @Override + public List findAllByChannelId(UUID channelId) { + return this.data.values().stream() + .filter(readStatus -> readStatus.getChannelId().equals(channelId)) + .toList(); + } + + @Override + public boolean existsById(UUID id) { + return this.data.containsKey(id); + } + + @Override + public void deleteById(UUID id) { + this.data.remove(id); + } + + @Override + public void deleteAllByChannelId(UUID channelId) { + this.findAllByChannelId(channelId) + .forEach(readStatus -> this.deleteById(readStatus.getId())); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java new file mode 100644 index 0000000000..334cfad758 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java @@ -0,0 +1,57 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.repository.UserStatusRepository; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +import java.util.*; + +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true) +@Repository +public class JCFUserStatusRepository implements UserStatusRepository { + private final Map data; + + public JCFUserStatusRepository() { + this.data = new HashMap<>(); + } + + @Override + public UserStatus save(UserStatus userStatus) { + this.data.put(userStatus.getId(), userStatus); + return userStatus; + } + + @Override + public Optional findById(UUID id) { + return Optional.ofNullable(this.data.get(id)); + } + + @Override + public Optional findByUserId(UUID userId) { + return this.findAll().stream() + .filter(userStatus -> userStatus.getUserId().equals(userId)) + .findFirst(); + } + + @Override + public List findAll() { + return this.data.values().stream().toList(); + } + + @Override + public boolean existsById(UUID id) { + return this.data.containsKey(id); + } + + @Override + public void deleteById(UUID id) { + this.data.remove(id); + } + + @Override + public void deleteByUserId(UUID userId) { + this.findByUserId(userId) + .ifPresent(userStatus -> this.deleteByUserId(userStatus.getId())); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java new file mode 100644 index 0000000000..fcc2b1af03 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.request.LoginRequest; +import com.sprint.mission.discodeit.entity.User; + +public interface AuthService { + User login(LoginRequest loginRequest); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java new file mode 100644 index 0000000000..77d8358b7b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -0,0 +1,14 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.entity.BinaryContent; + +import java.util.List; +import java.util.UUID; + +public interface BinaryContentService { + BinaryContent create(BinaryContentCreateRequest request); + BinaryContent find(UUID binaryContentId); + List findAllByIdIn(List binaryContentIds); + void delete(UUID binaryContentId); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java new file mode 100644 index 0000000000..fcbc82f99b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java @@ -0,0 +1,16 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.request.ReadStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.ReadStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.ReadStatus; + +import java.util.List; +import java.util.UUID; + +public interface ReadStatusService { + ReadStatus create(ReadStatusCreateRequest request); + ReadStatus find(UUID readStatusId); + List findAllByUserId(UUID userId); + ReadStatus update(UUID readStatusId, ReadStatusUpdateRequest request); + void delete(UUID readStatusId); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java new file mode 100644 index 0000000000..47058277f5 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.request.UserStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.UserStatus; + +import java.util.List; +import java.util.UUID; + +public interface UserStatusService { + UserStatus create(UserStatusCreateRequest request); + UserStatus find(UUID userStatusId); + List findAll(); + UserStatus update(UUID userStatusId, UserStatusUpdateRequest request); + UserStatus updateByUserId(UUID userId, UserStatusUpdateRequest request); + void delete(UUID userStatusId); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java new file mode 100644 index 0000000000..38f67f1c02 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -0,0 +1,31 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.request.LoginRequest; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.AuthService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.NoSuchElementException; + +@RequiredArgsConstructor +@Service +public class BasicAuthService implements AuthService { + private final UserRepository userRepository; + + @Override + public User login(LoginRequest loginRequest) { + String username = loginRequest.username(); + String password = loginRequest.password(); + + User user = userRepository.findByUsername(username) + .orElseThrow(() -> new NoSuchElementException("User with username " + username + " not found")); + + if (!user.getPassword().equals(password)) { + throw new IllegalArgumentException("Wrong password"); + } + + return user; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java new file mode 100644 index 0000000000..74a6532eb2 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -0,0 +1,52 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import com.sprint.mission.discodeit.service.BinaryContentService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + +@RequiredArgsConstructor +@Service +public class BasicBinaryContentService implements BinaryContentService { + private final BinaryContentRepository binaryContentRepository; + + @Override + public BinaryContent create(BinaryContentCreateRequest request) { + String fileName = request.fileName(); + byte[] bytes = request.bytes(); + String contentType = request.contentType(); + BinaryContent binaryContent = new BinaryContent( + fileName, + (long) bytes.length, + contentType, + bytes + ); + return binaryContentRepository.save(binaryContent); + } + + @Override + public BinaryContent find(UUID binaryContentId) { + return binaryContentRepository.findById(binaryContentId) + .orElseThrow(() -> new NoSuchElementException("BinaryContent with id " + binaryContentId + " not found")); + } + + @Override + public List findAllByIdIn(List binaryContentIds) { + return binaryContentRepository.findAllByIdIn(binaryContentIds).stream() + .toList(); + } + + @Override + public void delete(UUID binaryContentId) { + if (!binaryContentRepository.existsById(binaryContentId)) { + throw new NoSuchElementException("BinaryContent with id " + binaryContentId + " not found"); + } + binaryContentRepository.deleteById(binaryContentId); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java new file mode 100644 index 0000000000..18c00fb9ed --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -0,0 +1,74 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.request.ReadStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.ReadStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.ReadStatusService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.Instant; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + +@RequiredArgsConstructor +@Service +public class BasicReadStatusService implements ReadStatusService { + private final ReadStatusRepository readStatusRepository; + private final UserRepository userRepository; + private final ChannelRepository channelRepository; + + @Override + public ReadStatus create(ReadStatusCreateRequest request) { + UUID userId = request.userId(); + UUID channelId = request.channelId(); + + if (!userRepository.existsById(userId)) { + throw new NoSuchElementException("User with id " + userId + " does not exist"); + } + if (!channelRepository.existsById(channelId)) { + throw new NoSuchElementException("Channel with id " + channelId + " does not exist"); + } + if (readStatusRepository.findAllByUserId(userId).stream() + .anyMatch(readStatus -> readStatus.getChannelId().equals(channelId))) { + throw new IllegalArgumentException("ReadStatus with userId " + userId + " and channelId " + channelId + " already exists"); + } + + Instant lastReadAt = request.lastReadAt(); + ReadStatus readStatus = new ReadStatus(userId, channelId, lastReadAt); + return readStatusRepository.save(readStatus); + } + + @Override + public ReadStatus find(UUID readStatusId) { + return readStatusRepository.findById(readStatusId) + .orElseThrow(() -> new NoSuchElementException("ReadStatus with id " + readStatusId + " not found")); + } + + @Override + public List findAllByUserId(UUID userId) { + return readStatusRepository.findAllByUserId(userId).stream() + .toList(); + } + + @Override + public ReadStatus update(UUID readStatusId, ReadStatusUpdateRequest request) { + Instant newLastReadAt = request.newLastReadAt(); + ReadStatus readStatus = readStatusRepository.findById(readStatusId) + .orElseThrow(() -> new NoSuchElementException("ReadStatus with id " + readStatusId + " not found")); + readStatus.update(newLastReadAt); + return readStatusRepository.save(readStatus); + } + + @Override + public void delete(UUID readStatusId) { + if (!readStatusRepository.existsById(readStatusId)) { + throw new NoSuchElementException("ReadStatus with id " + readStatusId + " not found"); + } + readStatusRepository.deleteById(readStatusId); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java new file mode 100644 index 0000000000..ee14451fd6 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -0,0 +1,80 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.request.UserStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.UserStatusRepository; +import com.sprint.mission.discodeit.service.UserStatusService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.Instant; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + +@RequiredArgsConstructor +@Service +public class BasicUserStatusService implements UserStatusService { + private final UserStatusRepository userStatusRepository; + private final UserRepository userRepository; + + @Override + public UserStatus create(UserStatusCreateRequest request) { + UUID userId = request.userId(); + + if (!userRepository.existsById(userId)) { + throw new NoSuchElementException("User with id " + userId + " does not exist"); + } + if (userStatusRepository.findByUserId(userId).isPresent()) { + throw new IllegalArgumentException("UserStatus with id " + userId + " already exists"); + } + + Instant lastActiveAt = request.lastActiveAt(); + UserStatus userStatus = new UserStatus(userId, lastActiveAt); + return userStatusRepository.save(userStatus); + } + + @Override + public UserStatus find(UUID userStatusId) { + return userStatusRepository.findById(userStatusId) + .orElseThrow(() -> new NoSuchElementException("UserStatus with id " + userStatusId + " not found")); + } + + @Override + public List findAll() { + return userStatusRepository.findAll().stream() + .toList(); + } + + @Override + public UserStatus update(UUID userStatusId, UserStatusUpdateRequest request) { + Instant newLastActiveAt = request.newLastActiveAt(); + + UserStatus userStatus = userStatusRepository.findById(userStatusId) + .orElseThrow(() -> new NoSuchElementException("UserStatus with id " + userStatusId + " not found")); + userStatus.update(newLastActiveAt); + + return userStatusRepository.save(userStatus); + } + + @Override + public UserStatus updateByUserId(UUID userId, UserStatusUpdateRequest request) { + Instant newLastActiveAt = request.newLastActiveAt(); + + UserStatus userStatus = userStatusRepository.findByUserId(userId) + .orElseThrow(() -> new NoSuchElementException("UserStatus with userId " + userId + " not found")); + userStatus.update(newLastActiveAt); + + return userStatusRepository.save(userStatus); + } + + @Override + public void delete(UUID userStatusId) { + if (!userStatusRepository.existsById(userStatusId)) { + throw new NoSuchElementException("UserStatus with id " + userStatusId + " not found"); + } + userStatusRepository.deleteById(userStatusId); + } +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 0000000000..08f924e514 --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,10 @@ +spring: + application: + name: discodeit + +discodeit: + repository: + type: file # jcf | file + file-directory: .discodeit +server: + port: 8081 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index bb9f48db5f..0000000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,5 +0,0 @@ -spring: - application: - name: discodeit - main: - banner-mode: "off" diff --git a/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java b/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java new file mode 100644 index 0000000000..3a987a2148 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DiscodeitApplicationTests { + + @Test + void contextLoads() { + } + +}