Compare commits
2272 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
134087c672 | ||
|
|
91a2406827 | ||
|
|
f82f9567c2 | ||
|
|
0a2951c2eb | ||
|
|
5601212f58 | ||
|
|
3451d22460 | ||
|
|
0d5dc6bdd8 | ||
|
|
87e6aedb74 | ||
|
|
9b5bd47760 | ||
|
|
007065b40e | ||
|
|
2e52867df4 | ||
|
|
c5eb8a3f9b | ||
|
|
cacde08e99 | ||
|
|
9443ed5d49 | ||
|
|
e3c702aca1 | ||
|
|
7fbdff391c | ||
|
|
92cb2e7eab | ||
|
|
04136d5b9d | ||
|
|
fd256a6c28 | ||
|
|
e64b8841c5 | ||
|
|
52ae2c3655 | ||
|
|
f1b5f56294 | ||
|
|
ed3b62480c | ||
|
|
365d282119 | ||
|
|
56d0c574f9 | ||
|
|
573937e1e5 | ||
|
|
3892883470 | ||
|
|
d1049b8022 | ||
|
|
8e3f090ffe | ||
|
|
903c39206f | ||
|
|
29dbb36961 | ||
|
|
20851f2a96 | ||
|
|
7bbf2b200b | ||
|
|
e9ac9faa49 | ||
|
|
a15e644a51 | ||
|
|
479679a1c6 | ||
|
|
a50001364f | ||
|
|
7ea7dffd4a | ||
|
|
5ea620a4cd | ||
|
|
4e11c7a9e2 | ||
|
|
9503766a68 | ||
|
|
6b29d54b50 | ||
|
|
19bbd9b528 | ||
|
|
28721c7d20 | ||
|
|
7dbf0a3594 | ||
|
|
e2f7dd67a2 | ||
|
|
3f455199eb | ||
|
|
24f2ffe82d | ||
|
|
86c5d694e5 | ||
|
|
8c963c669b | ||
|
|
d058cacb38 | ||
|
|
c3cb5f20d9 | ||
|
|
abb9ebaf76 | ||
|
|
167ebd6975 | ||
|
|
66d248ec8e | ||
|
|
966cb24911 | ||
|
|
98821c95b6 | ||
|
|
ceaa0b61eb | ||
|
|
89aef130a5 | ||
|
|
57d96b85f1 | ||
|
|
dd4817a65a | ||
|
|
b3dcff2d76 | ||
|
|
8d3d41831d | ||
|
|
066a7041d8 | ||
|
|
50df9bdf4e | ||
|
|
eab9e4ab92 | ||
|
|
56cf46a3a4 | ||
|
|
90442e3e39 | ||
|
|
02c594d4ec | ||
|
|
8c82f811cb | ||
|
|
dbc2713495 | ||
|
|
89ac29a019 | ||
|
|
96d3ae86cc | ||
|
|
071a7fa629 | ||
|
|
0a44a8e78a | ||
|
|
59743ef071 | ||
|
|
077482d759 | ||
|
|
7e6e214f08 | ||
|
|
b6634d26d1 | ||
|
|
5e51eebe8a | ||
|
|
310997f978 | ||
|
|
b67643ed95 | ||
|
|
1b1f4464ee | ||
|
|
1111cf48f3 | ||
|
|
41833712f0 | ||
|
|
f9a26e9195 | ||
|
|
ea76f20825 | ||
|
|
1a6a0d3592 | ||
|
|
0d2c0e91c8 | ||
|
|
bc2a7b902e | ||
|
|
2e7e278ba4 | ||
|
|
06915f5dc3 | ||
|
|
7cbd840060 | ||
|
|
cc8301cc6e | ||
|
|
a9603f44f4 | ||
|
|
04ee5269fe | ||
|
|
afa93aaf9e | ||
|
|
d74bea25aa | ||
|
|
1af78c9bcb | ||
|
|
9f7cc1ae69 | ||
|
|
f4f6ea681e | ||
|
|
21051900f9 | ||
|
|
f96e12a8b3 | ||
|
|
eef47017a3 | ||
|
|
4315d9dfbb | ||
|
|
d7961bf226 | ||
|
|
7dbc8a4253 | ||
|
|
1aee41e7e7 | ||
|
|
f4cdbe985e | ||
|
|
8a0c112072 | ||
|
|
16641f0494 | ||
|
|
5965dcd029 | ||
|
|
e45ef5c49a | ||
|
|
9a1682ebaf | ||
|
|
9eed6ce197 | ||
|
|
d3279694b7 | ||
|
|
8fe6231ebc | ||
|
|
6f0860d954 | ||
|
|
1e62ddce73 | ||
|
|
956d745034 | ||
|
|
ccc69ac2d0 | ||
|
|
68365aa3b7 | ||
|
|
a0581618a4 | ||
|
|
cfcccd0240 | ||
|
|
926de3fa94 | ||
|
|
38ded2c43d | ||
|
|
f324bb603d | ||
|
|
d190616d34 | ||
|
|
d7884f89f5 | ||
|
|
d8ce122254 | ||
|
|
9c1ca78fed | ||
|
|
31c123a09b | ||
|
|
0e93295cdf | ||
|
|
5e7eda6781 | ||
|
|
f31179bb9a | ||
|
|
805b7705b2 | ||
|
|
ae649a0e31 | ||
|
|
d797d7b47a | ||
|
|
7308d0f9c6 | ||
|
|
2ab1f3749c | ||
|
|
52199fb5d3 | ||
|
|
ad497b7386 | ||
|
|
257e98edb2 | ||
|
|
5be23220e4 | ||
|
|
25310d5e88 | ||
|
|
4bc9da3910 | ||
|
|
6dfba3c7b8 | ||
|
|
034201a45b | ||
|
|
d43b9fc6c1 | ||
|
|
94ec584dc3 | ||
|
|
043188ab5e | ||
|
|
2cbffb96fd | ||
|
|
50f7057f68 | ||
|
|
f3b083cafd | ||
|
|
d881ab5fea | ||
|
|
464200e693 | ||
|
|
9ae84a69be | ||
|
|
47184ca01e | ||
|
|
39d4d01814 | ||
|
|
5419478c48 | ||
|
|
52d8ab5389 | ||
|
|
7d6701780c | ||
|
|
dbc055efb4 | ||
|
|
f9c2b4c28e | ||
|
|
7c90baf7bf | ||
|
|
67807a3aa7 | ||
|
|
dca39d6eae | ||
|
|
768d139789 | ||
|
|
af612e4b92 | ||
|
|
ef23fba147 | ||
|
|
5f813c6f70 | ||
|
|
c171728749 | ||
|
|
85c0e1f330 | ||
|
|
8269e61163 | ||
|
|
ae6c09aae2 | ||
|
|
9619584de5 | ||
|
|
dad40d60b3 | ||
|
|
9216a085cf | ||
|
|
f232ffb5cc | ||
|
|
952033f409 | ||
|
|
dc10c7e3e7 | ||
|
|
a84c8bd273 | ||
|
|
2d3d351e26 | ||
|
|
e375188889 | ||
|
|
5860f1fa7a | ||
|
|
6a149c74d1 | ||
|
|
6ae71dba4f | ||
|
|
659cc7f1c6 | ||
|
|
a6a80a8b93 | ||
|
|
722ada3f0e | ||
|
|
aeb479641f | ||
|
|
8a471a5455 | ||
|
|
c8207b479e | ||
|
|
fdaf4380fa | ||
|
|
89d228e605 | ||
|
|
556ed8413f | ||
|
|
e95f09191a | ||
|
|
fa02c20e1c | ||
|
|
f51a074f86 | ||
|
|
915539ca0f | ||
|
|
26353fd28f | ||
|
|
0aa19ed1b0 | ||
|
|
843a9cedaf | ||
|
|
c9b25f73d3 | ||
|
|
df7d2b54bd | ||
|
|
5cb907b0f1 | ||
|
|
832f9c042d | ||
|
|
eaa416c394 | ||
|
|
16645bc568 | ||
|
|
25f9e28230 | ||
|
|
1687b70bde | ||
|
|
d49ceef637 | ||
|
|
da573ac573 | ||
|
|
743eaab9f6 | ||
|
|
202811f3c6 | ||
|
|
6250603440 | ||
|
|
650c7a3ae0 | ||
|
|
42d75decb0 | ||
|
|
55f6aa9ff8 | ||
|
|
0e77caa329 | ||
|
|
da0e73fe11 | ||
|
|
fc5ab3572e | ||
|
|
891738747a | ||
|
|
1c52e731e1 | ||
|
|
ee615fbadf | ||
|
|
2ede9ef8ed | ||
|
|
dbcfcafdfc | ||
|
|
7d63c82ddd | ||
|
|
1d4dc81e55 | ||
|
|
ceca0f095b | ||
|
|
793996e047 | ||
|
|
ab76d46007 | ||
|
|
ed1e22bac5 | ||
|
|
e57ce28d2b | ||
|
|
2b596e226a | ||
|
|
c46f574aa8 | ||
|
|
9b4890a99f | ||
|
|
3f129513bb | ||
|
|
698490b936 | ||
|
|
c8bf95578c | ||
|
|
064132833c | ||
|
|
60f8f93a02 | ||
|
|
7b08d98647 | ||
|
|
11e619d1b3 | ||
|
|
4f184a6723 | ||
|
|
5fd91e808a | ||
|
|
0dfa224aeb | ||
|
|
32565dd188 | ||
|
|
96f09c45f5 | ||
|
|
d2474c8a72 | ||
|
|
9eb0dd5e70 | ||
|
|
bbdcb34ab6 | ||
|
|
6525d63459 | ||
|
|
0babf89aa5 | ||
|
|
317e6f81bb | ||
|
|
ae684d6d39 | ||
|
|
d9710ac244 | ||
|
|
dff7a28094 | ||
|
|
da18950b3d | ||
|
|
6055ce9b6b | ||
|
|
bd14739a9e | ||
|
|
843cbe4f80 | ||
|
|
f650e73d5c | ||
|
|
d1293dd047 | ||
|
|
715e8a5000 | ||
|
|
a7a69008d8 | ||
|
|
553b56d094 | ||
|
|
fec57c4ed7 | ||
|
|
b46f106a91 | ||
|
|
0214419446 | ||
|
|
d587d14f86 | ||
|
|
a115151616 | ||
|
|
26771ee7d0 | ||
|
|
731263638b | ||
|
|
a4f69351ce | ||
|
|
fa5f234a38 | ||
|
|
5d2c981368 | ||
|
|
4a55842724 | ||
|
|
e9655ed05e | ||
|
|
ed7d2bbdd7 | ||
|
|
276328e0fd | ||
|
|
1bcd091330 | ||
|
|
536d7e2957 | ||
|
|
55e774344a | ||
|
|
7d0c8b0c5f | ||
|
|
88c4cff50c | ||
|
|
cfe01bb820 | ||
|
|
4f1bd4e509 | ||
|
|
88544a89b7 | ||
|
|
a87e41eecd | ||
|
|
e52639d1d4 | ||
|
|
0463f5e83d | ||
|
|
eb90314b38 | ||
|
|
6ce1d60ebb | ||
|
|
5fa62c9fbd | ||
|
|
ef93a1f42e | ||
|
|
5f42748e1b | ||
|
|
269df23851 | ||
|
|
c40dc64bd0 | ||
|
|
2b150e3c1c | ||
|
|
f7c17ac7e7 | ||
|
|
3f2638efaf | ||
|
|
f106664952 | ||
|
|
afe8dcc1ff | ||
|
|
8f1e439381 | ||
|
|
4418d031e1 | ||
|
|
f3fc452904 | ||
|
|
89f40fe3de | ||
|
|
f8962beca6 | ||
|
|
dae1569f0e | ||
|
|
dd76c268c5 | ||
|
|
52c52f23d3 | ||
|
|
3adcb9f164 | ||
|
|
0f1a061afe | ||
|
|
95705cc95a | ||
|
|
07b652c1d4 | ||
|
|
eac137a9a9 | ||
|
|
6ec65965a4 | ||
|
|
290ae774e0 | ||
|
|
31e12f682d | ||
|
|
ae52f85502 | ||
|
|
fcda79eb3c | ||
|
|
385f371c06 | ||
|
|
6efb1a6705 | ||
|
|
4695ef3208 | ||
|
|
34e8b79e7e | ||
|
|
3639f943bf | ||
|
|
d373369649 | ||
|
|
9106e70b37 | ||
|
|
4678189ed4 | ||
|
|
78298e1284 | ||
|
|
34c091f232 | ||
|
|
064b650fac | ||
|
|
f8b4cbcc13 | ||
|
|
2f9c8dbb33 | ||
|
|
8bd5db431b | ||
|
|
5754510d7a | ||
|
|
797e2fea1e | ||
|
|
538656fcc7 | ||
|
|
0f66fa528d | ||
|
|
1a42f6dded | ||
|
|
4efdd342d6 | ||
|
|
f15684a562 | ||
|
|
78dfba8771 | ||
|
|
e428e186f0 | ||
|
|
ebf07eddfb | ||
|
|
d3abc44976 | ||
|
|
dc7c10014d | ||
|
|
5e2e8f91c7 | ||
|
|
e5a314bb3a | ||
|
|
9d3882d5b9 | ||
|
|
a647007a0f | ||
|
|
e04a4908cf | ||
|
|
cfe0272022 | ||
|
|
2e3b55d9e8 | ||
|
|
6b8ebe11de | ||
|
|
1fffd36054 | ||
|
|
2b25fea86c | ||
|
|
409a8311b1 | ||
|
|
6996c008d0 | ||
|
|
64fa52452c | ||
|
|
16d33b1c1f | ||
|
|
0a260a67d5 | ||
|
|
1aacd3cb23 | ||
|
|
5af3ba9db6 | ||
|
|
14bfd78f63 | ||
|
|
febc672e6e | ||
|
|
a18dcfce9e | ||
|
|
48410c428a | ||
|
|
da1df91f49 | ||
|
|
b2df6e6d41 | ||
|
|
8315c61240 | ||
|
|
1ff7ebb04a | ||
|
|
ab914f4621 | ||
|
|
51ef00e0f2 | ||
|
|
2b4df5be16 | ||
|
|
f98da25fda | ||
|
|
4c305b7cc0 | ||
|
|
5c979a532f | ||
|
|
fcf2427878 | ||
|
|
31e923fc67 | ||
|
|
1c2ebb8c5d | ||
|
|
29e75a4851 | ||
|
|
3765661a4e | ||
|
|
628984c09d | ||
|
|
a630653d88 | ||
|
|
e693b908be | ||
|
|
f36b2433a0 | ||
|
|
47af0d0356 | ||
|
|
d4c587c668 | ||
|
|
dda453975b | ||
|
|
c28801ff27 | ||
|
|
4e609ebc33 | ||
|
|
1257e96d5e | ||
|
|
122a3ab4ce | ||
|
|
136cb43cd1 | ||
|
|
ad8086d2b6 | ||
|
|
d00641a73c | ||
|
|
197be51047 | ||
|
|
53c40a87b2 | ||
|
|
b304c13034 | ||
|
|
cb895d17ff | ||
|
|
f0dd3aada3 | ||
|
|
2d055c8d8d | ||
|
|
aad4482a78 | ||
|
|
d71536ab86 | ||
|
|
fe25d52082 | ||
|
|
0441662e0c | ||
|
|
0f40bc4cce | ||
|
|
13e9c20be0 | ||
|
|
17bab31b18 | ||
|
|
26f11fabb7 | ||
|
|
b892749c75 | ||
|
|
810b08c50d | ||
|
|
fc71a757dd | ||
|
|
6c324414b1 | ||
|
|
d7283b92ac | ||
|
|
d67fdbc24e | ||
|
|
1edaf15220 | ||
|
|
38bd2bd011 | ||
|
|
da4ac6d709 | ||
|
|
9e16629d69 | ||
|
|
0aefab34f1 | ||
|
|
05b4ddfd46 | ||
|
|
74f2d6bea6 | ||
|
|
5392c9fd38 | ||
|
|
cd8e12c747 | ||
|
|
591b292fbf | ||
|
|
3610525c88 | ||
|
|
1db3ecca22 | ||
|
|
0168ef4014 | ||
|
|
25450a4182 | ||
|
|
8cc6b048fd | ||
|
|
cf094a2048 | ||
|
|
10881c8f5b | ||
|
|
23c6c8b331 | ||
|
|
cf8a437361 | ||
|
|
653c0faa18 | ||
|
|
b108e5bf45 | ||
|
|
5e5597ef19 | ||
|
|
edb5cb4ee5 | ||
|
|
3b81108738 | ||
|
|
110f5e02f4 | ||
|
|
a4a7ce51ad | ||
|
|
08a7dbe319 | ||
|
|
0b9e6d52b4 | ||
|
|
ecf0a4f299 | ||
|
|
d3fe5cdf34 | ||
|
|
d3d5c11675 | ||
|
|
ae30b4359f | ||
|
|
bda1b0a304 | ||
|
|
839f3e52ef | ||
|
|
a85f6b8287 | ||
|
|
fe9f86b432 | ||
|
|
c0a3bdcf99 | ||
|
|
94125fa5dd | ||
|
|
a77971ae13 | ||
|
|
e7f153a5e5 | ||
|
|
8cd39861f8 | ||
|
|
dcff407670 | ||
|
|
3b453dea13 | ||
|
|
9981b8f16c | ||
|
|
da4663aa83 | ||
|
|
3895bbc801 | ||
|
|
7285e2b2c9 | ||
|
|
e9bf26e0ca | ||
|
|
ec0319d256 | ||
|
|
1bfefbd083 | ||
|
|
8967343079 | ||
|
|
b3ba06aecb | ||
|
|
8cdcd7105a | ||
|
|
cc6d8d28b5 | ||
|
|
b55e13dbeb | ||
|
|
bbe8c46df9 | ||
|
|
16a56457ed | ||
|
|
a4c0728e28 | ||
|
|
d6907f3f3a | ||
|
|
3f126be081 | ||
|
|
cbf0b3c05e | ||
|
|
0f0470b93c | ||
|
|
d104c6dbf4 | ||
|
|
a8705be6ee | ||
|
|
f54ba4b018 | ||
|
|
884b410dce | ||
|
|
e5945fa720 | ||
|
|
b155a9908b | ||
|
|
d67e4a3491 | ||
|
|
97d0ab1b75 | ||
|
|
f5befcc95f | ||
|
|
ab047944b6 | ||
|
|
ce5f927a8d | ||
|
|
dcb777d6ea | ||
|
|
decf728d91 | ||
|
|
098f8a52f7 | ||
|
|
1eeb7f8303 | ||
|
|
4b7177101a | ||
|
|
73cf3eb869 | ||
|
|
b4da35a0ab | ||
|
|
e3d92c27e8 | ||
|
|
8addb49012 | ||
|
|
ac1e557c46 | ||
|
|
d1651b54ec | ||
|
|
f61dbdccec | ||
|
|
9beff11125 | ||
|
|
d8c0a82411 | ||
|
|
2add9a02f9 | ||
|
|
2910a6effd | ||
|
|
5621a651a1 | ||
|
|
c83e816bda | ||
|
|
948e5a2dde | ||
|
|
94cd17909d | ||
|
|
bcfa3efef7 | ||
|
|
bf87eb68e2 | ||
|
|
a84298de86 | ||
|
|
ee47c6d727 | ||
|
|
ef5bd95620 | ||
|
|
b36703fc47 | ||
|
|
b2112ca8b9 | ||
|
|
7952545f0d | ||
|
|
c997fbafb0 | ||
|
|
60c8d3b832 | ||
|
|
778c1852b8 | ||
|
|
08cc287dff | ||
|
|
17b7ef80ba | ||
|
|
a4532cb834 | ||
|
|
dc2bc7fbf7 | ||
|
|
d37dd66ec5 | ||
|
|
79bbeea7f0 | ||
|
|
5b56de784d | ||
|
|
620dd0be78 | ||
|
|
7267fd080e | ||
|
|
2d8e03cc69 | ||
|
|
b797492dbd | ||
|
|
eb41d8b16d | ||
|
|
d791aa2e4f | ||
|
|
f969841464 | ||
|
|
93d63508dc | ||
|
|
84e7935971 | ||
|
|
730bedf0a5 | ||
|
|
0ed223ef01 | ||
|
|
fc677ca0e9 | ||
|
|
c02f95c2fc | ||
|
|
76b5affaaa | ||
|
|
72c7cc2c67 | ||
|
|
13b9749e8f | ||
|
|
3f76521bfe | ||
|
|
837cf10e36 | ||
|
|
e8fe7cc853 | ||
|
|
5db96847fc | ||
|
|
746b01f8ca | ||
|
|
eb2218c220 | ||
|
|
657ec411c3 | ||
|
|
9895806d23 | ||
|
|
5957e4b264 | ||
|
|
c544c4d6b5 | ||
|
|
061af3f827 | ||
|
|
4d8708a5ee | ||
|
|
9eb1870196 | ||
|
|
e961a44511 | ||
|
|
c16a35ec8c | ||
|
|
841566a5d1 | ||
|
|
4a822c5920 | ||
|
|
ce554fc442 | ||
|
|
e9a515ac34 | ||
|
|
b14b53329c | ||
|
|
b8641258d6 | ||
|
|
6022aff965 | ||
|
|
18eaae80ec | ||
|
|
a4e41462c7 | ||
|
|
f8bed154ce | ||
|
|
8ee3f7ab66 | ||
|
|
77c7efbe89 | ||
|
|
8d78ef5946 | ||
|
|
4571a3b50b | ||
|
|
b48197c8aa | ||
|
|
bb45c0c34b | ||
|
|
25c316165e | ||
|
|
1246f3aa21 | ||
|
|
49cd31fd41 | ||
|
|
94e6380485 | ||
|
|
36b5315075 | ||
|
|
c66ccfeda2 | ||
|
|
ae0cfe1575 | ||
|
|
79ff36d49a | ||
|
|
d6742812c8 | ||
|
|
13dc721cb0 | ||
|
|
57967835bd | ||
|
|
db9913c725 | ||
|
|
c3e3f4e947 | ||
|
|
f33937bc5d | ||
|
|
c176a5b80a | ||
|
|
e2db8c07af | ||
|
|
c224892609 | ||
|
|
f5ed9d93c3 | ||
|
|
88145694ce | ||
|
|
d58f7fd089 | ||
|
|
c32b53b3c0 | ||
|
|
9dfef527a3 | ||
|
|
df51c8b9a4 | ||
|
|
499c4a27d3 | ||
|
|
bfe08acfec | ||
|
|
ffae976e11 | ||
|
|
ced8eb419f | ||
|
|
0ab2eaa630 | ||
|
|
d385f555dd | ||
|
|
268e5cbdb1 | ||
|
|
247649ec34 | ||
|
|
2ada6d969d | ||
|
|
a4d2740f24 | ||
|
|
df7266cc75 | ||
|
|
3255b73a44 | ||
|
|
305e81bef1 | ||
|
|
84cc6e9140 | ||
|
|
b8d95f4b31 | ||
|
|
c0f7d02f44 | ||
|
|
7fc6b61f21 | ||
|
|
ed3a1296d8 | ||
|
|
66c62d8875 | ||
|
|
7d1b06471f | ||
|
|
b7309cdda8 | ||
|
|
6ffc12ef97 | ||
|
|
79b2d39305 | ||
|
|
b3525ea6a5 | ||
|
|
b5ceec4883 | ||
|
|
4287082f4b | ||
|
|
e3a8d12d4b | ||
|
|
ce15c26b59 | ||
|
|
48940272ae | ||
|
|
8c64538207 | ||
|
|
0460033281 | ||
|
|
8240cb9c0f | ||
|
|
e385f054df | ||
|
|
03ae935756 | ||
|
|
d196f455cb | ||
|
|
50bb13b7cd | ||
|
|
652afd6b57 | ||
|
|
d1cb176b31 | ||
|
|
767131a117 | ||
|
|
f0dadcef70 | ||
|
|
1f20024b91 | ||
|
|
f5c7197dda | ||
|
|
cb497fe720 | ||
|
|
bef0e40db8 | ||
|
|
24073b20ab | ||
|
|
64d83d9048 | ||
|
|
5c0b06f27d | ||
|
|
b09e2c11eb | ||
|
|
8c119a76d1 | ||
|
|
04a9788bc0 | ||
|
|
883e7f96ee | ||
|
|
d276be9594 | ||
|
|
2fc6b0a8cb | ||
|
|
9f295d8399 | ||
|
|
024f454702 | ||
|
|
821ad4de2e | ||
|
|
b864f9c6a9 | ||
|
|
31e0a8a88b | ||
|
|
be3d2b6552 | ||
|
|
e2eb546069 | ||
|
|
b2ae3b4fee | ||
|
|
5b9e5f904b | ||
|
|
7d1843f485 | ||
|
|
f1e2704407 | ||
|
|
17b4a0525d | ||
|
|
5cdba3c00a | ||
|
|
79b5551ec1 | ||
|
|
ac840323be | ||
|
|
c2e7863ca0 | ||
|
|
01b065b3c2 | ||
|
|
55907a9a05 | ||
|
|
6e9dcdbb50 | ||
|
|
0265ea45b2 | ||
|
|
ccb7e41434 | ||
|
|
38317c5497 | ||
|
|
9f62de0420 | ||
|
|
e8e4af7286 | ||
|
|
2c5d30a0ff | ||
|
|
eb27db2232 | ||
|
|
adb6337a27 | ||
|
|
624bb0a7e5 | ||
|
|
757829d286 | ||
|
|
c5f055718a | ||
|
|
a12c8f4dbc | ||
|
|
f072afa6ef | ||
|
|
686d77dcc1 | ||
|
|
7da227cdfa | ||
|
|
abcfaa05e2 | ||
|
|
aa144b0439 | ||
|
|
15329a97fe | ||
|
|
223b2678b4 | ||
|
|
930923e330 | ||
|
|
8fe929d8ab | ||
|
|
e12207fc73 | ||
|
|
ef05949e5a | ||
|
|
a2f7edcbcd | ||
|
|
7f80638928 | ||
|
|
222d6cdca1 | ||
|
|
aa733542e3 | ||
|
|
2b142baf19 | ||
|
|
78bfd1ff64 | ||
|
|
7ea1309146 | ||
|
|
a7be7a3e7a | ||
|
|
a14fd303fc | ||
|
|
b632a991b9 | ||
|
|
06aae24dad | ||
|
|
3bf04802e4 | ||
|
|
6f79e63b3f | ||
|
|
67cfdedcc4 | ||
|
|
f0c6295cff | ||
|
|
6c5629a0d7 | ||
|
|
06726758d2 | ||
|
|
866c7d4f2f | ||
|
|
17695927d5 | ||
|
|
ea8638c843 | ||
|
|
0fbc1095be | ||
|
|
b914e8388d | ||
|
|
31911a40c0 | ||
|
|
00a2a23190 | ||
|
|
5f25e605d3 | ||
|
|
d4f81f086c | ||
|
|
e048813c43 | ||
|
|
1186f2fb14 | ||
|
|
a2cdf6559d | ||
|
|
9d6d74ce98 | ||
|
|
dbc7023c00 | ||
|
|
6fd84dba8f | ||
|
|
e444a52b6a | ||
|
|
d431a81cf0 | ||
|
|
dcb03a2250 | ||
|
|
8d6e016e48 | ||
|
|
f067af664e | ||
|
|
6355e4e3bc | ||
|
|
e2f9c18a27 | ||
|
|
cc93dba508 | ||
|
|
b1f270c082 | ||
|
|
d086de8103 | ||
|
|
523ca2f7fc | ||
|
|
a2888b009d | ||
|
|
143e2908ad | ||
|
|
98542bd5d5 | ||
|
|
ee0a71de1b | ||
|
|
9f8cb6ca34 | ||
|
|
759fb8a802 | ||
|
|
ab06eaeca8 | ||
|
|
267b3a9547 | ||
|
|
0b49ecfc12 | ||
|
|
23b03919e6 | ||
|
|
4f165f3b27 | ||
|
|
967a4c7748 | ||
|
|
03c23f0fda | ||
|
|
44bad0146c | ||
|
|
d92d6e84d0 | ||
|
|
355b64fda4 | ||
|
|
c1632f8e65 | ||
|
|
1fa16bd8dd | ||
|
|
0ac531674c | ||
|
|
18a61061e1 | ||
|
|
b0e349212d | ||
|
|
9913e67928 | ||
|
|
888c837cdd | ||
|
|
0e03fb6393 | ||
|
|
317fed304c | ||
|
|
681cf349e6 | ||
|
|
313cf858f0 | ||
|
|
fa94fd075f | ||
|
|
3433d211a5 | ||
|
|
dcda3c7329 | ||
|
|
d2563063d1 | ||
|
|
9557baf22a | ||
|
|
c7b1d4514f | ||
|
|
09cd8bcb99 | ||
|
|
3046d63ad4 | ||
|
|
de9c2d3d85 | ||
|
|
2454c50380 | ||
|
|
e2f8156a4d | ||
|
|
6ea6a61e90 | ||
|
|
b978b6756e | ||
|
|
cbae83106b | ||
|
|
424f854145 | ||
|
|
faf72705cb | ||
|
|
381e72f1ef | ||
|
|
91fe549c25 | ||
|
|
a472da9ea6 | ||
|
|
20c7fe81dc | ||
|
|
3ef445eb2e | ||
|
|
4afc38523d | ||
|
|
15616e8d07 | ||
|
|
2534921af9 | ||
|
|
0206198f55 | ||
|
|
3c8c402f10 | ||
|
|
098dae9640 | ||
|
|
42c38de3e2 | ||
|
|
be10e6a9de | ||
|
|
6b5fb81e01 | ||
|
|
bb5991b111 | ||
|
|
8f261970e9 | ||
|
|
093a8f18ef | ||
|
|
9c19b5b785 | ||
|
|
35958ca3a2 | ||
|
|
3bc2e97e8b | ||
|
|
eb7ff77461 | ||
|
|
d36f4cf6f8 | ||
|
|
f373669f02 | ||
|
|
37596589a7 | ||
|
|
3e90426d8e | ||
|
|
35a184827a | ||
|
|
2edd3c5614 | ||
|
|
cec5a6ceeb | ||
|
|
dc6b0b4dde | ||
|
|
3ecc1816be | ||
|
|
9a90c2e568 | ||
|
|
ab747d0338 | ||
|
|
8753f91a4a | ||
|
|
f8af109821 | ||
|
|
a1a7900254 | ||
|
|
804eb6c076 | ||
|
|
f4f3ff0eda | ||
|
|
03c0b1ea91 | ||
|
|
38535bde84 | ||
|
|
17e1fa54cf | ||
|
|
a4f5dd9d89 | ||
|
|
6269902140 | ||
|
|
b964e424b2 | ||
|
|
73665f62b3 | ||
|
|
3fca780132 | ||
|
|
b5e01dcb5e | ||
|
|
f180b89a9c | ||
|
|
98a903e60c | ||
|
|
c20cc8fb18 | ||
|
|
99f5c4e12f | ||
|
|
17759f9a98 | ||
|
|
6c0e96213f | ||
|
|
2c89d80a27 | ||
|
|
e314fd4a0a | ||
|
|
affbe9f5a9 | ||
|
|
7a423eb6e1 | ||
|
|
7137924baa | ||
|
|
c998bce34f | ||
|
|
f5d4397f0b | ||
|
|
608b166b32 | ||
|
|
472cda8315 | ||
|
|
7a78e5d869 | ||
|
|
8effca3a7c | ||
|
|
fab52b6a56 | ||
|
|
e98ef5f5f2 | ||
|
|
7aa84607c8 | ||
|
|
928fc374c7 | ||
|
|
4ea8cb5903 | ||
|
|
db6acacf2e | ||
|
|
59aa71b3b8 | ||
|
|
ccfa487493 | ||
|
|
9fcc41aeff | ||
|
|
d9a4fa3f49 | ||
|
|
6c821dc42a | ||
|
|
d58e34ed3d | ||
|
|
ff37d1cb02 | ||
|
|
dcf119ae59 | ||
|
|
1338cf875a | ||
|
|
ed3e299e0b | ||
|
|
f85645a78a | ||
|
|
e412abd017 | ||
|
|
1efa654e7d | ||
|
|
00b58068dc | ||
|
|
7be5208daf | ||
|
|
7ad555a41b | ||
|
|
872f70a418 | ||
|
|
c37d2e78d2 | ||
|
|
b606d066fc | ||
|
|
d4608eec26 | ||
|
|
0bc8e231ad | ||
|
|
2dab5e4a78 | ||
|
|
c6aa37851d | ||
|
|
31bd106ffd | ||
|
|
74cea2b41c | ||
|
|
46f9a00b75 | ||
|
|
450d8c21cf | ||
|
|
2073bc77c8 | ||
|
|
b6a5501f71 | ||
|
|
e27b98cdc1 | ||
|
|
8af500462f | ||
|
|
30fc4c28b7 | ||
|
|
74b582369a | ||
|
|
c9ab2b507b | ||
|
|
2b479319c1 | ||
|
|
3a3ac012bb | ||
|
|
00265a7e8e | ||
|
|
0dafb50223 | ||
|
|
ac9620c253 | ||
|
|
6e226b165c | ||
|
|
6226f65e20 | ||
|
|
7de29c29e9 | ||
|
|
deed6c7bbe | ||
|
|
c234e2ca3d | ||
|
|
19bffa288d | ||
|
|
9303096430 | ||
|
|
98d5f5ee3e | ||
|
|
ba16fceeb8 | ||
|
|
c49b5f78bf | ||
|
|
446688d5b2 | ||
|
|
e2cacd9c4b | ||
|
|
d5c9e08888 | ||
|
|
ab0ead4e05 | ||
|
|
9a267db583 | ||
|
|
fb15cbef90 | ||
|
|
97e5d9f610 | ||
|
|
305ee394b1 | ||
|
|
a251d521a1 | ||
|
|
b5065cb52f | ||
|
|
dca16e83d3 | ||
|
|
c5256fe2cb | ||
|
|
1b93ba5355 | ||
|
|
fd7171f5a4 | ||
|
|
685fc1a37b | ||
|
|
a738c93163 | ||
|
|
4ac863fa6a | ||
|
|
fed369ad5d | ||
|
|
f2c91d015e | ||
|
|
e122349f9e | ||
|
|
bb07c3ab45 | ||
|
|
65a4b38ee5 | ||
|
|
bbc3f5c19a | ||
|
|
0b4ba548a5 | ||
|
|
747b963bd4 | ||
|
|
32b9820725 | ||
|
|
b217fede87 | ||
|
|
a9ce8a3b2e | ||
|
|
7914e7bc14 | ||
|
|
ed8716510b | ||
|
|
efd2ae59f5 | ||
|
|
1923d0b809 | ||
|
|
99f6752590 | ||
|
|
131746f94e | ||
|
|
f0ed6973c8 | ||
|
|
2cf070a26c | ||
|
|
3c68ecb7f1 | ||
|
|
243f5fcda4 | ||
|
|
e22b7f36ce | ||
|
|
308ea15763 | ||
|
|
e26f9c58fa | ||
|
|
4ca758174e | ||
|
|
bf8e35e168 | ||
|
|
2a3265ed71 | ||
|
|
3a06617a7d | ||
|
|
d75eb456dc | ||
|
|
8ed0f8ec73 | ||
|
|
185e0dce6e | ||
|
|
d9e74a78f0 | ||
|
|
700483dd48 | ||
|
|
1c80b820cb | ||
|
|
59e5cfb04d | ||
|
|
b06550e2cb | ||
|
|
ca4bf13569 | ||
|
|
eae3a50435 | ||
|
|
de2956ec3c | ||
|
|
a2e62c9fb5 | ||
|
|
e7fdc318f1 | ||
|
|
62dd559b7c | ||
|
|
4a631753a0 | ||
|
|
b696984655 | ||
|
|
f1dbec122a | ||
|
|
47cb54461f | ||
|
|
91e03f7cfd | ||
|
|
c0314d95c9 | ||
|
|
8e17b3ff51 | ||
|
|
b932a659b6 | ||
|
|
80b2ed19e0 | ||
|
|
88000926f4 | ||
|
|
12245fefed | ||
|
|
8eebd5fb9a | ||
|
|
c5b0e31d36 | ||
|
|
5c5e828cc6 | ||
|
|
ecb11cf927 | ||
|
|
485241d080 | ||
|
|
8701f8868c | ||
|
|
e68086e149 | ||
|
|
16a2d80801 | ||
|
|
d5e5659a2c | ||
|
|
3c2e8dcf87 | ||
|
|
03320e8644 | ||
|
|
40ae6ccf2f | ||
|
|
bcbade3729 | ||
|
|
58a6f9cae3 | ||
|
|
bf154eb8c3 | ||
|
|
766b6e9fef | ||
|
|
d89a41d4c7 | ||
|
|
d24a7d7b22 | ||
|
|
57a746fc21 | ||
|
|
2c1bd41fba | ||
|
|
6260cf24cc | ||
|
|
88d4a670d4 | ||
|
|
ea0b6c5ee5 | ||
|
|
20f61042fc | ||
|
|
2751a967e8 | ||
|
|
93057870a7 | ||
|
|
6b98c3fed5 | ||
|
|
eb63ed926d | ||
|
|
b72787f5bb | ||
|
|
0793b2ab38 | ||
|
|
604ed3e3e1 | ||
|
|
0aefbc2c7d | ||
|
|
eb1fa90788 | ||
|
|
65f02e5139 | ||
|
|
bbfe65a905 | ||
|
|
59468eb162 | ||
|
|
1889a283ee | ||
|
|
0655b2021d | ||
|
|
a1b8c9b6fd | ||
|
|
c4a60bc6f6 | ||
|
|
eb7037eea8 | ||
|
|
7546083cd5 | ||
|
|
74ee36f43a | ||
|
|
f8c3e4d66f | ||
|
|
6db8d9a38a | ||
|
|
61145a2d03 | ||
|
|
4a9410742a | ||
|
|
db78e4ef03 | ||
|
|
7b0eb4e79d | ||
|
|
17f6b8eb2a | ||
|
|
37c40d7dda | ||
|
|
1a2aa876e3 | ||
|
|
39822f323f | ||
|
|
338acfba75 | ||
|
|
490f4f36f1 | ||
|
|
69c46f684f | ||
|
|
1626406557 | ||
|
|
f662defcf9 | ||
|
|
8f07f8e9e1 | ||
|
|
7e44f7f110 | ||
|
|
b211a66e99 | ||
|
|
0bdb066820 | ||
|
|
4ee84e10fd | ||
|
|
ab706f4076 | ||
|
|
bd7266653f | ||
|
|
08f968dced | ||
|
|
9f9ebd838a | ||
|
|
a03f89fb68 | ||
|
|
51146a4ed5 | ||
|
|
80301f2cb2 | ||
|
|
9a9f26c435 | ||
|
|
eebe9cbd5f | ||
|
|
503d43b552 | ||
|
|
b3077fc15d | ||
|
|
fdc462d071 | ||
|
|
f44a26da3c | ||
|
|
d12d03fd5e | ||
|
|
51ee2df755 | ||
|
|
a89bb33015 | ||
|
|
7659cca8ba | ||
|
|
f754e951f7 | ||
|
|
e2905d01ac | ||
|
|
9d691f2452 | ||
|
|
a426c8bb26 | ||
|
|
bc8b1722b0 | ||
|
|
ac31c612b3 | ||
|
|
03c3eea54e | ||
|
|
bccaf16343 | ||
|
|
30df45ef2e | ||
|
|
6500ba48a7 | ||
|
|
03b35721a2 | ||
|
|
14327d4462 | ||
|
|
1b968903e2 | ||
|
|
b719e95e6e | ||
|
|
318eb2f47d | ||
|
|
010f24e5c3 | ||
|
|
db9762c5b2 | ||
|
|
d1ebcde725 | ||
|
|
545f9cad2d | ||
|
|
3247d84b6b | ||
|
|
e73f0a916a | ||
|
|
150af5ff8b | ||
|
|
1659ab146d | ||
|
|
86e17d38d4 | ||
|
|
1809c59f25 | ||
|
|
4eb9661730 | ||
|
|
4acbe4b31a | ||
|
|
df17dd749f | ||
|
|
20e5a88e56 | ||
|
|
0a939a5b91 | ||
|
|
6ad7c30a18 | ||
|
|
e6bfc60139 | ||
|
|
c866baa4eb | ||
|
|
91303acdbe | ||
|
|
1273af4b1b | ||
|
|
e682b408f3 | ||
|
|
0a0c206998 | ||
|
|
44ffd98d0c | ||
|
|
53ec93c8f8 | ||
|
|
f779ed7628 | ||
|
|
f2fdb74f23 | ||
|
|
4ba87e3349 | ||
|
|
7abee90992 | ||
|
|
159a9e00c8 | ||
|
|
9c62f38345 | ||
|
|
1443f5f997 | ||
|
|
17d8a124cd | ||
|
|
5cd565306e | ||
|
|
67010e20d7 | ||
|
|
704604f6fe | ||
|
|
e687f56c7f | ||
|
|
ff85575e98 | ||
|
|
26be25c218 | ||
|
|
d3d5e0cbfb | ||
|
|
4796bf632c | ||
|
|
5eef365baf | ||
|
|
937ff63af9 | ||
|
|
33211bfb27 | ||
|
|
a243da8b1e | ||
|
|
62e605a443 | ||
|
|
2bdaaa5a33 | ||
|
|
bcad3c1ced | ||
|
|
b865f5d6e7 | ||
|
|
00664822ec | ||
|
|
4594c15de7 | ||
|
|
2b6ec1672c | ||
|
|
d44d5711cb | ||
|
|
54cb13ba62 | ||
|
|
c32f5dd951 | ||
|
|
2e6c42c8ac | ||
|
|
5757b86d39 | ||
|
|
9df4a79827 | ||
|
|
071dd46a4c | ||
|
|
030d619910 | ||
|
|
c56fd399c1 | ||
|
|
31c954db0e | ||
|
|
cb6a040c4d | ||
|
|
51c3a753a9 | ||
|
|
c28c592c80 | ||
|
|
fc07f851f7 | ||
|
|
ab4a5e6719 | ||
|
|
88e9dd54b2 | ||
|
|
f53f34559a | ||
|
|
3e5d9a394f | ||
|
|
3f287eb148 | ||
|
|
dfe854a236 | ||
|
|
3854c7bba2 | ||
|
|
01c066419d | ||
|
|
040b1d9bc8 | ||
|
|
6c4acbad68 | ||
|
|
b5c11ece57 | ||
|
|
50696d2e88 | ||
|
|
e7661fd4be | ||
|
|
957e11eff0 | ||
|
|
bd6e8d093a | ||
|
|
f7b5a86a09 | ||
|
|
97fd107f47 | ||
|
|
fc688dca99 | ||
|
|
fe3bd2a1f1 | ||
|
|
3625befc0b | ||
|
|
6e6508aafd | ||
|
|
3a8a0a541e | ||
|
|
650495306f | ||
|
|
5664c34790 | ||
|
|
b1c66997ca | ||
|
|
114ffd4667 | ||
|
|
ad1770ec95 | ||
|
|
5f22402761 | ||
|
|
c11094a11e | ||
|
|
6873bf384e | ||
|
|
42242daf9b | ||
|
|
1f96b960ab | ||
|
|
f6b30ed0c6 | ||
|
|
c59dc129a8 | ||
|
|
472c1a9e3e | ||
|
|
24fe8ab4a4 | ||
|
|
453c6f05bd | ||
|
|
248de7f1f2 | ||
|
|
3bbf84861e | ||
|
|
0dac9044a5 | ||
|
|
a981d1082a | ||
|
|
803d0c2ae2 | ||
|
|
06e44cc649 | ||
|
|
fd01e5c263 | ||
|
|
ecc47dcfbb | ||
|
|
b6e06dfdc2 | ||
|
|
eb630b23ae | ||
|
|
eae7a48991 | ||
|
|
9436c836e6 | ||
|
|
7c64239b36 | ||
|
|
80ba371296 | ||
|
|
6787563efe | ||
|
|
9def85f9ba | ||
|
|
6d55f35404 | ||
|
|
1902c37924 | ||
|
|
02b5ff38a4 | ||
|
|
f076a927c9 | ||
|
|
6184eaa30e | ||
|
|
a42b72e9ce | ||
|
|
f4dcae722c | ||
|
|
bbcb3e9403 | ||
|
|
3d690b7c72 | ||
|
|
b4ab2c69ae | ||
|
|
4a7f406edb | ||
|
|
9e18bcaeb8 | ||
|
|
9abfe233bc | ||
|
|
3267958541 | ||
|
|
af5ee45206 | ||
|
|
300b72b9b8 | ||
|
|
42af55a740 | ||
|
|
3c1e6d0e5c | ||
|
|
edf7df368e | ||
|
|
cde38e012f | ||
|
|
bef4f0c4e2 | ||
|
|
bf081dce32 | ||
|
|
0bb3cb4aab | ||
|
|
0d5132f710 | ||
|
|
cad147faf8 | ||
|
|
cc405b83e2 | ||
|
|
c65f5b7279 | ||
|
|
c216340120 | ||
|
|
ff5cbc490e | ||
|
|
27cba5ba31 | ||
|
|
9976b8132f | ||
|
|
dbc5bd96f3 | ||
|
|
9489ab862b | ||
|
|
1bb634bc6f | ||
|
|
07b5c7fef4 | ||
|
|
4a7cfab543 | ||
|
|
426ef5cb88 | ||
|
|
5b86412407 | ||
|
|
4f8fcd2d3d | ||
|
|
16c40aa51c | ||
|
|
6449c4a53d | ||
|
|
d670356388 | ||
|
|
fb4c8549dc | ||
|
|
42dc5c1f0f | ||
|
|
659c3bc1cf | ||
|
|
f5684f2c45 | ||
|
|
1d2d2b1c9c | ||
|
|
bc06ba54b9 | ||
|
|
1b6e223456 | ||
|
|
9e4a2168c0 | ||
|
|
46aa26a444 | ||
|
|
4d01aa3006 | ||
|
|
2c308af615 | ||
|
|
caf4ab60cd | ||
|
|
4a8d37bde1 | ||
|
|
3289dd8419 | ||
|
|
13473eeb4d | ||
|
|
4264cd8830 | ||
|
|
edcc215774 | ||
|
|
3085fffb49 | ||
|
|
81a6e4b46c | ||
|
|
e0d612c92f | ||
|
|
fadbb91287 | ||
|
|
72146c08ae | ||
|
|
0c7cb274b4 | ||
|
|
a08c499c95 | ||
|
|
a879bbce59 | ||
|
|
f11f8b3e0e | ||
|
|
7842545627 | ||
|
|
2a0f8f5ce3 | ||
|
|
4ae3ad7abd | ||
|
|
a16025ca95 | ||
|
|
fdefe09187 | ||
|
|
06370a763c | ||
|
|
691e2580e5 | ||
|
|
f40369d061 | ||
|
|
046c523880 | ||
|
|
b3b7ae26cf | ||
|
|
49424b8b56 | ||
|
|
68ff4a52dc | ||
|
|
07c932e9e6 | ||
|
|
cbe3abeab0 | ||
|
|
3d5e3ce6cf | ||
|
|
4efdabc1ff | ||
|
|
8ca495ec50 | ||
|
|
69aba02c9a | ||
|
|
42225dd35e | ||
|
|
ad4c9fcc83 | ||
|
|
ef4d0c3c42 | ||
|
|
59cc45eaab | ||
|
|
f64c40e91f | ||
|
|
46d7d30089 | ||
|
|
48f15bb71c | ||
|
|
ac70b1d11b | ||
|
|
d720082644 | ||
|
|
1f45b642e9 | ||
|
|
83228d8aa6 | ||
|
|
34f1e50f90 | ||
|
|
b0c518a0d6 | ||
|
|
aa673a3a5c | ||
|
|
40d58f6bc2 | ||
|
|
7604b24ffc | ||
|
|
a47c0c91a3 | ||
|
|
0232f52281 | ||
|
|
08eba71c8a | ||
|
|
577a9249d1 | ||
|
|
ea6461bd0a | ||
|
|
f58c94146a | ||
|
|
6efe13d142 | ||
|
|
0a8fdc6cc8 | ||
|
|
b91b298174 | ||
|
|
f87038622b | ||
|
|
8b077848bb | ||
|
|
2945e6f8bf | ||
|
|
0f760dc388 | ||
|
|
5a9b5db99b | ||
|
|
6ba51fb338 | ||
|
|
146aa497f9 | ||
|
|
e7bc82d152 | ||
|
|
26f8172b1a | ||
|
|
634584400a | ||
|
|
7d6be79ba8 | ||
|
|
cef208f6ef | ||
|
|
f4921d1317 | ||
|
|
7f1a74b576 | ||
|
|
3dc11777c6 | ||
|
|
b536165910 | ||
|
|
7c7aa9e7a7 | ||
|
|
2b03b57b5c | ||
|
|
77c6120014 | ||
|
|
b82ff7b88d | ||
|
|
a16a75230c | ||
|
|
0e27b302bc | ||
|
|
c369ab9b1c | ||
|
|
bb267ccae7 | ||
|
|
efe24658a4 | ||
|
|
5cdf9e7551 | ||
|
|
4390302384 | ||
|
|
dab00e7fb2 | ||
|
|
929c5e7a5b | ||
|
|
d600042110 | ||
|
|
0a58e7433e | ||
|
|
5639c985df | ||
|
|
9fbfbfb23b | ||
|
|
ecd2f0e2bf | ||
|
|
60418276bd | ||
|
|
170392f0bc | ||
|
|
6744745152 | ||
|
|
009ae6a235 | ||
|
|
bf5f72c00b | ||
|
|
84aca5b9e1 | ||
|
|
6164266870 | ||
|
|
cc9df9c586 | ||
|
|
29a268d476 | ||
|
|
18d7aab703 | ||
|
|
373e6b6c8e | ||
|
|
71fab4f6be | ||
|
|
de55c14a16 | ||
|
|
e8517e954d | ||
|
|
78281fc82c | ||
|
|
bc260fffde | ||
|
|
db00a08bdc | ||
|
|
85cf7f26ce | ||
|
|
acca147ff2 | ||
|
|
d53da0e422 | ||
|
|
11eaaab72d | ||
|
|
475e64fc5b | ||
|
|
1bd8154ac4 | ||
|
|
d2fa0e7852 | ||
|
|
f2b324abc2 | ||
|
|
d2225dd841 | ||
|
|
8d26aa86b9 | ||
|
|
7e937d7d29 | ||
|
|
fe4b534b78 | ||
|
|
d0a65c7c68 | ||
|
|
416f87f4bb | ||
|
|
7eeb67be28 | ||
|
|
7ed6ee5075 | ||
|
|
d3c8215e15 | ||
|
|
30bc6c274e | ||
|
|
ecb1068f0b | ||
|
|
f6eef21b45 | ||
|
|
1aeff25316 | ||
|
|
6de569537f | ||
|
|
764bc3fead | ||
|
|
a89d617532 | ||
|
|
fef33795d0 | ||
|
|
d2c04b761d | ||
|
|
c5828aba91 | ||
|
|
1286f9dcb6 | ||
|
|
391e525fc5 | ||
|
|
afc32b1cfa | ||
|
|
0797181967 | ||
|
|
14c5e631ff | ||
|
|
5cdb039c33 | ||
|
|
a11c4fcb58 | ||
|
|
c67a937d40 | ||
|
|
03fa7137b9 | ||
|
|
e95400988e | ||
|
|
942c9c6a63 | ||
|
|
6c45665fde | ||
|
|
d92ac8f588 | ||
|
|
169665da32 | ||
|
|
c4d80b4844 | ||
|
|
7827749453 | ||
|
|
5e78697a69 | ||
|
|
a0e6a78496 | ||
|
|
af99a93536 | ||
|
|
e9ea117985 | ||
|
|
b9ddb0140f | ||
|
|
dae70371d1 | ||
|
|
228cbb4082 | ||
|
|
679c913f3a | ||
|
|
03fb7947c3 | ||
|
|
c39f5a27b2 | ||
|
|
dbdb516f3c | ||
|
|
c1a97b7356 | ||
|
|
a6d8f7ea24 | ||
|
|
574c7600e0 | ||
|
|
d1c0205d77 | ||
|
|
13c29d2c1e | ||
|
|
dc1a0f050e | ||
|
|
e252a00d55 | ||
|
|
5bedbb7c7d | ||
|
|
e510418152 | ||
|
|
8197ae6aa7 | ||
|
|
9d619d520d | ||
|
|
46605479e9 | ||
|
|
6d20eddd43 | ||
|
|
c1ee2a0adb | ||
|
|
9d29d49ada | ||
|
|
e7b95892ff | ||
|
|
4bf5c77374 | ||
|
|
df4a75f4b0 | ||
|
|
4bdb4cbbb5 | ||
|
|
4cdcdee8e4 | ||
|
|
e6c36411cb | ||
|
|
a4788a95af | ||
|
|
b5de638c0b | ||
|
|
c1a210313e | ||
|
|
ab0ed67f81 | ||
|
|
5d54d5b7d6 | ||
|
|
1d09ffa529 | ||
|
|
eef9d15aaa | ||
|
|
8034ddc413 | ||
|
|
e75adb165a | ||
|
|
09ce0d5285 | ||
|
|
cc1ad41e94 | ||
|
|
8a38646bc5 | ||
|
|
a2b65f52f6 | ||
|
|
c16d8da784 | ||
|
|
a55582a018 | ||
|
|
ea6d472002 | ||
|
|
3dc4290f2a | ||
|
|
6c43f75f9f | ||
|
|
e0c6972bed | ||
|
|
1ab3e04cba | ||
|
|
1b8f664c8a | ||
|
|
25adfe5b28 | ||
|
|
7637b2bec2 | ||
|
|
6b3d984ca6 | ||
|
|
da5bfe32af | ||
|
|
cfab49a7dd | ||
|
|
f93d22ae22 | ||
|
|
91b9e50fd0 | ||
|
|
1b457b0be6 | ||
|
|
d77894c8fe | ||
|
|
366f7621fa | ||
|
|
984bc37e29 | ||
|
|
604de144b9 | ||
|
|
5dddaeb6e5 | ||
|
|
7790686a84 | ||
|
|
60950f056b | ||
|
|
ef07634e09 | ||
|
|
f70a20f740 | ||
|
|
c1cda2d536 | ||
|
|
2b03e7aea8 | ||
|
|
58cea3e947 | ||
|
|
f02fb7ba15 | ||
|
|
fbafcd0cbc | ||
|
|
bf09c88e6e | ||
|
|
cb8f7e0ddb | ||
|
|
f63aa33082 | ||
|
|
7bdf6717e1 | ||
|
|
2fc2801ad4 | ||
|
|
2bb6061a44 | ||
|
|
a0e3488af0 | ||
|
|
8fef1f975a | ||
|
|
17fad47ca1 | ||
|
|
b0aa168c9a | ||
|
|
367888968b | ||
|
|
11c65e6b90 | ||
|
|
e9699ed8cc | ||
|
|
812362338e | ||
|
|
b7ff0cf2a2 | ||
|
|
fa21ae6161 | ||
|
|
fb815c0be0 | ||
|
|
27c6a187a2 | ||
|
|
852d3b9f48 | ||
|
|
10884b8175 | ||
|
|
5f37414fee | ||
|
|
e95644ada2 | ||
|
|
ab4aee93c1 | ||
|
|
5df94a03fe | ||
|
|
ab9f3a1635 | ||
|
|
110c43b97a | ||
|
|
e0a86a8016 | ||
|
|
9e7f3b83c4 | ||
|
|
011960b159 | ||
|
|
d23a3cedef | ||
|
|
b782b539a5 | ||
|
|
2930e49d61 | ||
|
|
45777e6047 | ||
|
|
204b27ca5d | ||
|
|
dde8f427af | ||
|
|
1db0966675 | ||
|
|
b4c16002ff | ||
|
|
ca23c76426 | ||
|
|
0c50815944 | ||
|
|
185f3c05fb | ||
|
|
bde88ecc79 | ||
|
|
38e5b1f853 | ||
|
|
83fffe717e | ||
|
|
8757faf965 | ||
|
|
9b61fb1f85 | ||
|
|
16a6465453 | ||
|
|
1d3f05c22b | ||
|
|
470bdb6efb | ||
|
|
fa53530055 | ||
|
|
02d0b4c99b | ||
|
|
ca9ac35eb5 | ||
|
|
cb68f83451 | ||
|
|
972675d4da | ||
|
|
347b1dd31c | ||
|
|
d34e729e32 | ||
|
|
4954dcead8 | ||
|
|
a2f3677784 | ||
|
|
fb22b8bba5 | ||
|
|
c0ca3569fd | ||
|
|
bae5042eea | ||
|
|
a5f831e81e | ||
|
|
6cb6c60eba | ||
|
|
d4098180b6 | ||
|
|
9bec4b2713 | ||
|
|
82b899f883 | ||
|
|
69daec4f86 | ||
|
|
e5d348140c | ||
|
|
8ba136e0a3 | ||
|
|
63f48a3c4c | ||
|
|
e9d10bc012 | ||
|
|
96be2e6262 | ||
|
|
91fa230016 | ||
|
|
d4b33a1342 | ||
|
|
8d08bc7fd1 | ||
|
|
7c08249e08 | ||
|
|
4f5fff96e0 | ||
|
|
cf6379283b | ||
|
|
9659638f0c | ||
|
|
433fef9992 | ||
|
|
d60039454a | ||
|
|
d90b31c5df | ||
|
|
965dac5ff9 | ||
|
|
564f77bcdc | ||
|
|
6136ac4116 | ||
|
|
bba84b4d11 | ||
|
|
b52317f56b | ||
|
|
98f2806be6 | ||
|
|
ebf7a1d40d | ||
|
|
0ce164079e | ||
|
|
3693d2e93d | ||
|
|
d3a38963ae | ||
|
|
9ab9ae0408 | ||
|
|
0abb4a82b1 | ||
|
|
94a579e7d3 | ||
|
|
9d132d7f92 | ||
|
|
0315abc0df | ||
|
|
24e04f1303 | ||
|
|
51c2f845d8 | ||
|
|
edc81534c4 | ||
|
|
b10ba999cd | ||
|
|
12d10ce8b5 | ||
|
|
c4554cb4e9 | ||
|
|
0e575a9366 | ||
|
|
13efbf5f98 | ||
|
|
c8be20e9f2 | ||
|
|
15aabb3859 | ||
|
|
b2a9867297 | ||
|
|
e734b000de | ||
|
|
127e5af6f3 | ||
|
|
319f46406c | ||
|
|
ddf79d06d0 | ||
|
|
fafad9217d | ||
|
|
08022497e6 | ||
|
|
29f849c184 | ||
|
|
1572d9df89 | ||
|
|
4c297164a5 | ||
|
|
a7c8eda290 | ||
|
|
1bcd2d4531 | ||
|
|
eb1e596cde | ||
|
|
9bbcf0c5d7 | ||
|
|
341ec6e9a0 | ||
|
|
7e9234e712 | ||
|
|
fec33c0b96 | ||
|
|
af2917adb9 | ||
|
|
2e1459e29c | ||
|
|
95f6035aa8 | ||
|
|
d6e7cfb044 | ||
|
|
8dc04667b0 | ||
|
|
c108115c83 | ||
|
|
bcae7720e1 | ||
|
|
399d0b94d5 | ||
|
|
a5712e1216 | ||
|
|
3805db1263 | ||
|
|
88b8a5323a | ||
|
|
02510528d1 | ||
|
|
7deffeffd8 | ||
|
|
4d4520226d | ||
|
|
9f80e0a0e6 | ||
|
|
2ed3fd3cba | ||
|
|
3698f1dab8 | ||
|
|
fb4c02ca9b | ||
|
|
9cec4b0c8e | ||
|
|
6cef26f893 | ||
|
|
e2b5b7016c | ||
|
|
2d55e2edd5 | ||
|
|
85dbf4f98f | ||
|
|
d13a6b0c36 | ||
|
|
48f03f306a | ||
|
|
f1c11ac114 | ||
|
|
97ec9602f7 | ||
|
|
53cdf884ef | ||
|
|
d8a729c961 | ||
|
|
25f24801d6 | ||
|
|
e6b302abf9 | ||
|
|
c0c08fe373 | ||
|
|
60e29cc894 | ||
|
|
dcfd802757 | ||
|
|
84a01569d6 | ||
|
|
72ed38156a | ||
|
|
0e9e02de0b | ||
|
|
58163cefa0 | ||
|
|
c4ec54f6e4 | ||
|
|
de7dae4455 | ||
|
|
6362500741 | ||
|
|
9b3d1f5734 | ||
|
|
123aad2707 | ||
|
|
0bed7ee669 | ||
|
|
7d8d314962 | ||
|
|
f01a6e82dc | ||
|
|
67d7ee2751 | ||
|
|
04f8a7247d | ||
|
|
7b6ef76d54 | ||
|
|
ed65ad842f | ||
|
|
a33fe330f7 | ||
|
|
b30da3eea4 | ||
|
|
05fbbfcf39 | ||
|
|
09aec06790 | ||
|
|
00a52475de | ||
|
|
6c03211ac4 | ||
|
|
ca18958669 | ||
|
|
e1f58f07fe | ||
|
|
9d28736849 | ||
|
|
739096a9c0 | ||
|
|
2775d9b78a | ||
|
|
4f01b0b2ad | ||
|
|
2427671093 | ||
|
|
8c9d1b7dec | ||
|
|
55c8399084 | ||
|
|
a1067492b7 | ||
|
|
961beb3e85 | ||
|
|
23e86f1067 | ||
|
|
a1333dcace | ||
|
|
82690b5f2f | ||
|
|
70b97aa856 | ||
|
|
05210e2a8b | ||
|
|
751c278052 | ||
|
|
9a1620d51f | ||
|
|
157cd9a035 | ||
|
|
010736839a | ||
|
|
2c26efb5a9 | ||
|
|
fe9e2aa287 | ||
|
|
2585014ace | ||
|
|
0410003ceb | ||
|
|
e1a0c2fc48 | ||
|
|
b0a8c0a35a | ||
|
|
0fca91ca37 | ||
|
|
65ba2d2e27 | ||
|
|
188ca8fc58 | ||
|
|
3b80b74730 | ||
|
|
d9f5f960a5 | ||
|
|
e31da8bbd0 | ||
|
|
1e602975f3 | ||
|
|
541ccda754 | ||
|
|
1b68363b80 | ||
|
|
fc11b3c463 | ||
|
|
f9f36cd1d6 | ||
|
|
566c05bcef | ||
|
|
effb21bc6c | ||
|
|
4c92ee4a8a | ||
|
|
8f5b5ab0f9 | ||
|
|
5dacbfc17e | ||
|
|
5defc18a64 | ||
|
|
d2ba299f42 | ||
|
|
e78e5d6f32 | ||
|
|
ebbdcbe5a5 | ||
|
|
1d0ca5f11e | ||
|
|
d22935703d | ||
|
|
d66a567b8f | ||
|
|
34695f2aa3 | ||
|
|
dcacd88f11 | ||
|
|
2bbf794501 | ||
|
|
e3937c5ef2 | ||
|
|
a93775bb64 | ||
|
|
eddcac2343 | ||
|
|
95c125a5af | ||
|
|
927380741c | ||
|
|
861dfc43a8 | ||
|
|
a1cbf8724f | ||
|
|
cae88e7946 | ||
|
|
952ad0e162 | ||
|
|
b751156b5c | ||
|
|
aad27f40cf | ||
|
|
55d7c6e672 | ||
|
|
75590eb765 | ||
|
|
dfdb952e2b | ||
|
|
c09ebc146b | ||
|
|
139ef08af3 | ||
|
|
2d13a5fd35 | ||
|
|
a3fb32dfc6 | ||
|
|
079efe5de6 | ||
|
|
4d28ccebad | ||
|
|
2171acc909 | ||
|
|
1e05811c13 | ||
|
|
ec023ec13e | ||
|
|
996570cc57 | ||
|
|
7cf712daff | ||
|
|
9a35af9fb2 | ||
|
|
ede3b07963 | ||
|
|
53a4b90d96 | ||
|
|
bf948789ea | ||
|
|
db116f39fd | ||
|
|
c962a19eb7 | ||
|
|
571c83314a | ||
|
|
d906d49930 | ||
|
|
344bafff45 | ||
|
|
4858390346 | ||
|
|
f16f0e3069 | ||
|
|
3ee12221a4 | ||
|
|
8915848a52 | ||
|
|
a2cd7c8007 | ||
|
|
6e9b9341d4 | ||
|
|
e90d8a87ee | ||
|
|
45c43888e7 | ||
|
|
68e7dfb1cc | ||
|
|
f086f33097 | ||
|
|
737ce2c2e7 | ||
|
|
3c7c7cde3c | ||
|
|
3913d9e48e | ||
|
|
84d4645efa | ||
|
|
8a7442648c | ||
|
|
f1616461f7 | ||
|
|
ed2a5af5ed | ||
|
|
3b73a4c69a | ||
|
|
17954dfdc9 | ||
|
|
3aadf61fde | ||
|
|
5e65e394a6 | ||
|
|
8c357ec213 | ||
|
|
a599a334a3 | ||
|
|
36d39669e4 | ||
|
|
028171a91a | ||
|
|
2647e1cdac | ||
|
|
994cebea82 | ||
|
|
a533a3e0ef | ||
|
|
caa915b31d | ||
|
|
2996d8537d | ||
|
|
65be1263b9 | ||
|
|
d81ae835aa | ||
|
|
c405cedc41 | ||
|
|
2a7f366cbf | ||
|
|
ea580e4c64 | ||
|
|
445100f32d | ||
|
|
648a852ba7 | ||
|
|
9f136fb150 | ||
|
|
6d5b38fc8a | ||
|
|
2e7fd5fe93 | ||
|
|
626895166a | ||
|
|
1ca8d2b2db | ||
|
|
aa57f25b2c | ||
|
|
a321676b99 | ||
|
|
5b49b105f6 | ||
|
|
d610b19f4e | ||
|
|
b9241288c4 | ||
|
|
a7470dc284 | ||
|
|
154624a767 | ||
|
|
6f1a5eb79c | ||
|
|
a8334a22f8 | ||
|
|
8cdea2bfeb | ||
|
|
c413eda330 | ||
|
|
22bfb6be4b | ||
|
|
6bfbf37749 | ||
|
|
7797e47561 | ||
|
|
52579c5fab | ||
|
|
a5ed6d897c | ||
|
|
439605bafc | ||
|
|
9f6fd3ee6a | ||
|
|
1539c0b2f2 | ||
|
|
109e8b53a1 | ||
|
|
216697d4b5 | ||
|
|
77bb88ed59 | ||
|
|
7e52477908 | ||
|
|
45816fa84f | ||
|
|
18babef78b | ||
|
|
df8970f59b | ||
|
|
3103c33dda | ||
|
|
a9fa7ee26a | ||
|
|
e605560e5c | ||
|
|
af330d7f8a | ||
|
|
563d466374 | ||
|
|
fd59cc6226 | ||
|
|
6a8a0f2249 | ||
|
|
8c43b0953b | ||
|
|
a885d7f003 | ||
|
|
63af591938 | ||
|
|
bf6efc3530 | ||
|
|
609ec24c6a | ||
|
|
c99cbec3df | ||
|
|
6eb44cb9d8 | ||
|
|
f67f2a31ee | ||
|
|
3d5b8287ce | ||
|
|
548a27fe48 | ||
|
|
7970a0b3b4 | ||
|
|
2c67845dd6 | ||
|
|
e02ca2f7e3 | ||
|
|
84a2197027 | ||
|
|
41dd808c9a | ||
|
|
6a7a76dce3 | ||
|
|
b7a8f6c2a1 | ||
|
|
f574017b66 | ||
|
|
b35d5ded77 | ||
|
|
a3f712306e | ||
|
|
e455b3ff00 | ||
|
|
17dd73834f | ||
|
|
189020298e | ||
|
|
375b400b1e | ||
|
|
192ac0e013 | ||
|
|
b80c8013c0 | ||
|
|
0606428cd9 | ||
|
|
8cd7b85711 | ||
|
|
e91f2b89df | ||
|
|
93706c94af | ||
|
|
6de61cb214 | ||
|
|
a21e7adeb5 | ||
|
|
11aecf43ba | ||
|
|
ee3490a520 | ||
|
|
178c1afdea | ||
|
|
3a2cd0276a | ||
|
|
a81e5aa6e4 | ||
|
|
927cde3777 | ||
|
|
bed2bfb6db | ||
|
|
72f87b449b | ||
|
|
02b95b16f9 | ||
|
|
3e16519793 | ||
|
|
a4b6cb3232 | ||
|
|
8883701297 | ||
|
|
225c0a9b03 | ||
|
|
43a9bba96f | ||
|
|
2c670b3b21 | ||
|
|
02aad295f9 | ||
|
|
163da78bc6 | ||
|
|
a549f86624 | ||
|
|
27262436d1 | ||
|
|
fa2b691dc1 | ||
|
|
03a010406f | ||
|
|
1e5245efd0 | ||
|
|
abd8369dd9 | ||
|
|
d0dbffebe1 | ||
|
|
c202cee81f | ||
|
|
95153a6609 | ||
|
|
e157bc195b | ||
|
|
ac09da9efc | ||
|
|
dc1ad8fb2d | ||
|
|
ba5d178ba0 | ||
|
|
9ceebacfb1 | ||
|
|
2a872eb995 | ||
|
|
9077b56df1 | ||
|
|
3380cab2c3 | ||
|
|
1355fa0636 | ||
|
|
70fb869852 | ||
|
|
73da15586b | ||
|
|
b3024a6f7c | ||
|
|
4c42f5a2f5 | ||
|
|
14cf30cd98 | ||
|
|
e94dbe4965 | ||
|
|
a7f9faf868 | ||
|
|
6cbdc958cd | ||
|
|
fb396d9cf0 | ||
|
|
fca092d392 | ||
|
|
0ed393b1a5 | ||
|
|
b992faa468 | ||
|
|
3f911ab437 | ||
|
|
84586b675a | ||
|
|
f952f715c8 | ||
|
|
79d097c903 | ||
|
|
cdc2428aca | ||
|
|
82c8ace8df | ||
|
|
8525dcb376 | ||
|
|
1607853393 | ||
|
|
27d402104e | ||
|
|
d58bcd136a | ||
|
|
1944b24fba | ||
|
|
8e10533681 | ||
|
|
5a9f3f1f5e | ||
|
|
64f2fb9e73 | ||
|
|
cbed698a1c | ||
|
|
cd7efee49c | ||
|
|
f7ab90724e | ||
|
|
aa7b891150 | ||
|
|
911100923f | ||
|
|
3c64d84980 | ||
|
|
e4f87b53b4 | ||
|
|
ff779fcc7c | ||
|
|
e7c7784fec | ||
|
|
184f0900fb | ||
|
|
9ca83b7349 | ||
|
|
8b3df83e7e | ||
|
|
da24249850 | ||
|
|
04e509fc49 | ||
|
|
99a8eaea91 | ||
|
|
4c3474a9f7 | ||
|
|
14ccbf335d | ||
|
|
14841a44ad | ||
|
|
d2b411ecbb | ||
|
|
544e60eb6d | ||
|
|
db80d8f56f | ||
|
|
ae09d73257 | ||
|
|
ca0f095d6b | ||
|
|
1a0f626a80 | ||
|
|
c23426425e | ||
|
|
de52439276 | ||
|
|
757b296fd0 | ||
|
|
83e842d121 | ||
|
|
7f00a3075f | ||
|
|
1c362e4871 | ||
|
|
0dc5c9dbac | ||
|
|
28d9304ec6 | ||
|
|
d132e53c06 | ||
|
|
e28a8db3b4 | ||
|
|
b6380a17ce | ||
|
|
f4ceef485b | ||
|
|
f3507569b5 | ||
|
|
da5e60a009 | ||
|
|
896a69086b | ||
|
|
b375877a6d | ||
|
|
0ed5f8081a | ||
|
|
7416fa3a4c | ||
|
|
b90bb10a3f | ||
|
|
69643c37c1 | ||
|
|
bf208485f8 | ||
|
|
d12d571c2b | ||
|
|
a456936853 | ||
|
|
655f7ff7d0 | ||
|
|
5d8e972ac7 | ||
|
|
31a6797fc3 | ||
|
|
b9b0e9cf43 | ||
|
|
7f4eb5624b | ||
|
|
766a05236a | ||
|
|
92a6c7b89e | ||
|
|
a583a31220 | ||
|
|
87f14be30c | ||
|
|
7e13cc84c8 | ||
|
|
a2440a2e80 | ||
|
|
17b96dd7c1 | ||
|
|
b2c2c1247b | ||
|
|
e4b6b18712 | ||
|
|
4601633605 | ||
|
|
839123408b | ||
|
|
2a3cf5f002 | ||
|
|
4d172ec4f5 | ||
|
|
6f411e96ed | ||
|
|
7f7664eb4f | ||
|
|
3d994cc2cf | ||
|
|
6bc69d5a75 | ||
|
|
0db2c271a0 | ||
|
|
02b09c58a1 | ||
|
|
b0a8ad1ac1 | ||
|
|
3e6302e44a | ||
|
|
1f493c427a | ||
|
|
89eb39ca3e | ||
|
|
b495761283 | ||
|
|
29e92015d5 | ||
|
|
c71f2f7fae | ||
|
|
548c92dc0d | ||
|
|
59a5f675f6 | ||
|
|
d80a669515 | ||
|
|
bc0c5d4fcb | ||
|
|
1a69fdf1e0 | ||
|
|
df6643f1c5 | ||
|
|
03fc008dfc | ||
|
|
fa330c766f | ||
|
|
cb80742eaa | ||
|
|
0ae46455af | ||
|
|
d6133c325a | ||
|
|
edfb89a8d9 | ||
|
|
aafbee2a28 | ||
|
|
5c9dc62015 | ||
|
|
5fef41e132 | ||
|
|
a677d4da5f | ||
|
|
136e0cde06 | ||
|
|
06af2b6aa3 | ||
|
|
29e2a00109 | ||
|
|
d5b5929e9b | ||
|
|
fea89ad451 | ||
|
|
3d6f1e42d2 | ||
|
|
1ad80e1870 | ||
|
|
ea0b8df5d4 | ||
|
|
0e39aac5cd | ||
|
|
7e88621aa1 | ||
|
|
9b76407193 | ||
|
|
b6bd2687d2 | ||
|
|
82c0f8a863 | ||
|
|
9782802bd8 | ||
|
|
87659b56a4 | ||
|
|
cd62d7f0d9 | ||
|
|
1290bc8cc9 | ||
|
|
fe285ecd6b | ||
|
|
da7d187612 | ||
|
|
9b2fde6ea2 | ||
|
|
da1a563a3c | ||
|
|
9bee5c79c8 | ||
|
|
aab6ad96eb | ||
|
|
c8d803b559 | ||
|
|
ab5faec68c | ||
|
|
dcba4fef48 | ||
|
|
a654073c71 | ||
|
|
eb417c7e22 | ||
|
|
0fce4c6177 | ||
|
|
e964ff0b70 | ||
|
|
a5765fc25a | ||
|
|
18600bcd11 | ||
|
|
7a3bb59d3e | ||
|
|
29e1535c64 | ||
|
|
7b41ce1f24 | ||
|
|
1e6a170c3c | ||
|
|
887028a1b4 | ||
|
|
816ceab057 | ||
|
|
324152e363 | ||
|
|
1b11cd571e | ||
|
|
627419aa5f | ||
|
|
aa99e710d1 | ||
|
|
f3a9857747 | ||
|
|
fdf1c0448b | ||
|
|
a09b39dd69 | ||
|
|
e4989d8b9f | ||
|
|
b135de80c0 | ||
|
|
79a39b39d9 | ||
|
|
0c02afa54e | ||
|
|
1e9ef321f0 | ||
|
|
7301bc30b1 | ||
|
|
ccecd8f4f0 | ||
|
|
93e669d7d3 | ||
|
|
a0f28c07f2 | ||
|
|
bd14e5019f | ||
|
|
6d0f454e6a | ||
|
|
a031311ab5 | ||
|
|
492915567b | ||
|
|
8b1a7def38 | ||
|
|
2f62339f0c | ||
|
|
288f25c827 | ||
|
|
1392a8ecf1 | ||
|
|
1eee8f439b | ||
|
|
0db7aca1cd | ||
|
|
89d69a8fb6 | ||
|
|
7574d06718 | ||
|
|
4336a1a13e | ||
|
|
9409d6e05e | ||
|
|
0971445289 | ||
|
|
32fe763c0c | ||
|
|
6790d2be44 | ||
|
|
f579c6b56d | ||
|
|
81aaa95170 | ||
|
|
e0c91f7fda | ||
|
|
bd0596dd86 | ||
|
|
cc5125d51d | ||
|
|
e90be1bb88 | ||
|
|
b32567681f | ||
|
|
9f5897e06c | ||
|
|
e8ffcb0630 | ||
|
|
88aaa38676 | ||
|
|
6692867db5 | ||
|
|
42c898d5aa | ||
|
|
2936f886a9 | ||
|
|
f582967711 | ||
|
|
68985e9eda | ||
|
|
7c3e429f22 | ||
|
|
cb79b1aea5 | ||
|
|
b687eb09b4 | ||
|
|
83874ad466 | ||
|
|
c0172b0a49 | ||
|
|
f59208b9cf | ||
|
|
6d9ee74360 | ||
|
|
5ae6e98572 | ||
|
|
3f639e2ffe | ||
|
|
43a690c8cf | ||
|
|
2725a1cd8d | ||
|
|
ac3159193f | ||
|
|
f2c0a3994a | ||
|
|
d7dbe986f1 | ||
|
|
f93090596a | ||
|
|
8b7e62e819 | ||
|
|
28ef79f371 | ||
|
|
e39312828c | ||
|
|
3bbf9d2e0f | ||
|
|
be4ba6cc69 | ||
|
|
51126ca941 | ||
|
|
faae2d7a1e | ||
|
|
ca92bc899b | ||
|
|
ace5fd61bd | ||
|
|
31fabb4624 | ||
|
|
b4935fef76 | ||
|
|
d1fba4c125 | ||
|
|
de8ac68466 | ||
|
|
0392eab129 | ||
|
|
479ce592fa | ||
|
|
9eaa180c10 | ||
|
|
4b38f0bc6b | ||
|
|
40ed7258d4 | ||
|
|
b0c05fd80d | ||
|
|
1537330b61 | ||
|
|
abd91260ab | ||
|
|
5dcb321a6f | ||
|
|
38cc72a3f9 | ||
|
|
6f03c470ae | ||
|
|
4cb02bd3a5 | ||
|
|
9f55418bfb | ||
|
|
8faf1140fb | ||
|
|
6e14375b86 | ||
|
|
7138d7ac59 | ||
|
|
a02b810412 | ||
|
|
bd5480b264 | ||
|
|
7c04bcae26 | ||
|
|
efa61dcb39 | ||
|
|
6c137d9098 | ||
|
|
3ca92c7a03 | ||
|
|
bb2d5e570a | ||
|
|
1ce2a86f37 | ||
|
|
c6ee7c5082 | ||
|
|
a52d674a14 | ||
|
|
69b1ee2ec7 | ||
|
|
95a771c2fb | ||
|
|
cf59f57ab8 | ||
|
|
8cd38693dd | ||
|
|
ef67aa9e48 | ||
|
|
4623b5d5db | ||
|
|
65456d331b | ||
|
|
20f51092ad | ||
|
|
0b0173f155 | ||
|
|
4e4bab2bf0 | ||
|
|
679c907b78 | ||
|
|
cd6bb1b98f | ||
|
|
667ceb2115 | ||
|
|
03f491ab5a | ||
|
|
fb7c4114c1 | ||
|
|
669ea69357 | ||
|
|
5b32e0db6f | ||
|
|
20aa2bdc6e | ||
|
|
c7b7847a82 | ||
|
|
d99f3e1522 | ||
|
|
903b53033d | ||
|
|
f2fa08ea82 | ||
|
|
c049cde8cf | ||
|
|
d58dc29550 | ||
|
|
e75e36e999 | ||
|
|
7903dc7c2e | ||
|
|
a8e13d86e2 | ||
|
|
8e173d8273 | ||
|
|
7b67dc03f7 | ||
|
|
c4fca3b23d | ||
|
|
c42e70686d | ||
|
|
df861b59c1 | ||
|
|
447ccdf042 | ||
|
|
db37d0197a | ||
|
|
e6f21d166a | ||
|
|
2e0923a26a | ||
|
|
bd1af2223d | ||
|
|
ec395acae0 | ||
|
|
5ff69b86db | ||
|
|
ce6cd8070f | ||
|
|
ddf985b445 | ||
|
|
6a37072b9a | ||
|
|
d2ea06ef4a | ||
|
|
943f58f2c0 | ||
|
|
0891e2d432 | ||
|
|
740dd0e0a6 | ||
|
|
2fcd21ae94 | ||
|
|
c312f079fb | ||
|
|
a480dfe59e | ||
|
|
453eddc089 | ||
|
|
51cb558317 | ||
|
|
f0c5b1e544 | ||
|
|
348ce56776 | ||
|
|
d8ab13e249 | ||
|
|
376f61e213 | ||
|
|
b30cb5254e | ||
|
|
3737e889ea | ||
|
|
ec144da8ce | ||
|
|
e61b37b6bf | ||
|
|
47a3c3c253 | ||
|
|
23c5f4040e | ||
|
|
39ceb20332 | ||
|
|
e80c5c89e0 | ||
|
|
8cfc5925da | ||
|
|
da73347231 | ||
|
|
e26c3d9462 | ||
|
|
f4c3c86dd1 | ||
|
|
5c509ee85a | ||
|
|
12ebf232d5 | ||
|
|
05ee76b0a9 | ||
|
|
12df670681 | ||
|
|
6d589a1204 | ||
|
|
1e50556f64 | ||
|
|
7ee703f077 | ||
|
|
141936e609 | ||
|
|
188a90f97d | ||
|
|
ec95f0a7af | ||
|
|
848510d4ca | ||
|
|
16e276d08e | ||
|
|
62d0a7e6ff | ||
|
|
eeee9a54d7 | ||
|
|
3ec1d1a965 | ||
|
|
2b60430c55 | ||
|
|
dbd3ed49ed | ||
|
|
eb640157f2 | ||
|
|
166ec71a28 | ||
|
|
8e4f3b4f06 | ||
|
|
f43e1a1018 | ||
|
|
508ccf4f9c | ||
|
|
6f92fa0069 | ||
|
|
2293253d52 | ||
|
|
1cb7b6a67e | ||
|
|
817a5e4b64 | ||
|
|
8286c10406 | ||
|
|
12c2d18325 | ||
|
|
28cfc2a9c1 | ||
|
|
1e3cad4b20 | ||
|
|
b6944c4308 | ||
|
|
38542f9888 | ||
|
|
4223b2d0f0 | ||
|
|
c0db257e9b | ||
|
|
6b1f4e1686 | ||
|
|
6e8080b87d | ||
|
|
292a8620e0 | ||
|
|
f0f1c54244 | ||
|
|
30024c9814 | ||
|
|
3446442eca | ||
|
|
e439ef4ddd | ||
|
|
774e348f95 | ||
|
|
3d4e0a0479 | ||
|
|
30b9ca7f37 | ||
|
|
04e064e86e | ||
|
|
6a88d64a90 | ||
|
|
e64bc40ca9 | ||
|
|
33ae9dae0a | ||
|
|
ba249d294e | ||
|
|
d40e1e47fd | ||
|
|
1be993801f | ||
|
|
b76aa03d3a | ||
|
|
743715fa73 | ||
|
|
5f09d6a26f | ||
|
|
27fd4f444b | ||
|
|
2d56dacd0e | ||
|
|
333453df79 | ||
|
|
cfddc75ccb | ||
|
|
3a01ee9973 | ||
|
|
1efe753a04 | ||
|
|
a8e80a44e6 | ||
|
|
cf94122406 | ||
|
|
a5518eb492 | ||
|
|
6bdfc570a8 | ||
|
|
26640b3b07 | ||
|
|
777805fc1a | ||
|
|
57e08e282c | ||
|
|
fb5ea3be84 | ||
|
|
05c15a104f | ||
|
|
5f18723e2c | ||
|
|
7db98e55c5 | ||
|
|
75e1e2e678 | ||
|
|
2876e77a08 | ||
|
|
3ba881f641 | ||
|
|
264451d923 | ||
|
|
b84dbbc3b8 | ||
|
|
7adde6a0a9 |
37
.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md
vendored
Normal file
37
.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
name: "\U0001F41E Bug"
|
||||||
|
about: File a bug/issue
|
||||||
|
title: "[BUG] <title>"
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Note: Please search to see if an issue already exists for the bug you encountered.
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Environment:
|
||||||
|
<!-- linux? windows? or Mac?
|
||||||
|
Example:
|
||||||
|
- OS: Ubuntu 20.04 -->
|
||||||
|
|
||||||
|
### Physical Memory Capacity:
|
||||||
|
<!-- 8G or above is better -->
|
||||||
|
|
||||||
|
### Docker Image:
|
||||||
|
<!-- Did you pull the docker image before execute docker images -->
|
||||||
|
|
||||||
|
### Code Version:
|
||||||
|
<!-- Did you pull code from github? Make sure the code is up to date-->
|
||||||
|
|
||||||
|
### Component installation:
|
||||||
|
<!-- Has etcd, mysql, mongodb, redis or Kafka been installed on the server before Open-IM-Server deployment-->
|
||||||
|
|
||||||
|
|
||||||
|
### Log File:
|
||||||
|
<!-- view log file(logs/openIM.log) content. -->
|
||||||
|
|
||||||
|
|
||||||
|
### screenshot:
|
||||||
|
<!---->
|
||||||
36
.github/ISSUE_TEMPLATE/deployment-issues.md
vendored
Normal file
36
.github/ISSUE_TEMPLATE/deployment-issues.md
vendored
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
---
|
||||||
|
name: Deployment issues
|
||||||
|
about: Deployment issues
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
If you are deploying OpenIM for the first time
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://github.com/OpenIMSDK/Open-IM-Server.git --recursive
|
||||||
|
```
|
||||||
|
|
||||||
|
screenshot here
|
||||||
|
|
||||||
|
```
|
||||||
|
cd Open-IM-Server/script ; chmod +x *.sh ; ./env_check.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
screenshot here
|
||||||
|
|
||||||
|
```
|
||||||
|
cd .. ; docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
screenshot here
|
||||||
|
|
||||||
|
```
|
||||||
|
cd script ; ./docker_check_service.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
screenshot here
|
||||||
38
.github/ISSUE_TEMPLATE/update-.md
vendored
Normal file
38
.github/ISSUE_TEMPLATE/update-.md
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
name: 'update '
|
||||||
|
about: update docker image
|
||||||
|
title: update docker image
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```
|
||||||
|
cd Open-IM-Server ; docker-compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
screenshot here
|
||||||
|
|
||||||
|
```
|
||||||
|
git pull
|
||||||
|
```
|
||||||
|
|
||||||
|
screenshot here
|
||||||
|
|
||||||
|
```
|
||||||
|
docker-compose pull
|
||||||
|
```
|
||||||
|
|
||||||
|
screenshot here
|
||||||
|
|
||||||
|
```
|
||||||
|
chmod +x script/*.sh ; docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
screenshot here
|
||||||
|
|
||||||
|
```
|
||||||
|
cd script ; ./docker_check_service.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
screenshot here
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -5,6 +5,8 @@ components
|
|||||||
logs
|
logs
|
||||||
out-test
|
out-test
|
||||||
.github
|
.github
|
||||||
|
.idea
|
||||||
|
|
||||||
|
|
||||||
deploy/open_im_demo
|
deploy/open_im_demo
|
||||||
deploy/open_im_api
|
deploy/open_im_api
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# Open-IM-Server
|
# Open-IM-Server
|
||||||
|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -92,6 +93,7 @@ All images are available at https://hub.docker.com/r/lyt1123/open_im_server
|
|||||||
4. Start docker-compose with one click(Docker automatically pulls all images)
|
4. Start docker-compose with one click(Docker automatically pulls all images)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
cd Open-IM-Server
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -99,6 +101,7 @@ All images are available at https://hub.docker.com/r/lyt1123/open_im_server
|
|||||||
|
|
||||||
```
|
```
|
||||||
./docker_check_service.sh
|
./docker_check_service.sh
|
||||||
|
./check_all.sh
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
Submodule cmd/Open-IM-SDK-Core updated: d6372d6fe5...588c9bb77b
@@ -7,100 +7,201 @@ import (
|
|||||||
"Open_IM/internal/api/friend"
|
"Open_IM/internal/api/friend"
|
||||||
"Open_IM/internal/api/group"
|
"Open_IM/internal/api/group"
|
||||||
"Open_IM/internal/api/manage"
|
"Open_IM/internal/api/manage"
|
||||||
|
"Open_IM/internal/api/office"
|
||||||
|
"Open_IM/internal/api/organization"
|
||||||
apiThird "Open_IM/internal/api/third"
|
apiThird "Open_IM/internal/api/third"
|
||||||
"Open_IM/internal/api/user"
|
"Open_IM/internal/api/user"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
"Open_IM/pkg/common/log"
|
"Open_IM/pkg/common/log"
|
||||||
"Open_IM/pkg/utils"
|
"Open_IM/pkg/utils"
|
||||||
"flag"
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
//"syscall"
|
//"syscall"
|
||||||
|
"Open_IM/pkg/common/constant"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
log.NewPrivateLog(constant.LogFileName)
|
||||||
|
gin.SetMode(gin.ReleaseMode)
|
||||||
|
f, _ := os.Create("../logs/api.log")
|
||||||
|
gin.DefaultWriter = io.MultiWriter(f)
|
||||||
|
gin.SetMode(gin.DebugMode)
|
||||||
r := gin.Default()
|
r := gin.Default()
|
||||||
r.Use(utils.CorsHandler())
|
r.Use(utils.CorsHandler())
|
||||||
|
|
||||||
|
log.Info("load config: ", config.Config)
|
||||||
// user routing group, which handles user registration and login services
|
// user routing group, which handles user registration and login services
|
||||||
userRouterGroup := r.Group("/user")
|
userRouterGroup := r.Group("/user")
|
||||||
{
|
{
|
||||||
userRouterGroup.POST("/update_user_info", user.UpdateUserInfo)
|
userRouterGroup.POST("/update_user_info", user.UpdateUserInfo) //1
|
||||||
userRouterGroup.POST("/get_user_info", user.GetUserInfo)
|
userRouterGroup.POST("/set_global_msg_recv_opt", user.SetGlobalRecvMessageOpt)
|
||||||
userRouterGroup.POST("/get_users_online_status", user.GetUsersOnlineStatus)
|
userRouterGroup.POST("/get_users_info", user.GetUsersInfo) //1
|
||||||
|
userRouterGroup.POST("/get_self_user_info", user.GetSelfUserInfo) //1
|
||||||
|
userRouterGroup.POST("/get_users_online_status", user.GetUsersOnlineStatus) //1
|
||||||
|
userRouterGroup.POST("/get_users_info_from_cache", user.GetUsersInfoFromCache)
|
||||||
|
userRouterGroup.POST("/get_user_friend_from_cache", user.GetFriendIDListFromCache)
|
||||||
|
userRouterGroup.POST("/get_black_list_from_cache", user.GetBlackIDListFromCache)
|
||||||
}
|
}
|
||||||
//friend routing group
|
//friend routing group
|
||||||
friendRouterGroup := r.Group("/friend")
|
friendRouterGroup := r.Group("/friend")
|
||||||
{
|
{
|
||||||
friendRouterGroup.POST("/get_friends_info", friend.GetFriendsInfo)
|
// friendRouterGroup.POST("/get_friends_info", friend.GetFriendsInfo)
|
||||||
friendRouterGroup.POST("/add_friend", friend.AddFriend)
|
friendRouterGroup.POST("/add_friend", friend.AddFriend) //1
|
||||||
friendRouterGroup.POST("/get_friend_apply_list", friend.GetFriendApplyList)
|
friendRouterGroup.POST("/delete_friend", friend.DeleteFriend) //1
|
||||||
friendRouterGroup.POST("/get_self_apply_list", friend.GetSelfApplyList)
|
friendRouterGroup.POST("/get_friend_apply_list", friend.GetFriendApplyList) //1
|
||||||
friendRouterGroup.POST("/get_friend_list", friend.GetFriendList)
|
friendRouterGroup.POST("/get_self_friend_apply_list", friend.GetSelfFriendApplyList) //1
|
||||||
friendRouterGroup.POST("/add_blacklist", friend.AddBlacklist)
|
friendRouterGroup.POST("/get_friend_list", friend.GetFriendList) //1
|
||||||
friendRouterGroup.POST("/get_blacklist", friend.GetBlacklist)
|
friendRouterGroup.POST("/add_friend_response", friend.AddFriendResponse) //1
|
||||||
friendRouterGroup.POST("/remove_blacklist", friend.RemoveBlacklist)
|
friendRouterGroup.POST("/set_friend_remark", friend.SetFriendRemark) //1
|
||||||
friendRouterGroup.POST("/delete_friend", friend.DeleteFriend)
|
|
||||||
friendRouterGroup.POST("/add_friend_response", friend.AddFriendResponse)
|
friendRouterGroup.POST("/add_black", friend.AddBlack) //1
|
||||||
friendRouterGroup.POST("/set_friend_comment", friend.SetFriendComment)
|
friendRouterGroup.POST("/get_black_list", friend.GetBlacklist) //1
|
||||||
friendRouterGroup.POST("/is_friend", friend.IsFriend)
|
friendRouterGroup.POST("/remove_black", friend.RemoveBlack) //1
|
||||||
friendRouterGroup.POST("/import_friend", friend.ImportFriend)
|
|
||||||
|
friendRouterGroup.POST("/import_friend", friend.ImportFriend) //1
|
||||||
|
friendRouterGroup.POST("/is_friend", friend.IsFriend) //1
|
||||||
}
|
}
|
||||||
//group related routing group
|
//group related routing group
|
||||||
groupRouterGroup := r.Group("/group")
|
groupRouterGroup := r.Group("/group")
|
||||||
{
|
{
|
||||||
groupRouterGroup.POST("/create_group", group.CreateGroup)
|
groupRouterGroup.POST("/create_group", group.CreateGroup) //1
|
||||||
groupRouterGroup.POST("/set_group_info", group.SetGroupInfo)
|
groupRouterGroup.POST("/set_group_info", group.SetGroupInfo) //1
|
||||||
groupRouterGroup.POST("join_group", group.JoinGroup)
|
groupRouterGroup.POST("/join_group", group.JoinGroup) //1
|
||||||
groupRouterGroup.POST("/quit_group", group.QuitGroup)
|
groupRouterGroup.POST("/quit_group", group.QuitGroup) //1
|
||||||
groupRouterGroup.POST("/group_application_response", group.ApplicationGroupResponse)
|
groupRouterGroup.POST("/group_application_response", group.ApplicationGroupResponse) //1
|
||||||
groupRouterGroup.POST("/transfer_group", group.TransferGroupOwner)
|
groupRouterGroup.POST("/transfer_group", group.TransferGroupOwner) //1
|
||||||
groupRouterGroup.POST("/get_group_applicationList", group.GetGroupApplicationList)
|
groupRouterGroup.POST("/get_recv_group_applicationList", group.GetRecvGroupApplicationList) //1
|
||||||
groupRouterGroup.POST("/get_groups_info", group.GetGroupsInfo)
|
groupRouterGroup.POST("/get_user_req_group_applicationList", group.GetUserReqGroupApplicationList)
|
||||||
groupRouterGroup.POST("/kick_group", group.KickGroupMember)
|
groupRouterGroup.POST("/get_groups_info", group.GetGroupsInfo) //1
|
||||||
groupRouterGroup.POST("/get_group_member_list", group.GetGroupMemberList)
|
groupRouterGroup.POST("/kick_group", group.KickGroupMember) //1
|
||||||
groupRouterGroup.POST("/get_group_all_member_list", group.GetGroupAllMember)
|
groupRouterGroup.POST("/get_group_member_list", group.GetGroupMemberList) //no use
|
||||||
groupRouterGroup.POST("/get_group_members_info", group.GetGroupMembersInfo)
|
groupRouterGroup.POST("/get_group_all_member_list", group.GetGroupAllMemberList) //1
|
||||||
groupRouterGroup.POST("/invite_user_to_group", group.InviteUserToGroup)
|
groupRouterGroup.POST("/get_group_members_info", group.GetGroupMembersInfo) //1
|
||||||
|
groupRouterGroup.POST("/invite_user_to_group", group.InviteUserToGroup) //1
|
||||||
groupRouterGroup.POST("/get_joined_group_list", group.GetJoinedGroupList)
|
groupRouterGroup.POST("/get_joined_group_list", group.GetJoinedGroupList)
|
||||||
|
groupRouterGroup.POST("/dismiss_group", group.DismissGroup) //
|
||||||
|
groupRouterGroup.POST("/mute_group_member", group.MuteGroupMember)
|
||||||
|
groupRouterGroup.POST("/cancel_mute_group_member", group.CancelMuteGroupMember) //MuteGroup
|
||||||
|
groupRouterGroup.POST("/mute_group", group.MuteGroup)
|
||||||
|
groupRouterGroup.POST("/cancel_mute_group", group.CancelMuteGroup)
|
||||||
|
groupRouterGroup.POST("/set_group_member_nickname", group.SetGroupMemberNickname)
|
||||||
|
groupRouterGroup.POST("/set_group_member_info", group.SetGroupMemberInfo)
|
||||||
|
}
|
||||||
|
superGroupRouterGroup := r.Group("/super_group")
|
||||||
|
{
|
||||||
|
superGroupRouterGroup.POST("/get_joined_group_list", group.GetJoinedSuperGroupList)
|
||||||
|
superGroupRouterGroup.POST("/get_groups_info", group.GetSuperGroupsInfo)
|
||||||
}
|
}
|
||||||
//certificate
|
//certificate
|
||||||
authRouterGroup := r.Group("/auth")
|
authRouterGroup := r.Group("/auth")
|
||||||
{
|
{
|
||||||
authRouterGroup.POST("/user_register", apiAuth.UserRegister)
|
authRouterGroup.POST("/user_register", apiAuth.UserRegister) //1
|
||||||
authRouterGroup.POST("/user_token", apiAuth.UserToken)
|
authRouterGroup.POST("/user_token", apiAuth.UserToken) //1
|
||||||
|
authRouterGroup.POST("/parse_token", apiAuth.ParseToken) //1
|
||||||
|
authRouterGroup.POST("/force_logout", apiAuth.ForceLogout) //1
|
||||||
}
|
}
|
||||||
//Third service
|
//Third service
|
||||||
thirdGroup := r.Group("/third")
|
thirdGroup := r.Group("/third")
|
||||||
{
|
{
|
||||||
thirdGroup.POST("/tencent_cloud_storage_credential", apiThird.TencentCloudStorageCredential)
|
thirdGroup.POST("/tencent_cloud_storage_credential", apiThird.TencentCloudStorageCredential)
|
||||||
|
thirdGroup.POST("/ali_oss_credential", apiThird.AliOSSCredential)
|
||||||
|
thirdGroup.POST("/minio_storage_credential", apiThird.MinioStorageCredential)
|
||||||
|
thirdGroup.POST("/minio_upload", apiThird.MinioUploadFile)
|
||||||
|
thirdGroup.POST("/upload_update_app", apiThird.UploadUpdateApp)
|
||||||
|
thirdGroup.POST("/get_download_url", apiThird.GetDownloadURL)
|
||||||
|
thirdGroup.POST("/get_rtc_invitation_info", apiThird.GetRTCInvitationInfo)
|
||||||
|
thirdGroup.POST("/get_rtc_invitation_start_app", apiThird.GetRTCInvitationInfoStartApp)
|
||||||
}
|
}
|
||||||
//Message
|
//Message
|
||||||
chatGroup := r.Group("/chat")
|
chatGroup := r.Group("/msg")
|
||||||
{
|
{
|
||||||
chatGroup.POST("/newest_seq", apiChat.UserGetSeq)
|
chatGroup.POST("/newest_seq", apiChat.GetSeq)
|
||||||
chatGroup.POST("/pull_msg", apiChat.UserPullMsg)
|
chatGroup.POST("/send_msg", apiChat.SendMsg)
|
||||||
chatGroup.POST("/send_msg", apiChat.UserSendMsg)
|
chatGroup.POST("/pull_msg_by_seq", apiChat.PullMsgBySeqList)
|
||||||
chatGroup.POST("/pull_msg_by_seq", apiChat.UserPullMsgBySeqList)
|
chatGroup.POST("/del_msg", apiChat.DelMsg)
|
||||||
|
chatGroup.POST("/clear_msg", apiChat.ClearMsg)
|
||||||
}
|
}
|
||||||
//Manager
|
//Manager
|
||||||
managementGroup := r.Group("/manager")
|
managementGroup := r.Group("/manager")
|
||||||
{
|
{
|
||||||
managementGroup.POST("/delete_user", manage.DeleteUser)
|
managementGroup.POST("/delete_user", manage.DeleteUser) //1
|
||||||
managementGroup.POST("/send_msg", manage.ManagementSendMsg)
|
managementGroup.POST("/send_msg", manage.ManagementSendMsg)
|
||||||
managementGroup.POST("/get_all_users_uid", manage.GetAllUsersUid)
|
managementGroup.POST("/batch_send_msg", manage.ManagementBatchSendMsg)
|
||||||
managementGroup.POST("/account_check", manage.AccountCheck)
|
managementGroup.POST("/get_all_users_uid", manage.GetAllUsersUid) //1
|
||||||
managementGroup.POST("/get_users_online_status", manage.GetUsersOnlineStatus)
|
managementGroup.POST("/account_check", manage.AccountCheck) //1
|
||||||
|
managementGroup.POST("/get_users_online_status", manage.GetUsersOnlineStatus) //1
|
||||||
}
|
}
|
||||||
//Conversation
|
//Conversation
|
||||||
conversationGroup := r.Group("/conversation")
|
conversationGroup := r.Group("/conversation")
|
||||||
|
{ //1
|
||||||
|
conversationGroup.POST("/get_all_conversations", conversation.GetAllConversations)
|
||||||
|
conversationGroup.POST("/get_conversation", conversation.GetConversation)
|
||||||
|
conversationGroup.POST("/get_conversations", conversation.GetConversations)
|
||||||
|
conversationGroup.POST("/set_conversation", conversation.SetConversation)
|
||||||
|
conversationGroup.POST("/batch_set_conversation", conversation.BatchSetConversations)
|
||||||
|
conversationGroup.POST("/set_recv_msg_opt", conversation.SetRecvMsgOpt)
|
||||||
|
conversationGroup.POST("/modify_conversation_field", conversation.ModifyConversationField)
|
||||||
|
}
|
||||||
|
// office
|
||||||
|
officeGroup := r.Group("/office")
|
||||||
{
|
{
|
||||||
conversationGroup.POST("/set_receive_message_opt", conversation.SetReceiveMessageOpt)
|
officeGroup.POST("/get_user_tags", office.GetUserTags)
|
||||||
conversationGroup.POST("/get_receive_message_opt", conversation.GetReceiveMessageOpt)
|
officeGroup.POST("/get_user_tag_by_id", office.GetUserTagByID)
|
||||||
conversationGroup.POST("/get_all_conversation_message_opt", conversation.GetAllConversationMessageOpt)
|
officeGroup.POST("/create_tag", office.CreateTag)
|
||||||
|
officeGroup.POST("/delete_tag", office.DeleteTag)
|
||||||
|
officeGroup.POST("/set_tag", office.SetTag)
|
||||||
|
officeGroup.POST("/send_msg_to_tag", office.SendMsg2Tag)
|
||||||
|
officeGroup.POST("/get_send_tag_log", office.GetTagSendLogs)
|
||||||
|
|
||||||
|
officeGroup.POST("/create_one_work_moment", office.CreateOneWorkMoment)
|
||||||
|
officeGroup.POST("/delete_one_work_moment", office.DeleteOneWorkMoment)
|
||||||
|
officeGroup.POST("/like_one_work_moment", office.LikeOneWorkMoment)
|
||||||
|
officeGroup.POST("/comment_one_work_moment", office.CommentOneWorkMoment)
|
||||||
|
officeGroup.POST("/get_work_moment_by_id", office.GetWorkMomentByID)
|
||||||
|
officeGroup.POST("/get_user_work_moments", office.GetUserWorkMoments)
|
||||||
|
officeGroup.POST("/get_user_friend_work_moments", office.GetUserFriendWorkMoments)
|
||||||
|
officeGroup.POST("/set_user_work_moments_level", office.SetUserWorkMomentsLevel)
|
||||||
|
officeGroup.POST("/delete_comment", office.DeleteComment)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.NewPrivateLog("api")
|
organizationGroup := r.Group("/organization")
|
||||||
ginPort := flag.Int("port", 10000, "get ginServerPort from cmd,default 10000 as port")
|
{
|
||||||
|
organizationGroup.POST("/create_department", organization.CreateDepartment)
|
||||||
|
organizationGroup.POST("/update_department", organization.UpdateDepartment)
|
||||||
|
organizationGroup.POST("/get_sub_department", organization.GetSubDepartment)
|
||||||
|
organizationGroup.POST("/delete_department", organization.DeleteDepartment)
|
||||||
|
organizationGroup.POST("/get_all_department", organization.GetAllDepartment)
|
||||||
|
|
||||||
|
organizationGroup.POST("/create_organization_user", organization.CreateOrganizationUser)
|
||||||
|
organizationGroup.POST("/update_organization_user", organization.UpdateOrganizationUser)
|
||||||
|
organizationGroup.POST("/delete_organization_user", organization.DeleteOrganizationUser)
|
||||||
|
|
||||||
|
organizationGroup.POST("/create_department_member", organization.CreateDepartmentMember)
|
||||||
|
organizationGroup.POST("/get_user_in_department", organization.GetUserInDepartment)
|
||||||
|
organizationGroup.POST("/update_user_in_department", organization.UpdateUserInDepartment)
|
||||||
|
|
||||||
|
organizationGroup.POST("/get_department_member", organization.GetDepartmentMember)
|
||||||
|
organizationGroup.POST("/delete_user_in_department", organization.DeleteUserInDepartment)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
go apiThird.MinioInit()
|
||||||
|
defaultPorts := config.Config.Api.GinPort
|
||||||
|
ginPort := flag.Int("port", defaultPorts[0], "get ginServerPort from cmd,default 10002 as port")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
r.Run(":" + strconv.Itoa(*ginPort))
|
address := "0.0.0.0:" + strconv.Itoa(*ginPort)
|
||||||
|
if config.Config.Api.ListenIP != "" {
|
||||||
|
address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort)
|
||||||
|
}
|
||||||
|
address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort)
|
||||||
|
fmt.Println("start api server, address: ", address)
|
||||||
|
err := r.Run(address)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("", "run failed ", *ginPort, err.Error())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
.PHONY: all build run gotool install clean help
|
.PHONY: all build run gotool install clean help
|
||||||
|
|
||||||
BINARY_NAME=open_im_timer_task
|
BINARY_NAME=open_im_cms_api
|
||||||
BIN_DIR=../../bin/
|
BIN_DIR=../../bin/
|
||||||
|
|
||||||
|
|
||||||
all: gotool build
|
all: gotool build
|
||||||
|
|
||||||
build:
|
build:
|
||||||
@@ -22,4 +23,3 @@ install:
|
|||||||
clean:
|
clean:
|
||||||
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||||
|
|
||||||
|
|
||||||
28
cmd/open_im_cms_api/main.go
Normal file
28
cmd/open_im_cms_api/main.go
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"Open_IM/internal/cms_api"
|
||||||
|
"Open_IM/pkg/utils"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
gin.SetMode(gin.ReleaseMode)
|
||||||
|
router := cms_api.NewGinRouter()
|
||||||
|
router.Use(utils.CorsHandler())
|
||||||
|
defaultPorts := config.Config.CmsApi.GinPort
|
||||||
|
ginPort := flag.Int("port", defaultPorts[0], "get ginServerPort from cmd,default 10006 as port")
|
||||||
|
flag.Parse()
|
||||||
|
address := "0.0.0.0:" + strconv.Itoa(*ginPort)
|
||||||
|
if config.Config.Api.ListenIP != "" {
|
||||||
|
address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort)
|
||||||
|
}
|
||||||
|
address = config.Config.CmsApi.ListenIP + ":" + strconv.Itoa(*ginPort)
|
||||||
|
fmt.Println("start cms api server, address: ", address)
|
||||||
|
router.Run(address)
|
||||||
|
}
|
||||||
@@ -2,28 +2,48 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"Open_IM/internal/demo/register"
|
"Open_IM/internal/demo/register"
|
||||||
"Open_IM/pkg/common/log"
|
|
||||||
"Open_IM/pkg/utils"
|
"Open_IM/pkg/utils"
|
||||||
"flag"
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"Open_IM/pkg/common/constant"
|
||||||
|
"Open_IM/pkg/common/log"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
log.NewPrivateLog(constant.LogFileName)
|
||||||
|
gin.SetMode(gin.ReleaseMode)
|
||||||
|
f, _ := os.Create("../logs/api.log")
|
||||||
|
gin.DefaultWriter = io.MultiWriter(f)
|
||||||
|
|
||||||
r := gin.Default()
|
r := gin.Default()
|
||||||
r.Use(utils.CorsHandler())
|
r.Use(utils.CorsHandler())
|
||||||
|
|
||||||
authRouterGroup := r.Group("/auth")
|
authRouterGroup := r.Group("/demo")
|
||||||
{
|
{
|
||||||
authRouterGroup.POST("/code", register.SendVerificationCode)
|
authRouterGroup.POST("/code", register.SendVerificationCode)
|
||||||
authRouterGroup.POST("/verify", register.Verify)
|
authRouterGroup.POST("/verify", register.Verify)
|
||||||
authRouterGroup.POST("/password", register.SetPassword)
|
authRouterGroup.POST("/password", register.SetPassword)
|
||||||
authRouterGroup.POST("/login", register.Login)
|
authRouterGroup.POST("/login", register.Login)
|
||||||
|
authRouterGroup.POST("/reset_password", register.ResetPassword)
|
||||||
}
|
}
|
||||||
log.NewPrivateLog("demo")
|
defaultPorts := config.Config.Demo.Port
|
||||||
ginPort := flag.Int("port", 42233, "get ginServerPort from cmd,default 42233 as port")
|
ginPort := flag.Int("port", defaultPorts[0], "get ginServerPort from cmd,default 42233 as port")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
r.Run(":" + strconv.Itoa(*ginPort))
|
fmt.Println("start demo api server, port: ", *ginPort)
|
||||||
|
address := "0.0.0.0:" + strconv.Itoa(*ginPort)
|
||||||
|
if config.Config.Api.ListenIP != "" {
|
||||||
|
address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort)
|
||||||
|
}
|
||||||
|
address = config.Config.CmsApi.ListenIP + ":" + strconv.Itoa(*ginPort)
|
||||||
|
fmt.Println("start demo api server address: ", address)
|
||||||
|
err := r.Run(address)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("", "run failed ", *ginPort, err.Error())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,16 +2,24 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"Open_IM/internal/msg_gateway/gate"
|
"Open_IM/internal/msg_gateway/gate"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"Open_IM/pkg/common/constant"
|
||||||
|
"Open_IM/pkg/common/log"
|
||||||
"flag"
|
"flag"
|
||||||
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
rpcPort := flag.Int("rpc_port", 10400, "rpc listening port")
|
log.NewPrivateLog(constant.LogFileName)
|
||||||
wsPort := flag.Int("ws_port", 17778, "ws listening port")
|
defaultRpcPorts := config.Config.RpcPort.OpenImMessageGatewayPort
|
||||||
|
defaultWsPorts := config.Config.LongConnSvr.WebsocketPort
|
||||||
|
rpcPort := flag.Int("rpc_port", defaultRpcPorts[0], "rpc listening port")
|
||||||
|
wsPort := flag.Int("ws_port", defaultWsPorts[0], "ws listening port")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
|
fmt.Println("start rpc/msg_gateway server, port: ", *rpcPort, *wsPort)
|
||||||
gate.Init(*rpcPort, *wsPort)
|
gate.Init(*rpcPort, *wsPort)
|
||||||
gate.Run()
|
gate.Run()
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
|
|||||||
@@ -2,13 +2,18 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"Open_IM/internal/msg_transfer/logic"
|
"Open_IM/internal/msg_transfer/logic"
|
||||||
|
"Open_IM/pkg/common/constant"
|
||||||
|
"Open_IM/pkg/common/log"
|
||||||
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
|
log.NewPrivateLog(constant.LogFileName)
|
||||||
logic.Init()
|
logic.Init()
|
||||||
|
fmt.Println("start msg_transfer server")
|
||||||
logic.Run()
|
logic.Run()
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,15 +2,22 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"Open_IM/internal/push/logic"
|
"Open_IM/internal/push/logic"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"Open_IM/pkg/common/constant"
|
||||||
|
"Open_IM/pkg/common/log"
|
||||||
"flag"
|
"flag"
|
||||||
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
rpcPort := flag.Int("port", 10700, "rpc listening port")
|
defaultPorts := config.Config.RpcPort.OpenImPushPort
|
||||||
|
rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
|
log.NewPrivateLog(constant.LogFileName)
|
||||||
|
fmt.Println("start push rpc server, port: ", *rpcPort)
|
||||||
logic.Init(*rpcPort)
|
logic.Init(*rpcPort)
|
||||||
logic.Run()
|
logic.Run()
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
commonDB "Open_IM/pkg/common/db"
|
|
||||||
"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
|
|
||||||
"Open_IM/pkg/common/log"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
log.NewPrivateLog("timer")
|
|
||||||
//for {
|
|
||||||
// fmt.Println("start delete mongodb expired record")
|
|
||||||
// timeUnixBegin := time.Now().Unix()
|
|
||||||
// count, _ := db.DB.MgoUserCount()
|
|
||||||
// fmt.Println("mongodb record count: ", count)
|
|
||||||
// for i := 0; i < count; i++ {
|
|
||||||
// time.Sleep(1 * time.Millisecond)
|
|
||||||
// uid, _ := db.DB.MgoSkipUID(i)
|
|
||||||
// fmt.Println("operate uid: ", uid)
|
|
||||||
// err := db.DB.DelUserChat(uid)
|
|
||||||
// if err != nil {
|
|
||||||
// fmt.Println("operate uid failed: ", uid, err.Error())
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// timeUnixEnd := time.Now().Unix()
|
|
||||||
// costTime := timeUnixEnd - timeUnixBegin
|
|
||||||
// if costTime > int64(config.Config.Mongo.DBRetainChatRecords*24*3600) {
|
|
||||||
// continue
|
|
||||||
// } else {
|
|
||||||
// sleepTime := 0
|
|
||||||
// if int64(config.Config.Mongo.DBRetainChatRecords*24*3600)-costTime > 24*3600 {
|
|
||||||
// sleepTime = 24 * 3600
|
|
||||||
// } else {
|
|
||||||
// sleepTime = config.Config.Mongo.DBRetainChatRecords*24*3600 - int(costTime)
|
|
||||||
// }
|
|
||||||
// fmt.Println("sleep: ", sleepTime)
|
|
||||||
// time.Sleep(time.Duration(sleepTime) * time.Second)
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
for {
|
|
||||||
uidList, err := im_mysql_model.SelectAllUID()
|
|
||||||
if err != nil {
|
|
||||||
//log.NewError("999999", err.Error())
|
|
||||||
} else {
|
|
||||||
for _, v := range uidList {
|
|
||||||
minSeq, err := commonDB.DB.GetMinSeqFromMongo(v)
|
|
||||||
if err != nil {
|
|
||||||
//log.NewError("999999", "get user minSeq err", err.Error(), v)
|
|
||||||
continue
|
|
||||||
} else {
|
|
||||||
err := commonDB.DB.SetUserMinSeq(v, minSeq)
|
|
||||||
if err != nil {
|
|
||||||
//log.NewError("999999", "set user minSeq err", err.Error(), v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
time.Sleep(time.Duration(100) * time.Millisecond)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
23
cmd/rpc/open_im_admin_cms/Makefile
Normal file
23
cmd/rpc/open_im_admin_cms/Makefile
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
.PHONY: all build run gotool install clean help
|
||||||
|
|
||||||
|
BINARY_NAME=open_im_admin_cms
|
||||||
|
BIN_DIR=../../../bin/
|
||||||
|
|
||||||
|
all: gotool build
|
||||||
|
|
||||||
|
build:
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s"
|
||||||
|
|
||||||
|
run:
|
||||||
|
@go run ./
|
||||||
|
|
||||||
|
gotool:
|
||||||
|
go fmt ./
|
||||||
|
go vet ./
|
||||||
|
|
||||||
|
install:
|
||||||
|
make build
|
||||||
|
mv ${BINARY_NAME} ${BIN_DIR}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||||
17
cmd/rpc/open_im_admin_cms/main.go
Normal file
17
cmd/rpc/open_im_admin_cms/main.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
rpcMessageCMS "Open_IM/internal/rpc/admin_cms"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
defaultPorts := config.Config.RpcPort.OpenImAdminCmsPort
|
||||||
|
rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port")
|
||||||
|
flag.Parse()
|
||||||
|
fmt.Println("start cms rpc server, port: ", *rpcPort)
|
||||||
|
rpcServer := rpcMessageCMS.NewAdminCMSServer(*rpcPort)
|
||||||
|
rpcServer.Run()
|
||||||
|
}
|
||||||
@@ -2,12 +2,17 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
rpcAuth "Open_IM/internal/rpc/auth"
|
rpcAuth "Open_IM/internal/rpc/auth"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
"flag"
|
"flag"
|
||||||
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
rpcPort := flag.Int("port", 10600, "RpcToken default listen port 10800")
|
defaultPorts := config.Config.RpcPort.OpenImAuthPort
|
||||||
|
rpcPort := flag.Int("port", defaultPorts[0], "RpcToken default listen port 10800")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
fmt.Println("start auth rpc server, port: ", *rpcPort)
|
||||||
rpcServer := rpcAuth.NewRpcAuthServer(*rpcPort)
|
rpcServer := rpcAuth.NewRpcAuthServer(*rpcPort)
|
||||||
rpcServer.Run()
|
rpcServer.Run()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
24
cmd/rpc/open_im_cache/Makefile
Normal file
24
cmd/rpc/open_im_cache/Makefile
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
.PHONY: all build run gotool install clean help
|
||||||
|
|
||||||
|
BINARY_NAME=open_im_cache
|
||||||
|
BIN_DIR=../../../bin/
|
||||||
|
|
||||||
|
all: gotool build
|
||||||
|
|
||||||
|
build:
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s"
|
||||||
|
|
||||||
|
run:
|
||||||
|
@go run ./
|
||||||
|
|
||||||
|
gotool:
|
||||||
|
go fmt ./
|
||||||
|
go vet ./
|
||||||
|
|
||||||
|
install:
|
||||||
|
make build
|
||||||
|
mv ${BINARY_NAME} ${BIN_DIR}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||||
|
|
||||||
18
cmd/rpc/open_im_cache/main.go
Normal file
18
cmd/rpc/open_im_cache/main.go
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
rpcCache "Open_IM/internal/rpc/cache"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
defaultPorts := config.Config.RpcPort.OpenImCachePort
|
||||||
|
rpcPort := flag.Int("port", defaultPorts[0], "RpcToken default listen port 10800")
|
||||||
|
flag.Parse()
|
||||||
|
fmt.Println("start auth rpc server, port: ", *rpcPort)
|
||||||
|
rpcServer := rpcCache.NewCacheServer(*rpcPort)
|
||||||
|
rpcServer.Run()
|
||||||
|
|
||||||
|
}
|
||||||
24
cmd/rpc/open_im_conversation/Makefile
Normal file
24
cmd/rpc/open_im_conversation/Makefile
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
.PHONY: all build run gotool install clean help
|
||||||
|
|
||||||
|
BINARY_NAME=open_im_conversation
|
||||||
|
BIN_DIR=../../../bin/
|
||||||
|
|
||||||
|
all: gotool build
|
||||||
|
|
||||||
|
build:
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s"
|
||||||
|
|
||||||
|
run:
|
||||||
|
@go run ./
|
||||||
|
|
||||||
|
gotool:
|
||||||
|
go fmt ./
|
||||||
|
go vet ./
|
||||||
|
|
||||||
|
install:
|
||||||
|
make build
|
||||||
|
mv ${BINARY_NAME} ${BIN_DIR}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||||
|
|
||||||
18
cmd/rpc/open_im_conversation/main.go
Normal file
18
cmd/rpc/open_im_conversation/main.go
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
rpcConversation "Open_IM/internal/rpc/conversation"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
defaultPorts := config.Config.RpcPort.OpenImConversationPort
|
||||||
|
rpcPort := flag.Int("port", defaultPorts[0], "RpcConversation default listen port 11300")
|
||||||
|
flag.Parse()
|
||||||
|
fmt.Println("start conversation rpc server, port: ", *rpcPort)
|
||||||
|
rpcServer := rpcConversation.NewRpcConversationServer(*rpcPort)
|
||||||
|
rpcServer.Run()
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,13 +2,16 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"Open_IM/internal/rpc/friend"
|
"Open_IM/internal/rpc/friend"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
"flag"
|
"flag"
|
||||||
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
defaultPorts := config.Config.RpcPort.OpenImFriendPort
|
||||||
rpcPort := flag.Int("port", 10200, "get RpcFriendPort from cmd,default 12000 as port")
|
rpcPort := flag.Int("port", defaultPorts[0], "get RpcFriendPort from cmd,default 12000 as port")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
fmt.Println("start friend rpc server, port: ", *rpcPort)
|
||||||
rpcServer := friend.NewFriendServer(*rpcPort)
|
rpcServer := friend.NewFriendServer(*rpcPort)
|
||||||
rpcServer.Run()
|
rpcServer.Run()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,16 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"Open_IM/internal/rpc/group"
|
"Open_IM/internal/rpc/group"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
"flag"
|
"flag"
|
||||||
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
rpcPort := flag.Int("port", 10500, "get RpcGroupPort from cmd,default 16000 as port")
|
defaultPorts := config.Config.RpcPort.OpenImGroupPort
|
||||||
|
rpcPort := flag.Int("port", defaultPorts[0], "get RpcGroupPort from cmd,default 16000 as port")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
fmt.Println("start group rpc server, port: ", *rpcPort)
|
||||||
rpcServer := group.NewGroupServer(*rpcPort)
|
rpcServer := group.NewGroupServer(*rpcPort)
|
||||||
rpcServer.Run()
|
rpcServer.Run()
|
||||||
}
|
}
|
||||||
|
|||||||
23
cmd/rpc/open_im_message_cms/Makefile
Normal file
23
cmd/rpc/open_im_message_cms/Makefile
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
.PHONY: all build run gotool install clean help
|
||||||
|
|
||||||
|
BINARY_NAME=open_im_message_cms
|
||||||
|
BIN_DIR=../../../bin/
|
||||||
|
|
||||||
|
all: gotool build
|
||||||
|
|
||||||
|
build:
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s"
|
||||||
|
|
||||||
|
run:
|
||||||
|
@go run ./
|
||||||
|
|
||||||
|
gotool:
|
||||||
|
go fmt ./
|
||||||
|
go vet ./
|
||||||
|
|
||||||
|
install:
|
||||||
|
make build
|
||||||
|
mv ${BINARY_NAME} ${BIN_DIR}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||||
17
cmd/rpc/open_im_message_cms/main.go
Normal file
17
cmd/rpc/open_im_message_cms/main.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
rpcMessageCMS "Open_IM/internal/rpc/message_cms"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
defaultPorts := config.Config.RpcPort.OpenImMessageCmsPort[0]
|
||||||
|
rpcPort := flag.Int("port", defaultPorts, "rpc listening port")
|
||||||
|
flag.Parse()
|
||||||
|
fmt.Println("start msg cms rpc server, port: ", *rpcPort)
|
||||||
|
rpcServer := rpcMessageCMS.NewMessageCMSServer(*rpcPort)
|
||||||
|
rpcServer.Run()
|
||||||
|
}
|
||||||
@@ -1,13 +1,17 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
rpcChat "Open_IM/internal/rpc/chat"
|
rpcChat "Open_IM/internal/rpc/msg"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
"flag"
|
"flag"
|
||||||
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
rpcPort := flag.Int("port", 10300, "rpc listening port")
|
defaultPorts := config.Config.RpcPort.OpenImMessagePort
|
||||||
|
rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
fmt.Println("start msg rpc server, port: ", *rpcPort)
|
||||||
rpcServer := rpcChat.NewRpcChatServer(*rpcPort)
|
rpcServer := rpcChat.NewRpcChatServer(*rpcPort)
|
||||||
rpcServer.Run()
|
rpcServer.Run()
|
||||||
}
|
}
|
||||||
|
|||||||
23
cmd/rpc/open_im_office/Makefile
Normal file
23
cmd/rpc/open_im_office/Makefile
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
.PHONY: all build run gotool install clean help
|
||||||
|
|
||||||
|
BINARY_NAME=open_im_office
|
||||||
|
BIN_DIR=../../../bin/
|
||||||
|
|
||||||
|
all: gotool build
|
||||||
|
|
||||||
|
build:
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s"
|
||||||
|
|
||||||
|
run:
|
||||||
|
@go run ./
|
||||||
|
|
||||||
|
gotool:
|
||||||
|
go fmt ./
|
||||||
|
go vet ./
|
||||||
|
|
||||||
|
install:
|
||||||
|
make build
|
||||||
|
mv ${BINARY_NAME} ${BIN_DIR}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||||
17
cmd/rpc/open_im_office/main.go
Normal file
17
cmd/rpc/open_im_office/main.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
rpc "Open_IM/internal/rpc/office"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
defaultPorts := config.Config.RpcPort.OpenImOfficePort
|
||||||
|
rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port")
|
||||||
|
flag.Parse()
|
||||||
|
fmt.Println("start office rpc server, port: ", *rpcPort)
|
||||||
|
rpcServer := rpc.NewOfficeServer(*rpcPort)
|
||||||
|
rpcServer.Run()
|
||||||
|
}
|
||||||
25
cmd/rpc/open_im_organization/Makefile
Normal file
25
cmd/rpc/open_im_organization/Makefile
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
.PHONY: all build run gotool install clean help
|
||||||
|
|
||||||
|
BINARY_NAME=open_im_organization
|
||||||
|
BIN_DIR=../../../bin/
|
||||||
|
|
||||||
|
all: gotool build
|
||||||
|
|
||||||
|
build:
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s"
|
||||||
|
|
||||||
|
run:
|
||||||
|
@go run ./
|
||||||
|
|
||||||
|
gotool:
|
||||||
|
go fmt ./
|
||||||
|
go vet ./
|
||||||
|
|
||||||
|
install:
|
||||||
|
make build
|
||||||
|
mv ${BINARY_NAME} ${BIN_DIR}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||||
|
|
||||||
|
|
||||||
17
cmd/rpc/open_im_organization/main.go
Normal file
17
cmd/rpc/open_im_organization/main.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"Open_IM/internal/rpc/organization"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
defaultPorts := config.Config.RpcPort.OpenImOrganizationPort
|
||||||
|
rpcPort := flag.Int("port", defaultPorts[0], "get RpcOrganizationPort from cmd,default 11200 as port")
|
||||||
|
flag.Parse()
|
||||||
|
fmt.Println("start organization rpc server, port: ", *rpcPort)
|
||||||
|
rpcServer := organization.NewServer(*rpcPort)
|
||||||
|
rpcServer.Run()
|
||||||
|
}
|
||||||
23
cmd/rpc/open_im_statistics/Makefile
Normal file
23
cmd/rpc/open_im_statistics/Makefile
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
.PHONY: all build run gotool install clean help
|
||||||
|
|
||||||
|
BINARY_NAME=open_im_statistics
|
||||||
|
BIN_DIR=../../../bin/
|
||||||
|
|
||||||
|
all: gotool build
|
||||||
|
|
||||||
|
build:
|
||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s"
|
||||||
|
|
||||||
|
run:
|
||||||
|
@go run ./
|
||||||
|
|
||||||
|
gotool:
|
||||||
|
go fmt ./
|
||||||
|
go vet ./
|
||||||
|
|
||||||
|
install:
|
||||||
|
make build
|
||||||
|
mv ${BINARY_NAME} ${BIN_DIR}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@if [ -f ${BINARY_NAME} ] ; then rm ${BINARY_NAME} ; fi
|
||||||
17
cmd/rpc/open_im_statistics/main.go
Normal file
17
cmd/rpc/open_im_statistics/main.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"Open_IM/internal/rpc/statistics"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
defaultPorts := config.Config.RpcPort.OpenImStatisticsPort
|
||||||
|
rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port")
|
||||||
|
flag.Parse()
|
||||||
|
fmt.Println("start statistics rpc server, port: ", *rpcPort)
|
||||||
|
rpcServer := statistics.NewStatisticsServer(*rpcPort)
|
||||||
|
rpcServer.Run()
|
||||||
|
}
|
||||||
@@ -2,12 +2,16 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"Open_IM/internal/rpc/user"
|
"Open_IM/internal/rpc/user"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
"flag"
|
"flag"
|
||||||
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
rpcPort := flag.Int("port", 10100, "rpc listening port")
|
defaultPorts := config.Config.RpcPort.OpenImUserPort
|
||||||
|
rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
fmt.Println("start user rpc server, port: ", *rpcPort)
|
||||||
rpcServer := user.NewUserServer(*rpcPort)
|
rpcServer := user.NewUserServer(*rpcPort)
|
||||||
rpcServer.Run()
|
rpcServer.Run()
|
||||||
}
|
}
|
||||||
|
|||||||
69
cmd/test/main.go
Normal file
69
cmd/test/main.go
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"Open_IM/pkg/utils"
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"go.mongodb.org/mongo-driver/bson"
|
||||||
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MongoMsg struct {
|
||||||
|
UID string
|
||||||
|
Msg []string
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
//"mongodb://%s:%s@%s/%s/?maxPoolSize=%d"
|
||||||
|
uri := "mongodb://user:pass@sample.host:27017/?maxPoolSize=20&w=majority"
|
||||||
|
DBAddress := "127.0.0.1:37017"
|
||||||
|
DBDatabase := "new-test-db"
|
||||||
|
Collection := "new-test-collection"
|
||||||
|
DBMaxPoolSize := 100
|
||||||
|
uri = fmt.Sprintf("mongodb://%s/%s/?maxPoolSize=%d",
|
||||||
|
DBAddress,DBDatabase,
|
||||||
|
DBMaxPoolSize)
|
||||||
|
|
||||||
|
mongoClient, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
filter := bson.M{"uid":"my_uid"}
|
||||||
|
ctx, _ := context.WithTimeout(context.Background(), 30*time.Second)
|
||||||
|
for i:=0; i < 2; i++{
|
||||||
|
|
||||||
|
if err = mongoClient.Database(DBDatabase).Collection(Collection).FindOneAndUpdate(ctx, filter,
|
||||||
|
bson.M{"$push": bson.M{"msg": utils.Int32ToString(int32(i))}}).Err(); err != nil{
|
||||||
|
fmt.Println("FindOneAndUpdate failed ", i, )
|
||||||
|
var mmsg MongoMsg
|
||||||
|
mmsg.UID = "my_uid"
|
||||||
|
mmsg.Msg = append(mmsg.Msg, utils.Int32ToString(int32(i)))
|
||||||
|
_, err := mongoClient.Database(DBDatabase).Collection(Collection).InsertOne(ctx, &mmsg)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("insertone failed ", err.Error(), i)
|
||||||
|
} else{
|
||||||
|
fmt.Println("insertone ok ", i)
|
||||||
|
}
|
||||||
|
|
||||||
|
}else {
|
||||||
|
fmt.Println("FindOneAndUpdate ok ", i)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var mmsg MongoMsg
|
||||||
|
|
||||||
|
if err = mongoClient.Database(DBDatabase).Collection(Collection).FindOne(ctx, filter).Decode(&mmsg); err != nil {
|
||||||
|
fmt.Println("findone failed ", err.Error())
|
||||||
|
}else{
|
||||||
|
fmt.Println("findone ok ", mmsg.UID)
|
||||||
|
for i, v:=range mmsg.Msg{
|
||||||
|
fmt.Println("find value: ", i, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,50 +1,62 @@
|
|||||||
# The class cannot be named by Pascal or camel case.
|
# The class cannot be named by Pascal or camel case.
|
||||||
|
# The class cannot be named by Pascal or camel case.
|
||||||
# If it is not used, the corresponding structure will not be set,
|
# If it is not used, the corresponding structure will not be set,
|
||||||
# and it will not be read naturally.
|
# and it will not be read naturally.
|
||||||
serverversion: 1.0.3
|
serverversion: 2.0.0
|
||||||
#---------------Infrastructure configuration---------------------#
|
#---------------Infrastructure configuration---------------------#
|
||||||
etcd:
|
etcd:
|
||||||
etcdSchema: openIM
|
etcdSchema: openim #默认即可
|
||||||
etcdAddr: [ 127.0.0.1:2379 ]
|
etcdAddr: [ 127.0.0.1:2379 ] #单机部署时,默认即可
|
||||||
|
|
||||||
|
k8sMod: false #开启k8s模式 使用pod里面环境变量请求services调用服务 而并非etcd
|
||||||
|
|
||||||
mysql:
|
mysql:
|
||||||
dbMysqlAddress: [ 127.0.0.1:13306 ]
|
dbMysqlAddress: [ 127.0.0.1:13306 ] #mysql地址 目前仅支持单机,默认即可
|
||||||
dbMysqlUserName: root
|
dbMysqlUserName: root #mysql用户名,建议修改
|
||||||
dbMysqlPassword: openIM
|
dbMysqlPassword: openIM # mysql密码,建议修改
|
||||||
dbMysqlDatabaseName: openIM
|
dbMysqlDatabaseName: openIM_v2 #默认即可
|
||||||
dbTableName: eMsg
|
dbTableName: eMsg #默认即可
|
||||||
dbMsgTableNum: 1
|
dbMsgTableNum: 1
|
||||||
dbMaxOpenConns: 20
|
dbMaxOpenConns: 20
|
||||||
dbMaxIdleConns: 10
|
dbMaxIdleConns: 10
|
||||||
dbMaxLifeTime: 120
|
dbMaxLifeTime: 120
|
||||||
|
|
||||||
mongo:
|
mongo:
|
||||||
dbAddress: [ 127.0.0.1:37017 ]
|
dbUri: ""#当dbUri值不为空则直接使用该值
|
||||||
|
dbAddress: 127.0.0.1:37017 #单机时为mongo地址,使用分片集群时,为mongos地址 默认即可
|
||||||
dbDirect: false
|
dbDirect: false
|
||||||
dbTimeout: 10
|
dbTimeout: 60
|
||||||
dbDatabase: openIM
|
dbDatabase: openIM #mongo db 默认即可
|
||||||
dbSource: admin
|
dbSource: admin
|
||||||
dbUserName:
|
dbUserName: #mongo用户名,建议先不设置
|
||||||
dbPassword:
|
dbPassword: #mongo密码,建议先不设置
|
||||||
dbMaxPoolSize: 20
|
dbMaxPoolSize: 100
|
||||||
dbRetainChatRecords: 7
|
dbRetainChatRecords: 3650 #mongo保存离线消息时间(天),根据需求修改
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
dbAddress: 127.0.0.1:16379
|
dbAddress: [ 127.0.0.1:16379 ] #redis地址 单机时,填写一个地址即可,使用redis集群时候,填写集群中多个节点地址(主从地址都可以填写,增加容灾能力),默认即可
|
||||||
dbMaxIdle: 128
|
dbMaxIdle: 128
|
||||||
dbMaxActive: 0
|
dbMaxActive: 0
|
||||||
dbIdleTimeout: 120
|
dbIdleTimeout: 120
|
||||||
dbPassWord: openIM
|
dbPassWord: openIM #redis密码 建议修改
|
||||||
|
enableCluster: false #如果外部redis以集群方式启动,需要打开此开关
|
||||||
|
|
||||||
kafka:
|
kafka:
|
||||||
ws2mschat:
|
ws2mschat:
|
||||||
addr: [ 127.0.0.1:9092 ]
|
addr: [ 127.0.0.1:9092 ] #kafka配置,默认即可
|
||||||
topic: "ws2ms_chat"
|
topic: "ws2ms_chat"
|
||||||
|
ws2mschatoffline:
|
||||||
|
addr: [ 127.0.0.1:9092 ] #kafka配置,默认即可
|
||||||
|
topic: "ws2ms_chat_offline"
|
||||||
|
msgtomongo:
|
||||||
|
addr: [ 127.0.0.1:9092 ] #kafka配置,默认即可
|
||||||
|
topic: "msg_to_mongo"
|
||||||
ms2pschat:
|
ms2pschat:
|
||||||
addr: [ 127.0.0.1:9092 ]
|
addr: [ 127.0.0.1:9092 ] #kafka配置,默认即可
|
||||||
topic: "ms2ps_chat"
|
topic: "ms2ps_chat"
|
||||||
consumergroupid:
|
consumergroupid:
|
||||||
msgToMongo: mongo
|
msgToTransfer: mongo
|
||||||
|
msgToMongo: mongo_ex
|
||||||
msgToMySql: mysql
|
msgToMySql: mysql
|
||||||
msgToPush: push
|
msgToPush: push
|
||||||
|
|
||||||
@@ -55,11 +67,18 @@ kafka:
|
|||||||
# The service ip default is empty,
|
# The service ip default is empty,
|
||||||
# automatically obtain the machine's valid network card ip as the service ip,
|
# automatically obtain the machine's valid network card ip as the service ip,
|
||||||
# otherwise the configuration ip is preferred
|
# otherwise the configuration ip is preferred
|
||||||
|
#如果是单机模式,用0.0.0.0或者不填,默认即可
|
||||||
serverip: 0.0.0.0
|
serverip: 0.0.0.0
|
||||||
|
|
||||||
|
rpcRegisterIP: 127.0.0.1
|
||||||
|
listenIP: 0.0.0.0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# endpoints 内部组件间访问的端点host名称,访问时,可以内部直接访问 host:port 来访问
|
# endpoints 内部组件间访问的端点host名称,访问时,可以内部直接访问 host:port 来访问
|
||||||
endpoints:
|
endpoints:
|
||||||
api: openim_api
|
api: openim_api
|
||||||
|
cmsapi: openim_cms_api
|
||||||
push: openim_push
|
push: openim_push
|
||||||
msg_gateway: openim_msg_gateway
|
msg_gateway: openim_msg_gateway
|
||||||
rpc_auth: openim_rpc_auth
|
rpc_auth: openim_rpc_auth
|
||||||
@@ -67,29 +86,65 @@ endpoints:
|
|||||||
rpc_group: openim_rpc_group
|
rpc_group: openim_rpc_group
|
||||||
rpc_msg: openim_rpc_msg
|
rpc_msg: openim_rpc_msg
|
||||||
rpc_user: openim_rpc_user
|
rpc_user: openim_rpc_user
|
||||||
|
rpc_statistic: openim_rpc_statistic
|
||||||
|
rpc_admin_cms: openim_rpc_admin_cms
|
||||||
|
rpc_message_cms: openim_rpc_admin_cms
|
||||||
|
rpc_office: openim_rpc_office
|
||||||
|
|
||||||
api:
|
api:
|
||||||
openImApiPort: [ 10000 ]
|
openImApiPort: [ 10002 ] #api服务端口,默认即可,需要开放此端口或做nginx转发
|
||||||
|
listenIP: 0.0.0.0
|
||||||
|
cmsapi:
|
||||||
|
openImCmsApiPort: [ 10006 ] #管理后台api服务端口,默认即可,需要开放此端口或做nginx转发
|
||||||
|
listenIP: 0.0.0.0
|
||||||
sdk:
|
sdk:
|
||||||
openImSdkWsPort: [ 30000 ]
|
openImSdkWsPort: [ 10003 ] #jssdk服务端口,默认即可,项目中使用jssdk才需开放此端口或做nginx转发
|
||||||
|
dataDir: [ ../db/sdk/ ]
|
||||||
credential:
|
#对象存储服务,以下配置二选一,目前支持两种,腾讯云和minio,二者配置好其中一种即可(如果使用minio参考https://doc.rentsoft.cn/#/qa/minio搭建minio服务器)
|
||||||
|
credential: #腾讯cos,发送图片、视频、文件时需要,请自行申请后替换,必须修改
|
||||||
tencent:
|
tencent:
|
||||||
appID: 1302656840
|
appID: 1302656840
|
||||||
region: ap-chengdu
|
region: ap-chengdu
|
||||||
bucket: echat-1302656840
|
bucket: echat-1302656840
|
||||||
secretID: AKIDGNYVChzIQinu7QEgtNp0hnNgqcV8vZTC
|
secretID: AKIDGNYVChzIQinu7QEgtNp0hnNgqcV8vZTC1
|
||||||
secretKey: kz15vW83qM6dBUWIq681eBZA0c0vlIbe
|
secretKey: kz15vW83qM6dBUWIq681eBZA0c0vlIbe1
|
||||||
|
minio: #MinIO 发送图片、视频、文件时需要,请自行申请后替换,必须修改。 客户端初始化InitSDK,中 object_storage参数为minio
|
||||||
|
bucket: openim # 存储内容桶
|
||||||
|
appBucket: app # 存储app的桶
|
||||||
|
location: us-east-1
|
||||||
|
endpoint: http://127.0.0.1:10005 #minio外网ip 这个ip是给客户端访问的
|
||||||
|
endpointInner: http://127.0.0.1:10005 #minio内网地址 如果im server 可以通过内网访问到 minio就可以填写
|
||||||
|
endpointInnerEnable: true #是否启用minio内网地址 启用可以让桶初始化,IM server连接minio走内网地址访问
|
||||||
|
accessKeyID: user12345
|
||||||
|
secretAccessKey: key12345
|
||||||
|
ali: # ali oss
|
||||||
|
regionID: "oss-cn-beijing"
|
||||||
|
accessKeyID: ""
|
||||||
|
accessKeySecret: ""
|
||||||
|
stsEndpoint: "sts.cn-beijing.aliyun.com"
|
||||||
|
ossEndpoint: "oss-cn-beijing.aliyuncs.com"
|
||||||
|
bucket: "bucket1"
|
||||||
|
finalHost: "http://bucket1.oss-cn-beijing.aliyuncs.com"
|
||||||
|
stsDurationSeconds: 3600
|
||||||
|
OssRoleArn: "acs:ram::xxx:role/xxx"
|
||||||
|
|
||||||
|
|
||||||
rpcport:
|
|
||||||
openImUserPort: [ 10100 ]
|
rpcport: #rpc服务端口 默认即可
|
||||||
openImFriendPort: [ 10200 ]
|
openImUserPort: [ 10110 ]
|
||||||
openImOfflineMessagePort: [ 10300]
|
openImFriendPort: [ 10120 ]
|
||||||
openImOnlineRelayPort: [ 10400 ]
|
openImMessagePort: [ 10130 ]
|
||||||
openImGroupPort: [ 10500 ]
|
openImMessageGatewayPort: [ 10140 ]
|
||||||
openImAuthPort: [ 10600 ]
|
openImGroupPort: [ 10150 ]
|
||||||
openImPushPort: [ 10700 ]
|
openImAuthPort: [ 10160 ]
|
||||||
|
openImPushPort: [ 10170 ]
|
||||||
|
openImStatisticsPort: [ 10180 ]
|
||||||
|
openImMessageCmsPort: [ 10190 ]
|
||||||
|
openImAdminCmsPort: [ 10200 ]
|
||||||
|
openImOfficePort: [ 10210 ]
|
||||||
|
openImOrganizationPort: [ 10220 ]
|
||||||
|
openImConversationPort: [ 10230 ]
|
||||||
|
openImCachePort: [10240]
|
||||||
c2c:
|
c2c:
|
||||||
callbackBeforeSendMsg:
|
callbackBeforeSendMsg:
|
||||||
switch: false
|
switch: false
|
||||||
@@ -100,7 +155,7 @@ rpcport:
|
|||||||
stateChange:
|
stateChange:
|
||||||
switch: false
|
switch: false
|
||||||
|
|
||||||
rpcregistername:
|
rpcregistername: #rpc注册服务名,默认即可
|
||||||
openImUserName: User
|
openImUserName: User
|
||||||
openImFriendName: Friend
|
openImFriendName: Friend
|
||||||
openImOfflineMessageName: OfflineMessage
|
openImOfflineMessageName: OfflineMessage
|
||||||
@@ -108,85 +163,547 @@ rpcregistername:
|
|||||||
openImOnlineMessageRelayName: OnlineMessageRelay
|
openImOnlineMessageRelayName: OnlineMessageRelay
|
||||||
openImGroupName: Group
|
openImGroupName: Group
|
||||||
openImAuthName: Auth
|
openImAuthName: Auth
|
||||||
|
openImStatisticsName: Statistics
|
||||||
|
openImMessageCMSName: MessageCMS
|
||||||
|
openImAdminCMSName: AdminCMS
|
||||||
|
openImOfficeName: Office
|
||||||
|
openImOrganizationName: Organization
|
||||||
|
openImConversationName: Conversation
|
||||||
|
openImCacheName: Cache
|
||||||
|
openImRealTimeCommName: RealTimeComm
|
||||||
log:
|
log:
|
||||||
storageLocation: ../logs/
|
storageLocation: ../logs/
|
||||||
rotationTime: 24
|
rotationTime: 24
|
||||||
remainRotationCount: 5
|
remainRotationCount: 3 #日志数量
|
||||||
|
#日志级别 6表示全都打印,测试阶段建议设置为6
|
||||||
remainLogLevel: 6
|
remainLogLevel: 6
|
||||||
elasticSearchSwitch: false
|
elasticSearchSwitch: false
|
||||||
elasticSearchAddr: [ 127.0.0.1:9201 ]
|
elasticSearchAddr: [ 127.0.0.1:9201 ]
|
||||||
elasticSearchUser: ""
|
elasticSearchUser: ""
|
||||||
elasticSearchPassword: ""
|
elasticSearchPassword: ""
|
||||||
|
|
||||||
modulename:
|
modulename: #日志文件按模块命名,默认即可
|
||||||
longConnSvrName: msg_gateway
|
longConnSvrName: msg_gateway
|
||||||
msgTransferName: msg_transfer
|
msgTransferName: msg_transfer
|
||||||
pushName: push
|
pushName: push
|
||||||
|
|
||||||
longconnsvr:
|
longconnsvr:
|
||||||
openImWsPort: [ 17778 ]
|
openImWsPort: [ 10001 ] # ws服务端口,默认即可,要开放此端口或做nginx转发
|
||||||
websocketMaxConnNum: 10000
|
websocketMaxConnNum: 10000
|
||||||
websocketMaxMsgLen: 4096
|
websocketMaxMsgLen: 4096
|
||||||
websocketTimeOut: 10
|
websocketTimeOut: 10
|
||||||
|
|
||||||
|
## 推送只能开启一个 enable代表开启
|
||||||
push:
|
push:
|
||||||
tpns:
|
tpns: #腾讯推送,暂未测试 暂不要使用
|
||||||
ios:
|
ios:
|
||||||
accessID: 1600018281
|
accessID: 1600018281
|
||||||
secretKey: 3cd68a77a95b89e5089a1aca523f318f
|
secretKey: 3cd68a77a95b89e5089a1aca523f318f
|
||||||
android:
|
android:
|
||||||
accessID: 111
|
accessID: 111
|
||||||
secretKey: 111
|
secretKey: 111
|
||||||
jpns:
|
enable: false
|
||||||
|
jpns: #极光推送 在极光后台申请后,修改以下四项,必须修改
|
||||||
appKey: cf47465a368f24c659608e7e
|
appKey: cf47465a368f24c659608e7e
|
||||||
masterSecret: 02204efe3f3832947a236ee5
|
masterSecret: 02204efe3f3832947a236ee5
|
||||||
pushUrl: "https://api.jpush.cn/v3/push"
|
pushUrl: "https://api.jpush.cn/v3/push"
|
||||||
pushIntent: "intent:#Intent;component=io.openim.app.enterprisechat/io.openim.app.enterprisechat.MainActivity;end"
|
pushIntent: "intent:#Intent;component=io.openim.app.enterprisechat/io.openim.app.enterprisechat.MainActivity;end"
|
||||||
|
enable: true
|
||||||
|
getui: #个推推送,暂未测试 暂不要使用
|
||||||
|
pushUrl: "https://restapi.getui.com/v2/$appId"
|
||||||
|
masterSecret: ""
|
||||||
|
appKey: ""
|
||||||
|
intent: ""
|
||||||
|
enable: false
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
manager:
|
manager:
|
||||||
appManagerUid: ["openIM123456","openIM654321"]
|
#app管理员userID和对应的secret 建议修改。 用于管理后台登录,也可以用户管理后台对应的api
|
||||||
secrets: ["openIM1","openIM2"]
|
appManagerUid: [ "openIM123456","openIM654321", "openIM333", "openIMAdmin"]
|
||||||
|
secrets: [ "openIM1","openIM2", "openIM333", "openIMAdmin"]
|
||||||
|
appSysNotificationName: "系统通知"
|
||||||
|
|
||||||
secret: tuoyun
|
secret: tuoyun
|
||||||
|
# 多端互踢策略
|
||||||
|
# 1:多平台登录:Android、iOS、Windows、Mac 每种平台只能一个在线,web端可以多个同时在线
|
||||||
multiloginpolicy: 1
|
multiloginpolicy: 1
|
||||||
|
|
||||||
|
#chat log insert to db
|
||||||
|
chatpersistencemysql: true
|
||||||
|
#可靠性存储
|
||||||
|
reliablestorage: false
|
||||||
|
#消息缓存时间
|
||||||
|
msgCacheTimeout: 86400
|
||||||
|
#群聊已读开启
|
||||||
|
groupMessageHasReadReceiptEnable: true
|
||||||
|
#单聊已读开启
|
||||||
|
singleMessageHasReadReceiptEnable: true
|
||||||
|
|
||||||
#token config
|
#token config
|
||||||
tokenpolicy:
|
tokenpolicy:
|
||||||
accessSecret: "open_im_server"
|
accessSecret: "open_im_server" #token生成相关,默认即可
|
||||||
# Token effective time day as a unit
|
# Token effective time day as a unit
|
||||||
accessExpire: 7
|
accessExpire: 3650 #token过期时间(天) 默认即可
|
||||||
|
messageverify:
|
||||||
|
friendVerify: false
|
||||||
|
|
||||||
messagecallback:
|
# c2c:
|
||||||
callbackUrl: "http://www.xxx.com/msg/judge"
|
# callbackBeforeSendMsg:
|
||||||
#TimeOut use second as unit
|
# switch: false
|
||||||
callbackTimeOut: 10
|
# timeoutStrategy: 1 #1:send
|
||||||
c2c:
|
# callbackAfterSendMsg:
|
||||||
callbackBeforeSendMsg:
|
# switch: false
|
||||||
|
# state:
|
||||||
|
# stateChange:
|
||||||
|
# switch: false
|
||||||
|
#ios系统推送声音以及标记计数
|
||||||
|
iospush:
|
||||||
|
pushSound: "xxx"
|
||||||
|
badgeCount: true
|
||||||
|
|
||||||
|
callback:
|
||||||
|
# callback url 需要自行更换callback url
|
||||||
|
callbackUrl : "http://127.0.0.1:8080/callback"
|
||||||
|
# 开启关闭操作前后回调的配置
|
||||||
|
callbackBeforeSendSingleMsg:
|
||||||
|
enable: false # 回调是否启用
|
||||||
|
callbackTimeOut: 2 # 回调超时时间
|
||||||
|
callbackFailedContinue: true # 回调超时是否继续执行代码
|
||||||
|
callbackAfterSendSingleMsg:
|
||||||
|
enable: false
|
||||||
|
callbackTimeOut: 2
|
||||||
|
callbackBeforeSendGroupMsg:
|
||||||
|
enable: false
|
||||||
|
callbackTimeOut: 2
|
||||||
|
callbackFailedContinue: true
|
||||||
|
callbackAfterSendGroupMsg:
|
||||||
|
enable: false
|
||||||
|
callbackTimeOut: 2
|
||||||
|
callbackWordFilter:
|
||||||
|
enable: false
|
||||||
|
callbackTimeOut: 2
|
||||||
|
callbackFailedContinue: true
|
||||||
|
callbackUserOnline:
|
||||||
|
enable: false
|
||||||
|
callbackTimeOut: 2
|
||||||
|
callbackUserOffline:
|
||||||
|
enable: false
|
||||||
|
callbackTimeOut: 2
|
||||||
|
callbackOfflinePush:
|
||||||
|
enable: false
|
||||||
|
callbackTimeOut: 2
|
||||||
|
callbackFailedContinue: true # 回调超时是否继续离线推送
|
||||||
|
|
||||||
|
notification:
|
||||||
|
groupCreated:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "create group title" # xx create the group
|
||||||
|
desc: "create group desc"
|
||||||
|
ext: "create group ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "create the group" # xx create the group
|
||||||
|
|
||||||
|
groupInfoSet:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
switch: false
|
switch: false
|
||||||
timeoutStrategy: 1 #1:send
|
title: "groupInfoSet title"
|
||||||
callbackAfterSendMsg:
|
desc: "groupInfoSet desc"
|
||||||
|
ext: "groupInfoSet ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "modified the group profile" # group info changed by xx
|
||||||
|
|
||||||
|
joinGroupApplication:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
switch: false
|
switch: false
|
||||||
state:
|
title: "joinGroupApplication title"
|
||||||
stateChange:
|
desc: "joinGroupApplication desc"
|
||||||
|
ext: "joinGroupApplication ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "apply to join the group" # group info changed by xx
|
||||||
|
|
||||||
|
memberQuit:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
switch: false
|
switch: false
|
||||||
|
title: "memberQuit title"
|
||||||
|
desc: "memberQuit desc"
|
||||||
|
ext: "memberQuit ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "quit group chat" # group info changed by xx
|
||||||
|
|
||||||
|
groupApplicationAccepted:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "groupApplicationAccepted title"
|
||||||
|
desc: "groupApplicationAccepted desc"
|
||||||
|
ext: "groupApplicationAccepted ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "was allowed to join the group" # group info changed by xx
|
||||||
|
|
||||||
|
groupApplicationRejected:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: " title"
|
||||||
|
desc: " desc"
|
||||||
|
ext: " ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "was rejected into the group" # group info changed by xx
|
||||||
|
|
||||||
|
groupOwnerTransferred:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "groupOwnerTransferred title"
|
||||||
|
desc: "groupOwnerTransferred desc"
|
||||||
|
ext: "groupOwnerTransferred ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "become a new group owner" # group info changed by xx
|
||||||
|
|
||||||
|
memberKicked:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "memberKicked title"
|
||||||
|
desc: "memberKicked desc"
|
||||||
|
ext: "memberKicked ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "was kicked out of the group" # group info changed by xx
|
||||||
|
|
||||||
|
memberInvited:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "memberInvited title"
|
||||||
|
desc: "memberInvited desc"
|
||||||
|
ext: "memberInvited ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "was invited into the group" # group info changed by xx
|
||||||
|
|
||||||
|
memberEnter:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "memberEnter title"
|
||||||
|
desc: "memberEnter desc"
|
||||||
|
ext: "memberEnter ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "entered the group" # group info changed by xx
|
||||||
|
|
||||||
|
groupDismissed:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "groupDismissed title"
|
||||||
|
desc: "groupDismissed desc"
|
||||||
|
ext: "groupDismissed ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "group dismissed"
|
||||||
|
|
||||||
|
|
||||||
|
groupMuted:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "groupMuted title"
|
||||||
|
desc: "groupMuted desc"
|
||||||
|
ext: "groupMuted ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "group Muted"
|
||||||
|
|
||||||
|
groupCancelMuted:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "groupCancelMuted title"
|
||||||
|
desc: "groupCancelMuted desc"
|
||||||
|
ext: "groupCancelMuted ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "group Cancel Muted"
|
||||||
|
|
||||||
|
|
||||||
|
groupMemberMuted:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "groupMemberMuted title"
|
||||||
|
desc: "groupMemberMuted desc"
|
||||||
|
ext: "groupMemberMuted ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "group Member Muted"
|
||||||
|
|
||||||
|
groupMemberCancelMuted:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "groupMemberCancelMuted title"
|
||||||
|
desc: "groupMemberCancelMuted desc"
|
||||||
|
ext: "groupMemberCancelMuted ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "group Member Cancel Muted"
|
||||||
|
|
||||||
|
groupMemberInfoSet:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "groupMemberInfoSet title"
|
||||||
|
desc: "groupMemberInfoSet desc"
|
||||||
|
ext: "groupMemberInfoSet ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "group member info set"
|
||||||
|
|
||||||
|
|
||||||
|
organizationChanged:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "organizationChanged title"
|
||||||
|
desc: "organizationChanged desc"
|
||||||
|
ext: "organizationChanged ext"
|
||||||
|
defaultTips:
|
||||||
|
tips: "organization changed"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#############################friend#################################
|
||||||
|
|
||||||
|
friendApplicationAdded:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "Somebody applies to add you as a friend"
|
||||||
|
desc: "Somebody applies to add you as a friend"
|
||||||
|
ext: "Somebody applies to add you as a friend"
|
||||||
|
defaultTips:
|
||||||
|
tips: "I applies to add you as a friend" #
|
||||||
|
|
||||||
|
friendApplicationApproved:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "Someone applies to add your friend application"
|
||||||
|
desc: "Someone applies to add your friend application"
|
||||||
|
ext: "Someone applies to add your friend application"
|
||||||
|
defaultTips:
|
||||||
|
tips: "I applies to add your friend application" #
|
||||||
|
|
||||||
|
|
||||||
|
friendApplicationRejected:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "Someone rejected your friend application"
|
||||||
|
desc: "Someone rejected your friend application"
|
||||||
|
ext: "Someone rejected your friend application"
|
||||||
|
defaultTips:
|
||||||
|
tips: "I rejected your friend application" #
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
friendAdded:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "We have become friends"
|
||||||
|
desc: "We have become friends"
|
||||||
|
ext: "We have become friends"
|
||||||
|
defaultTips:
|
||||||
|
tips: "We have become friends" #
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
friendDeleted:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "deleted a friend"
|
||||||
|
desc: "deleted a friend"
|
||||||
|
ext: "deleted a friend"
|
||||||
|
defaultTips:
|
||||||
|
tips: "deleted a friend" #
|
||||||
|
|
||||||
|
|
||||||
|
friendRemarkSet:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "Your friend's profile has been changed"
|
||||||
|
desc: "Your friend's profile has been changed"
|
||||||
|
ext: "Your friend's profile has been changed"
|
||||||
|
defaultTips:
|
||||||
|
tips: "Your friend's profile has been changed" #
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
blackAdded:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "blocked a user"
|
||||||
|
desc: "blocked a user"
|
||||||
|
ext: "blocked a user"
|
||||||
|
defaultTips:
|
||||||
|
tips: "blocked a user" #
|
||||||
|
|
||||||
|
|
||||||
|
blackDeleted:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "Remove a blocked user"
|
||||||
|
desc: "Remove a blocked user"
|
||||||
|
ext: "Remove a blocked user"
|
||||||
|
defaultTips:
|
||||||
|
tips: "Remove a blocked user"
|
||||||
|
|
||||||
|
#####################user#########################
|
||||||
|
userInfoUpdated:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "Remove a blocked user"
|
||||||
|
desc: "Remove a blocked user"
|
||||||
|
ext: "Remove a blocked user"
|
||||||
|
defaultTips:
|
||||||
|
tips: "remove a blocked user"
|
||||||
|
|
||||||
|
#####################conversation#########################
|
||||||
|
conversationOptUpdate:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: false
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "conversation opt update"
|
||||||
|
desc: "conversation opt update"
|
||||||
|
ext: "conversation opt update"
|
||||||
|
defaultTips:
|
||||||
|
tips: "conversation opt update"
|
||||||
|
|
||||||
|
conversationSetPrivate:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "burn after reading"
|
||||||
|
desc: "burn after reading"
|
||||||
|
ext: "burn after reading"
|
||||||
|
defaultTips:
|
||||||
|
openTips: "burn after reading was opened"
|
||||||
|
closeTips: "burn after reading was closed"
|
||||||
|
|
||||||
|
###################workMoments################
|
||||||
|
workMomentsNotification:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 2
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: true
|
||||||
|
title: "burn after reading"
|
||||||
|
desc: "burn after reading"
|
||||||
|
ext: "burn after reading"
|
||||||
|
defaultTips:
|
||||||
|
openTips: "burn after reading was opened"
|
||||||
|
closeTips: "burn after reading was closed"
|
||||||
|
|
||||||
|
###################organization################
|
||||||
|
joinDepartmentNotification:
|
||||||
|
conversation:
|
||||||
|
reliabilityLevel: 3
|
||||||
|
unreadCount: true
|
||||||
|
offlinePush:
|
||||||
|
switch: false
|
||||||
|
title: "welcome user join department"
|
||||||
|
desc: "welcome user join department"
|
||||||
|
ext: "welcome user join department"
|
||||||
|
defaultTips:
|
||||||
|
tips: "welcome user join department"
|
||||||
|
|
||||||
#---------------demo configuration---------------------#
|
#---------------demo configuration---------------------#
|
||||||
#The following configuration items are applied to openIM Demo configuration
|
#The following configuration items are applied to openIM Demo configuration
|
||||||
|
#是否启动demo,如果自身没有账号体系,设置为true
|
||||||
demoswitch: true
|
demoswitch: true
|
||||||
demo:
|
demo:
|
||||||
openImDemoPort: [ 42233 ]
|
listenIP: 0.0.0.0
|
||||||
alismsverify:
|
#demo对外服务端口,默认即可,需要开放此端口或做nginx转发
|
||||||
accessKeyId: LTAI5tJPkn4HuuePdiLdGqe71
|
openImDemoPort: [ 10004 ]
|
||||||
accessKeySecret: 4n9OJ7ZCVN1U6KeHDAtOyNeVZcjOuV1
|
alismsverify: #阿里云短信配置,在阿里云申请成功后修改以下四项,必须修改
|
||||||
signName: OpenIM Corporation
|
accessKeyId: LTAI5tJPkn4HuuePdiLdGqe7
|
||||||
verificationCodeTemplateCode: SMS_2268101641
|
accessKeySecret: 4n9OJ7ZCVN1U6KeHDAtOyNeVZcjOuV
|
||||||
superCode: 666666
|
signName: 托云信息技术
|
||||||
mail:
|
verificationCodeTemplateCode: SMS_226810164
|
||||||
|
superCode: 666666 #超级验证码,建议修改掉,收不到短信验证码时可以用此替代
|
||||||
|
# second
|
||||||
|
codeTTL: 300
|
||||||
|
mail: #仅支持qq邮箱,具体操作参考 https://service.mail.qq.com/cgi-bin/help?subtype=1&id=28&no=1001256 必须修改
|
||||||
title: "openIM"
|
title: "openIM"
|
||||||
senderMail: "1765567899@qq.com"
|
senderMail: "765567899@qq.com"
|
||||||
senderAuthorizationCode: "1gxyausfoevlzbfag"
|
senderAuthorizationCode: "gxyausfoevlzbfag"
|
||||||
smtpAddr: "smtp.qq.com"
|
smtpAddr: "smtp.qq.com"
|
||||||
smtpPort: 25
|
smtpPort: 25 #需开放此端口 出口方向
|
||||||
|
testDepartMentID: 001
|
||||||
|
imAPIURL: http://127.0.0.1:10002
|
||||||
|
|
||||||
|
rtc:
|
||||||
|
signalTimeout: 35
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ mysql:
|
|||||||
dbMaxLifeTime: 120
|
dbMaxLifeTime: 120
|
||||||
|
|
||||||
mongo:
|
mongo:
|
||||||
|
dbUri: ""#当dbUri值不为空则直接使用该值
|
||||||
dbAddress: [ openim_mongo:27017 ]
|
dbAddress: [ openim_mongo:27017 ]
|
||||||
dbDirect: false
|
dbDirect: false
|
||||||
dbTimeout: 10
|
dbTimeout: 10
|
||||||
@@ -73,6 +74,8 @@ api:
|
|||||||
openImApiPort: [ 10000 ]
|
openImApiPort: [ 10000 ]
|
||||||
sdk:
|
sdk:
|
||||||
openImSdkWsPort: [ 30000 ]
|
openImSdkWsPort: [ 30000 ]
|
||||||
|
cmsapi:
|
||||||
|
openImCmsApiPort: [ 8000 ]
|
||||||
|
|
||||||
credential:
|
credential:
|
||||||
tencent:
|
tencent:
|
||||||
@@ -91,7 +94,9 @@ rpcport:
|
|||||||
openImGroupPort: [ 10500 ]
|
openImGroupPort: [ 10500 ]
|
||||||
openImAuthPort: [ 10600 ]
|
openImAuthPort: [ 10600 ]
|
||||||
openImPushPort: [ 10700 ]
|
openImPushPort: [ 10700 ]
|
||||||
|
openImStatisticsPort: [ 10800 ]
|
||||||
|
openImMessageCmsPort: [ 10900 ]
|
||||||
|
openImAdminCmsPort: [ 11000 ]
|
||||||
|
|
||||||
rpcregistername:
|
rpcregistername:
|
||||||
openImUserName: User
|
openImUserName: User
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
|||||||
|
|
||||||
# 将可执行文件复制到目标目录
|
# 将可执行文件复制到目标目录
|
||||||
ADD ./open_im_api $WORKDIR/main
|
ADD ./open_im_api $WORKDIR/main
|
||||||
|
COPY ./start_api.sh $$WORKDIR
|
||||||
|
|
||||||
# 创建用于挂载的几个目录,添加可执行权限
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
|
||||||
@@ -13,4 +14,4 @@ RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
|
|||||||
|
|
||||||
|
|
||||||
WORKDIR $WORKDIR
|
WORKDIR $WORKDIR
|
||||||
CMD ./main
|
CMD ./start_api.sh
|
||||||
20
deploy_k8s/admin_cms/admin_cms.Dockerfile
Normal file
20
deploy_k8s/admin_cms/admin_cms.Dockerfile
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CMDDIR $WORKDIR/cmd
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_admin_cms $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config", "/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $CMDDIR
|
||||||
|
CMD ./main
|
||||||
32
deploy_k8s/admin_cms/deployment.yaml
Normal file
32
deploy_k8s/admin_cms/deployment.yaml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: admin-cms-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: admin-cms # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: admin-cms # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: admin-cms
|
||||||
|
image: openim/admin_cms:v2.0.10k
|
||||||
|
# imagePullPolicy: Always #每次启动都重新拉取镜像
|
||||||
|
ports:
|
||||||
|
- containerPort: 10200
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
|
|
||||||
19
deploy_k8s/api/api.Dockerfile
Normal file
19
deploy_k8s/api/api.Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CMDDIR $WORKDIR/cmd
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_api $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $CMDDIR
|
||||||
|
CMD ./main
|
||||||
45
deploy_k8s/api/deployment.yaml
Normal file
45
deploy_k8s/api/deployment.yaml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: api-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: api # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: api # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: api
|
||||||
|
image: openim/api:v2.0.10k
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10002
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: api
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: api-port
|
||||||
|
protocol: TCP
|
||||||
|
port: 10002
|
||||||
|
targetPort: 10002
|
||||||
|
selector:
|
||||||
|
app: api
|
||||||
|
type: NodePort
|
||||||
18
deploy_k8s/auth/auth.Dockerfile
Normal file
18
deploy_k8s/auth/auth.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_auth $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
31
deploy_k8s/auth/deployment.yaml
Normal file
31
deploy_k8s/auth/deployment.yaml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: auth-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: auth # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: auth # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: auth
|
||||||
|
image: openim/auth:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10160
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
30
deploy_k8s/build_push_all_images.sh
Normal file
30
deploy_k8s/build_push_all_images.sh
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#/bin/sh
|
||||||
|
source ./path_info.cfg
|
||||||
|
|
||||||
|
# images version
|
||||||
|
version=v2.0.10k
|
||||||
|
git pull
|
||||||
|
cd ../script/; ./build_all_service.sh
|
||||||
|
cd ../deploy_k8s/
|
||||||
|
|
||||||
|
for i in ${service[*]}
|
||||||
|
do
|
||||||
|
mv ../bin/open_im_${i} ./${i}/
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "move success"
|
||||||
|
|
||||||
|
echo "start to build images"
|
||||||
|
|
||||||
|
for i in ${service[*]}
|
||||||
|
do
|
||||||
|
echo "start to build images" $i
|
||||||
|
cd $i
|
||||||
|
image="openim/${i}:$version"
|
||||||
|
docker build -t $image . -f ./${i}.Dockerfile
|
||||||
|
echo "build ${dockerfile} success"
|
||||||
|
docker push $image
|
||||||
|
echo "push ${image} success "
|
||||||
|
cd ..
|
||||||
|
done
|
||||||
|
|
||||||
18
deploy_k8s/cache/cache.Dockerfile
vendored
Normal file
18
deploy_k8s/cache/cache.Dockerfile
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_cache $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
31
deploy_k8s/cache/deployment.yaml
vendored
Normal file
31
deploy_k8s/cache/deployment.yaml
vendored
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: cache-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: cache # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: cache # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: cache
|
||||||
|
image: openim/cache:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10240
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
17
deploy_k8s/cms_api/cms_api.Dockerfile
Normal file
17
deploy_k8s/cms_api/cms_api.Dockerfile
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_cms_api $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
45
deploy_k8s/cms_api/deployment.yaml
Normal file
45
deploy_k8s/cms_api/deployment.yaml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: cms-api-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: cms-api # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: cms-api # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: cms-api
|
||||||
|
image: openim/cms_api:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10006
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: cms-api
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: cms-api-port
|
||||||
|
protocol: TCP
|
||||||
|
port: 10006
|
||||||
|
targetPort: 10006
|
||||||
|
selector:
|
||||||
|
app: cms-api
|
||||||
|
type: NodePort
|
||||||
17
deploy_k8s/conversation/conversation.Dockerfile
Normal file
17
deploy_k8s/conversation/conversation.Dockerfile
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_conversation $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
32
deploy_k8s/conversation/deployment.yaml
Normal file
32
deploy_k8s/conversation/deployment.yaml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: conversation-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: conversation # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: conversation # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: conversation
|
||||||
|
image: openim/conversation:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10230
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
|
|
||||||
18
deploy_k8s/demo/demo.Dockerfile
Normal file
18
deploy_k8s/demo/demo.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_demo $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
45
deploy_k8s/demo/deployment.yaml
Normal file
45
deploy_k8s/demo/deployment.yaml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: demo-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: demo # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: demo # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: demo
|
||||||
|
image: openim/demo:v2.0.10k
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10004
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: demo
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: demo
|
||||||
|
protocol: TCP
|
||||||
|
port: 10004
|
||||||
|
targetPort: 10004
|
||||||
|
selector:
|
||||||
|
app: demo
|
||||||
|
type: NodePort
|
||||||
32
deploy_k8s/friend/deployment.yaml
Normal file
32
deploy_k8s/friend/deployment.yaml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: friend-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: friend # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: friend # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: friend
|
||||||
|
image: openim/friend:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10120
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
|
|
||||||
18
deploy_k8s/friend/friend.Dockerfile
Normal file
18
deploy_k8s/friend/friend.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_friend $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
31
deploy_k8s/group/deployment.yaml
Normal file
31
deploy_k8s/group/deployment.yaml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: group-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: group # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: group # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: group
|
||||||
|
image: openim/group:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10150
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
18
deploy_k8s/group/group.Dockerfile
Normal file
18
deploy_k8s/group/group.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_group $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
101
deploy_k8s/ingress.yaml
Normal file
101
deploy_k8s/ingress.yaml
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: "nginx"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
|
||||||
|
name: sdk-server-ingress
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
- host: sdk-server.openim.xxx.com
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- backend:
|
||||||
|
service:
|
||||||
|
name: sdk-server
|
||||||
|
port:
|
||||||
|
number: 10003
|
||||||
|
path: /
|
||||||
|
pathType: Prefix
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: "nginx"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
|
||||||
|
name: msg-gateway-ingress
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
- host: msg-gateway.openim.xxx.com
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- backend:
|
||||||
|
service:
|
||||||
|
name: msg-gateway
|
||||||
|
port:
|
||||||
|
number: 10001
|
||||||
|
path: /
|
||||||
|
pathType: Prefix
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: "nginx"
|
||||||
|
name: api-ingress
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
- host: api.openim.xxx.com
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- backend:
|
||||||
|
service:
|
||||||
|
name: api
|
||||||
|
port:
|
||||||
|
number: 10002
|
||||||
|
path: /
|
||||||
|
pathType: Prefix
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: "nginx"
|
||||||
|
name: demo-ingress
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
- host: demo.openim.xxx.com
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- backend:
|
||||||
|
service:
|
||||||
|
name: demo
|
||||||
|
port:
|
||||||
|
number: 10004
|
||||||
|
path: /
|
||||||
|
pathType: Prefix
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: "nginx"
|
||||||
|
name: cms-api-ingress
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
- host: cms-api.openim.xxx.com
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- backend:
|
||||||
|
service:
|
||||||
|
name: cms-api
|
||||||
|
port:
|
||||||
|
number: 10006
|
||||||
|
path: /
|
||||||
|
pathType: Prefix
|
||||||
38
deploy_k8s/k8s_openim_deploy.md
Normal file
38
deploy_k8s/k8s_openim_deploy.md
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#### openIM k8s部署文档
|
||||||
|
### 1. 修改配置文件
|
||||||
|
在Open-IM-SERVER目录下修改config/config.yaml配置文件, 将MySQL, Kafka, MongoDB等配置修改。
|
||||||
|
使用demo需要修改demo/imAPIURL地址 让demo能请求到im的api
|
||||||
|
|
||||||
|
### 2. 项目根目录创建im configMap到k8s openim namespace
|
||||||
|
kubectl create namespace openim
|
||||||
|
kubectl -n openim create configmap config --from-file=config/config.yaml
|
||||||
|
openim 为im项目的namespace, 可选
|
||||||
|
查看configmap
|
||||||
|
kubectl -n openim get configmap
|
||||||
|
|
||||||
|
### 3(可选). 修改每个deployment.yml
|
||||||
|
kubectl get nodes
|
||||||
|
kubectl label node k8s-node1 role=kube-Node
|
||||||
|
应需要调度的node打上标签
|
||||||
|
nodeSelector:
|
||||||
|
node: kube-Node
|
||||||
|
创建资源清单时添加上nodeSelector属性对应即可
|
||||||
|
修改每种服务数量,建议至少每种2个rpc。
|
||||||
|
如果修改了config/config.yaml某些配置比如端口,同时需要修改对应deployment端口和ingress端口
|
||||||
|
|
||||||
|
|
||||||
|
### 4. 修改ingress.yaml配置文件
|
||||||
|
需要安装ingress controller 这里使用的是ingress-nginx 其他ingress需要修改配置文件
|
||||||
|
进行域名修改等操作
|
||||||
|
|
||||||
|
### 5. 执行./kubectl_start.sh脚本
|
||||||
|
chmod +x ./kubectl_start.sh ./kubectl_stop.sh
|
||||||
|
./kubectl_start.sh
|
||||||
|
kubectl -n openim apply -f ingress.yaml
|
||||||
|
kubectl 启动所有deployment,services,ingress
|
||||||
|
|
||||||
|
### 6. 查看k8s deployment service ingress状态
|
||||||
|
kubectl -n openim get services
|
||||||
|
kubectl -n openim get deployment
|
||||||
|
kubectl -n openim get ingress
|
||||||
|
kubectl -n openim get pods
|
||||||
11
deploy_k8s/kubectl_start_all.sh
Executable file
11
deploy_k8s/kubectl_start_all.sh
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
source ./path_info.cfg
|
||||||
|
|
||||||
|
#mkdir -p /db/sdk #path for jssdk sqlite
|
||||||
|
|
||||||
|
for i in ${service[*]}
|
||||||
|
do
|
||||||
|
kubectl -n openim apply -f ./${i}/deployment.yaml
|
||||||
|
done
|
||||||
|
|
||||||
38
deploy_k8s/kubectl_stop_all.sh
Executable file
38
deploy_k8s/kubectl_stop_all.sh
Executable file
@@ -0,0 +1,38 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
service=(
|
||||||
|
#api service file
|
||||||
|
api
|
||||||
|
cms-api
|
||||||
|
#rpc service file
|
||||||
|
user
|
||||||
|
friend
|
||||||
|
group
|
||||||
|
auth
|
||||||
|
admin-cms
|
||||||
|
message-cms
|
||||||
|
statistics
|
||||||
|
office
|
||||||
|
organization
|
||||||
|
conversation
|
||||||
|
cache
|
||||||
|
msg-gateway
|
||||||
|
msg-transfer
|
||||||
|
msg
|
||||||
|
push
|
||||||
|
sdk-server
|
||||||
|
demo
|
||||||
|
)
|
||||||
|
|
||||||
|
for i in ${service[*]}
|
||||||
|
do
|
||||||
|
kubectl -n openim delete deployment "${i}-deployment"
|
||||||
|
done
|
||||||
|
|
||||||
|
kubectl -n openim delete service api
|
||||||
|
kubectl -n openim delete service cms-api
|
||||||
|
kubectl -n openim delete service sdk-server
|
||||||
|
kubectl -n openim delete service msg-gateway
|
||||||
|
kubectl -n openim delete service demo
|
||||||
|
|
||||||
|
echo done
|
||||||
31
deploy_k8s/message_cms/deployment.yaml
Normal file
31
deploy_k8s/message_cms/deployment.yaml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: message-cms-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: message-cms # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: message-cms # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: message-cms
|
||||||
|
image: openim/message_cms:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10190
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
18
deploy_k8s/message_cms/message_cms.Dockerfile
Normal file
18
deploy_k8s/message_cms/message_cms.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_message_cms $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
31
deploy_k8s/msg/deployment.yaml
Normal file
31
deploy_k8s/msg/deployment.yaml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: msg-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: msg # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: msg # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: msg
|
||||||
|
image: openim/msg:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10130
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
19
deploy_k8s/msg/msg.Dockerfile
Normal file
19
deploy_k8s/msg/msg.Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_msg $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
50
deploy_k8s/msg_gateway/deployment.yaml
Normal file
50
deploy_k8s/msg_gateway/deployment.yaml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: msg-gateway-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: msg-gateway # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: msg-gateway # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: msg-gateway
|
||||||
|
image: openim/msg_gateway:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- name: rpc-port
|
||||||
|
containerPort: 10140
|
||||||
|
- name: ws-port
|
||||||
|
containerPort: 10001
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: msg-gateway
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: msg-gateway-port
|
||||||
|
protocol: TCP
|
||||||
|
port: 10001
|
||||||
|
targetPort: ws-port
|
||||||
|
selector:
|
||||||
|
app: msg-gateway
|
||||||
|
type: NodePort
|
||||||
|
|
||||||
|
|
||||||
18
deploy_k8s/msg_gateway/msg_gateway.Dockerfile
Normal file
18
deploy_k8s/msg_gateway/msg_gateway.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_msg_gateway $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
29
deploy_k8s/msg_transfer/deployment.yaml
Normal file
29
deploy_k8s/msg_transfer/deployment.yaml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: msg-transfer-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: msg-transfer # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: msg-transfer # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: msg-transfer
|
||||||
|
image: openim/msg_transfer:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
18
deploy_k8s/msg_transfer/msg_transfer.Dockerfile
Normal file
18
deploy_k8s/msg_transfer/msg_transfer.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_msg_transfer $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
31
deploy_k8s/office/deployment.yaml
Normal file
31
deploy_k8s/office/deployment.yaml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: office-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: office # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: office # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: office
|
||||||
|
image: openim/office:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10210
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
18
deploy_k8s/office/office.Dockerfile
Normal file
18
deploy_k8s/office/office.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_office $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
31
deploy_k8s/organization/deployment.yaml
Normal file
31
deploy_k8s/organization/deployment.yaml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: organization-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: organization # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: organization # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: organization
|
||||||
|
image: openim/organization:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10220
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
19
deploy_k8s/organization/organization.Dockerfile
Normal file
19
deploy_k8s/organization/organization.Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_organization $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
24
deploy_k8s/path_info.cfg
Normal file
24
deploy_k8s/path_info.cfg
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#/bin/sh
|
||||||
|
service=(
|
||||||
|
#api service file
|
||||||
|
api
|
||||||
|
cms_api
|
||||||
|
#rpc service file
|
||||||
|
user
|
||||||
|
friend
|
||||||
|
group
|
||||||
|
auth
|
||||||
|
admin_cms
|
||||||
|
message_cms
|
||||||
|
statistics
|
||||||
|
office
|
||||||
|
organization
|
||||||
|
conversation
|
||||||
|
cache
|
||||||
|
msg_gateway
|
||||||
|
msg_transfer
|
||||||
|
msg
|
||||||
|
push
|
||||||
|
sdk_server
|
||||||
|
demo
|
||||||
|
)
|
||||||
31
deploy_k8s/push/deployment.yaml
Normal file
31
deploy_k8s/push/deployment.yaml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: push-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: push # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: push # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: push
|
||||||
|
image: openim/push:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10170
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
19
deploy_k8s/push/push.Dockerfile
Normal file
19
deploy_k8s/push/push.Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_push $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
54
deploy_k8s/sdk_server/deployment.yaml
Normal file
54
deploy_k8s/sdk_server/deployment.yaml
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: sdk-server-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: sdk-server # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: sdk-server # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: sdk-server
|
||||||
|
image: openim/sdk_server:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10003
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
- name: local-db
|
||||||
|
mountPath: /db/sdk
|
||||||
|
command: ["/Open-IM-Server/main"]
|
||||||
|
args: ["-openIM_api_port", "10002", "-openIM_ws_port", "10001", "-sdk_ws_port", "10003", "-openIM_log_level", "6"]
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
- name: local-db
|
||||||
|
hostPath:
|
||||||
|
path: /db/sdk
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: sdk-server
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: sdk-server-port
|
||||||
|
protocol: TCP
|
||||||
|
port: 10003
|
||||||
|
targetPort: 10003
|
||||||
|
selector:
|
||||||
|
app: sdk-server
|
||||||
|
type: NodePort
|
||||||
|
|
||||||
|
|
||||||
17
deploy_k8s/sdk_server/sdk_server.Dockerfile
Normal file
17
deploy_k8s/sdk_server/sdk_server.Dockerfile
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_sdk_server $WORKDIR/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/db && \
|
||||||
|
chmod +x $WORKDIR/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script","/Open-IM-Server/db/sdk"]
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./main
|
||||||
31
deploy_k8s/statistics/deployment.yaml
Normal file
31
deploy_k8s/statistics/deployment.yaml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: statistics-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: statistics # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: statistics # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: statistics
|
||||||
|
image: openim/statistics:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 10180
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
18
deploy_k8s/statistics/statistics.Dockerfile
Normal file
18
deploy_k8s/statistics/statistics.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_statistics $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
29
deploy_k8s/user/deployment.yaml
Normal file
29
deploy_k8s/user/deployment.yaml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: user-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: user # 选择这个指定标签执行
|
||||||
|
replicas: 2 # 运行pod数量
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: user # 标签
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: user
|
||||||
|
image: openim/user:v2.0.10k
|
||||||
|
# imagePullPolicy: Always
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /Open-IM-Server/config
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: config
|
||||||
|
strategy: #更新策略
|
||||||
|
type: RollingUpdate # 滚动更新
|
||||||
18
deploy_k8s/user/user.Dockerfile
Normal file
18
deploy_k8s/user/user.Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM ubuntu
|
||||||
|
|
||||||
|
# 设置固定的项目路径
|
||||||
|
ENV WORKDIR /Open-IM-Server
|
||||||
|
ENV CONFIG_NAME $WORKDIR/config/config.yaml
|
||||||
|
|
||||||
|
# 将可执行文件复制到目标目录
|
||||||
|
ADD ./open_im_user $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
# 创建用于挂载的几个目录,添加可执行权限
|
||||||
|
RUN mkdir $WORKDIR/logs $WORKDIR/config $WORKDIR/script && \
|
||||||
|
chmod +x $WORKDIR/cmd/main
|
||||||
|
|
||||||
|
VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script"]
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR $WORKDIR
|
||||||
|
CMD ./cmd/main
|
||||||
@@ -24,10 +24,15 @@ services:
|
|||||||
- ./components/mongodb/data/db:/data/db
|
- ./components/mongodb/data/db:/data/db
|
||||||
- ./components/mongodb/data/logs:/data/logs
|
- ./components/mongodb/data/logs:/data/logs
|
||||||
- ./components/mongodb/data/conf:/etc/mongo
|
- ./components/mongodb/data/conf:/etc/mongo
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
# cache
|
||||||
|
- wiredTigerCacheSizeGB=1
|
||||||
# environment:
|
# environment:
|
||||||
# - MONGO_INITDB_ROOT_USERNAME=openIM
|
# - MONGO_INITDB_ROOT_USERNAME=openIM
|
||||||
# - MONGO_INITDB_ROOT_PASSWORD=openIM
|
# - MONGO_INITDB_ROOT_PASSWORD=openIM
|
||||||
|
|
||||||
|
|
||||||
#TZ: Asia/Shanghai
|
#TZ: Asia/Shanghai
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
@@ -64,12 +69,17 @@ services:
|
|||||||
image: wurstmeister/kafka
|
image: wurstmeister/kafka
|
||||||
container_name: kafka
|
container_name: kafka
|
||||||
restart: always
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 9093:9093
|
||||||
environment:
|
environment:
|
||||||
TZ: Asia/Shanghai
|
TZ: Asia/Shanghai
|
||||||
KAFKA_BROKER_ID: 0
|
KAFKA_BROKER_ID: 0
|
||||||
KAFKA_ZOOKEEPER_CONNECT: 127.0.0.1:2181
|
KAFKA_ZOOKEEPER_CONNECT: 127.0.0.1:2181
|
||||||
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://127.0.0.1:9092
|
KAFKA_CREATE_TOPICS: "ws2ms_chat:8:1,ms2ps_chat:8:1,msg_to_mongo:8:1"
|
||||||
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
|
KAFKA_ADVERTISED_LISTENERS: INSIDE://127.0.0.1:9092,OUTSIDE://103.116.45.174:9093
|
||||||
|
KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9093
|
||||||
|
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT"
|
||||||
|
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
|
||||||
network_mode: "host"
|
network_mode: "host"
|
||||||
depends_on:
|
depends_on:
|
||||||
- zookeeper
|
- zookeeper
|
||||||
@@ -89,7 +99,7 @@ services:
|
|||||||
command: /usr/local/bin/etcd --name etcd0 --data-dir /etcd-data --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380 --initial-advertise-peer-urls http://0.0.0.0:2380 --initial-cluster etcd0=http://0.0.0.0:2380 --initial-cluster-token tkn --initial-cluster-state new
|
command: /usr/local/bin/etcd --name etcd0 --data-dir /etcd-data --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380 --initial-advertise-peer-urls http://0.0.0.0:2380 --initial-cluster etcd0=http://0.0.0.0:2380 --initial-cluster-token tkn --initial-cluster-state new
|
||||||
|
|
||||||
open_im_server:
|
open_im_server:
|
||||||
image: openim/open_im_server
|
image: openim/open_im_server:v2.1.0
|
||||||
container_name: open_im_server
|
container_name: open_im_server
|
||||||
volumes:
|
volumes:
|
||||||
- ./logs:/Open-IM-Server/logs
|
- ./logs:/Open-IM-Server/logs
|
||||||
|
|||||||
BIN
docs/Wechat.jpg
BIN
docs/Wechat.jpg
Binary file not shown.
|
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 144 KiB |
37
go.mod
37
go.mod
@@ -3,51 +3,52 @@ module Open_IM
|
|||||||
go 1.15
|
go 1.15
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Shopify/sarama v1.19.0
|
github.com/Shopify/sarama v1.32.0
|
||||||
github.com/Shopify/toxiproxy v2.1.4+incompatible // indirect
|
|
||||||
github.com/alibabacloud-go/darabonba-openapi v0.1.11
|
github.com/alibabacloud-go/darabonba-openapi v0.1.11
|
||||||
github.com/alibabacloud-go/dysmsapi-20170525/v2 v2.0.8
|
github.com/alibabacloud-go/dysmsapi-20170525/v2 v2.0.8
|
||||||
|
github.com/alibabacloud-go/sts-20150401 v1.1.0
|
||||||
github.com/alibabacloud-go/tea v1.1.17
|
github.com/alibabacloud-go/tea v1.1.17
|
||||||
github.com/antonfisher/nested-logrus-formatter v1.3.0
|
github.com/antonfisher/nested-logrus-formatter v1.3.0
|
||||||
github.com/bwmarrin/snowflake v0.3.0
|
github.com/bwmarrin/snowflake v0.3.0
|
||||||
github.com/dustin/go-humanize v1.0.0 // indirect
|
github.com/fatih/structs v1.1.0
|
||||||
github.com/eapache/go-resiliency v1.2.0 // indirect
|
|
||||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect
|
|
||||||
github.com/eapache/queue v1.1.0 // indirect
|
|
||||||
github.com/frankban/quicktest v1.14.0 // indirect
|
|
||||||
github.com/garyburd/redigo v1.6.2
|
|
||||||
github.com/gin-gonic/gin v1.7.0
|
github.com/gin-gonic/gin v1.7.0
|
||||||
github.com/go-playground/validator/v10 v10.4.1
|
github.com/go-playground/validator/v10 v10.4.1
|
||||||
|
github.com/go-redis/redis/v8 v8.11.5
|
||||||
|
github.com/go-sql-driver/mysql v1.6.0 // indirect
|
||||||
|
github.com/gogo/protobuf v1.3.2
|
||||||
github.com/golang-jwt/jwt/v4 v4.1.0
|
github.com/golang-jwt/jwt/v4 v4.1.0
|
||||||
github.com/golang/protobuf v1.5.2
|
github.com/golang/protobuf v1.5.2
|
||||||
github.com/golang/snappy v0.0.4 // indirect
|
|
||||||
github.com/gorilla/websocket v1.4.2
|
github.com/gorilla/websocket v1.4.2
|
||||||
|
github.com/jinzhu/copier v0.3.4
|
||||||
github.com/jinzhu/gorm v1.9.16
|
github.com/jinzhu/gorm v1.9.16
|
||||||
|
github.com/jinzhu/now v1.1.3 // indirect
|
||||||
github.com/jonboulle/clockwork v0.2.2 // indirect
|
github.com/jonboulle/clockwork v0.2.2 // indirect
|
||||||
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
|
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
|
||||||
github.com/lestrrat-go/strftime v1.0.4 // indirect
|
github.com/lestrrat-go/strftime v1.0.4 // indirect
|
||||||
github.com/lib/pq v1.2.0 // indirect
|
github.com/lib/pq v1.2.0 // indirect
|
||||||
github.com/mattn/go-sqlite3 v1.14.6 // indirect
|
github.com/mattn/go-sqlite3 v1.14.6 // indirect
|
||||||
|
github.com/minio/minio-go/v7 v7.0.22
|
||||||
github.com/mitchellh/mapstructure v1.4.2
|
github.com/mitchellh/mapstructure v1.4.2
|
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
|
||||||
github.com/olivere/elastic/v7 v7.0.23
|
github.com/olivere/elastic/v7 v7.0.23
|
||||||
github.com/pierrec/lz4 v2.6.1+incompatible // indirect
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
|
|
||||||
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
|
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
|
||||||
github.com/sirupsen/logrus v1.8.1
|
github.com/sirupsen/logrus v1.8.1
|
||||||
github.com/spf13/viper v1.9.0
|
|
||||||
github.com/stretchr/testify v1.7.0
|
github.com/stretchr/testify v1.7.0
|
||||||
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca
|
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect
|
go.etcd.io/etcd/api/v3 v3.5.4
|
||||||
go.etcd.io/etcd v0.0.0-20200402134248-51bdeb39e698
|
go.etcd.io/etcd/client/v3 v3.5.4
|
||||||
|
go.mongodb.org/mongo-driver v1.8.3
|
||||||
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb
|
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb
|
||||||
golang.org/x/net v0.0.0-20210917221730-978cfadd31cf
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd
|
||||||
google.golang.org/grpc v1.40.0
|
google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71 // indirect
|
||||||
|
google.golang.org/grpc v1.45.0
|
||||||
|
google.golang.org/protobuf v1.27.1
|
||||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
||||||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
||||||
|
gopkg.in/ini.v1 v1.66.2 // indirect
|
||||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
|
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
||||||
sigs.k8s.io/yaml v1.2.0 // indirect
|
|
||||||
)
|
)
|
||||||
|
|
||||||
replace google.golang.org/grpc => google.golang.org/grpc v1.29.1
|
replace github.com/Shopify/sarama => github.com/Shopify/sarama v1.29.0
|
||||||
|
|||||||
181
internal/api/auth/auth.go
Normal file
181
internal/api/auth/auth.go
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
package apiAuth
|
||||||
|
|
||||||
|
import (
|
||||||
|
api "Open_IM/pkg/base_info"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"Open_IM/pkg/common/log"
|
||||||
|
"Open_IM/pkg/common/token_verify"
|
||||||
|
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
||||||
|
rpc "Open_IM/pkg/proto/auth"
|
||||||
|
open_im_sdk "Open_IM/pkg/proto/sdk_ws"
|
||||||
|
"Open_IM/pkg/utils"
|
||||||
|
"context"
|
||||||
|
"github.com/fatih/structs"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func UserRegister(c *gin.Context) {
|
||||||
|
params := api.UserRegisterReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
errMsg := " BindJSON failed " + err.Error()
|
||||||
|
log.NewError("0", errMsg)
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if params.Secret != config.Config.Secret {
|
||||||
|
errMsg := " params.Secret != config.Config.Secret "
|
||||||
|
log.NewError(params.OperationID, errMsg, params.Secret, config.Config.Secret)
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.UserRegisterReq{UserInfo: &open_im_sdk.UserInfo{}}
|
||||||
|
utils.CopyStructFields(req.UserInfo, ¶ms)
|
||||||
|
//copier.Copy(req.UserInfo, ¶ms)
|
||||||
|
req.OperationID = params.OperationID
|
||||||
|
log.NewInfo(req.OperationID, "UserRegister args ", req.String())
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImAuthName, req.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.OperationID + " getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := rpc.NewAuthClient(etcdConn)
|
||||||
|
reply, err := client.UserRegister(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
errMsg := req.OperationID + " " + "UserRegister failed " + err.Error() + req.String()
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if reply.CommonResp.ErrCode != 0 {
|
||||||
|
errMsg := req.OperationID + " " + " UserRegister failed " + reply.CommonResp.ErrMsg + req.String()
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
pbDataToken := &rpc.UserTokenReq{Platform: params.Platform, FromUserID: params.UserID, OperationID: params.OperationID}
|
||||||
|
replyToken, err := client.UserToken(context.Background(), pbDataToken)
|
||||||
|
if err != nil {
|
||||||
|
errMsg := req.OperationID + " " + " client.UserToken failed " + err.Error() + pbDataToken.String()
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp := api.UserRegisterResp{CommResp: api.CommResp{ErrCode: replyToken.CommonResp.ErrCode, ErrMsg: replyToken.CommonResp.ErrMsg},
|
||||||
|
UserToken: api.UserTokenInfo{UserID: req.UserInfo.UserID, Token: replyToken.Token, ExpiredTime: replyToken.ExpiredTime}}
|
||||||
|
log.NewInfo(req.OperationID, "UserRegister return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func UserToken(c *gin.Context) {
|
||||||
|
params := api.UserTokenReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
errMsg := " BindJSON failed " + err.Error()
|
||||||
|
log.NewError("0", errMsg)
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if params.Secret != config.Config.Secret {
|
||||||
|
errMsg := params.OperationID + " params.Secret != config.Config.Secret "
|
||||||
|
log.NewError(params.OperationID, "params.Secret != config.Config.Secret", params.Secret, config.Config.Secret)
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.UserTokenReq{Platform: params.Platform, FromUserID: params.UserID, OperationID: params.OperationID}
|
||||||
|
log.NewInfo(req.OperationID, "UserToken args ", req.String())
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImAuthName, req.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.OperationID + " getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := rpc.NewAuthClient(etcdConn)
|
||||||
|
reply, err := client.UserToken(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
errMsg := req.OperationID + " UserToken failed " + err.Error() + req.String()
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp := api.UserTokenResp{CommResp: api.CommResp{ErrCode: reply.CommonResp.ErrCode, ErrMsg: reply.CommonResp.ErrMsg},
|
||||||
|
UserToken: api.UserTokenInfo{UserID: req.FromUserID, Token: reply.Token, ExpiredTime: reply.ExpiredTime}}
|
||||||
|
log.NewInfo(req.OperationID, "UserToken return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseToken(c *gin.Context) {
|
||||||
|
params := api.ParseTokenReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
errMsg := " BindJSON failed " + err.Error()
|
||||||
|
log.NewError("0", errMsg)
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
var expireTime int64
|
||||||
|
ok, _, errInfo, expireTime = token_verify.GetUserIDFromTokenExpireTime(c.Request.Header.Get("token"), params.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := params.OperationID + " " + "GetUserIDFromTokenExpireTime failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(params.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := api.ParseTokenResp{CommResp: api.CommResp{ErrCode: 0, ErrMsg: ""}, ExpireTime: api.ExpireTime{ExpireTimeSeconds: uint32(expireTime)}}
|
||||||
|
resp.Data = structs.Map(&resp.ExpireTime)
|
||||||
|
log.NewInfo(params.OperationID, "ParseToken return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ForceLogout(c *gin.Context) {
|
||||||
|
params := api.ForceLogoutReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
errMsg := " BindJSON failed " + err.Error()
|
||||||
|
log.NewError("0", errMsg)
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
req := &rpc.ForceLogoutReq{}
|
||||||
|
utils.CopyStructFields(req, ¶ms)
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.NewInfo(req.OperationID, "ForceLogout args ", req.String())
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImAuthName, req.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.OperationID + " getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := rpc.NewAuthClient(etcdConn)
|
||||||
|
reply, err := client.ForceLogout(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
errMsg := req.OperationID + " UserToken failed " + err.Error() + req.String()
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp := api.ForceLogoutResp{CommResp: api.CommResp{ErrCode: reply.CommonResp.ErrCode, ErrMsg: reply.CommonResp.ErrMsg}}
|
||||||
|
log.NewInfo(params.OperationID, utils.GetSelfFuncName(), " return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
package apiAuth
|
|
||||||
|
|
||||||
import (
|
|
||||||
"Open_IM/pkg/common/config"
|
|
||||||
"Open_IM/pkg/common/log"
|
|
||||||
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
|
||||||
pbAuth "Open_IM/pkg/proto/auth"
|
|
||||||
"context"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type paramsUserRegister struct {
|
|
||||||
Secret string `json:"secret" binding:"required,max=32"`
|
|
||||||
Platform int32 `json:"platform" binding:"required,min=1,max=7"`
|
|
||||||
UID string `json:"uid" binding:"required,min=1,max=64"`
|
|
||||||
Name string `json:"name" binding:"required,min=1,max=64"`
|
|
||||||
Icon string `json:"icon" binding:"omitempty,max=1024"`
|
|
||||||
Gender int32 `json:"gender" binding:"omitempty,oneof=0 1 2"`
|
|
||||||
Mobile string `json:"mobile" binding:"omitempty,max=32"`
|
|
||||||
Birth string `json:"birth" binding:"omitempty,max=16"`
|
|
||||||
Email string `json:"email" binding:"omitempty,max=64"`
|
|
||||||
Ex string `json:"ex" binding:"omitempty,max=1024"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUserRegisterReq(params *paramsUserRegister) *pbAuth.UserRegisterReq {
|
|
||||||
pbData := pbAuth.UserRegisterReq{
|
|
||||||
UID: params.UID,
|
|
||||||
Name: params.Name,
|
|
||||||
Icon: params.Icon,
|
|
||||||
Gender: params.Gender,
|
|
||||||
Mobile: params.Mobile,
|
|
||||||
Birth: params.Birth,
|
|
||||||
Email: params.Email,
|
|
||||||
Ex: params.Ex,
|
|
||||||
}
|
|
||||||
return &pbData
|
|
||||||
}
|
|
||||||
|
|
||||||
func UserRegister(c *gin.Context) {
|
|
||||||
log.Info("", "", "api user_register init ....")
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImAuthName)
|
|
||||||
client := pbAuth.NewAuthClient(etcdConn)
|
|
||||||
//defer etcdConn.Close()
|
|
||||||
|
|
||||||
params := paramsUserRegister{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if params.Secret != config.Config.Secret {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "not authorized"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
pbData := newUserRegisterReq(¶ms)
|
|
||||||
|
|
||||||
log.Info("", "", "api user_register is server, [data: %s]", pbData.String())
|
|
||||||
reply, err := client.UserRegister(context.Background(), pbData)
|
|
||||||
if err != nil || !reply.Success {
|
|
||||||
log.Error("", "", "api user_register call rpc fail, [data: %s] [err: %s]", pbData.String(), err.Error())
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Info("", "", "api user_register call rpc success, [data: %s] [reply: %s]", pbData.String(), reply.String())
|
|
||||||
|
|
||||||
pbDataToken := &pbAuth.UserTokenReq{
|
|
||||||
Platform: params.Platform,
|
|
||||||
UID: params.UID,
|
|
||||||
}
|
|
||||||
replyToken, err := client.UserToken(context.Background(), pbDataToken)
|
|
||||||
if err != nil {
|
|
||||||
log.Error("", "", "api user_register call rpc fail, [data: %s] [err: %s]", pbData.String(), err.Error())
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Info("", "", "api user_register call success, [data: %s] [reply: %s]", pbData.String(), reply.String())
|
|
||||||
|
|
||||||
if replyToken.ErrCode == 0 {
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
|
||||||
"errCode": replyToken.ErrCode,
|
|
||||||
"errMsg": replyToken.ErrMsg,
|
|
||||||
"data": gin.H{
|
|
||||||
"uid": pbData.UID,
|
|
||||||
"token": replyToken.Token,
|
|
||||||
"expiredTime": replyToken.ExpiredTime,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
|
||||||
"errCode": replyToken.ErrCode,
|
|
||||||
"errMsg": replyToken.ErrMsg,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
package apiAuth
|
|
||||||
|
|
||||||
import (
|
|
||||||
"Open_IM/pkg/common/config"
|
|
||||||
"Open_IM/pkg/common/log"
|
|
||||||
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
|
||||||
pbAuth "Open_IM/pkg/proto/auth"
|
|
||||||
"context"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type paramsUserToken struct {
|
|
||||||
Secret string `json:"secret" binding:"required,max=32"`
|
|
||||||
Platform int32 `json:"platform" binding:"required,min=1,max=8"`
|
|
||||||
UID string `json:"uid" binding:"required,min=1,max=64"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUserTokenReq(params *paramsUserToken) *pbAuth.UserTokenReq {
|
|
||||||
pbData := pbAuth.UserTokenReq{
|
|
||||||
Platform: params.Platform,
|
|
||||||
UID: params.UID,
|
|
||||||
}
|
|
||||||
return &pbData
|
|
||||||
}
|
|
||||||
|
|
||||||
func UserToken(c *gin.Context) {
|
|
||||||
log.Info("", "", "api user_token init ....")
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImAuthName)
|
|
||||||
client := pbAuth.NewAuthClient(etcdConn)
|
|
||||||
//defer etcdConn.Close()
|
|
||||||
|
|
||||||
params := paramsUserToken{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
log.Error("", "", params.UID, params.Platform, params.Secret)
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if params.Secret != config.Config.Secret {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "not authorized"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
pbData := newUserTokenReq(¶ms)
|
|
||||||
|
|
||||||
log.Info("", "", "api user_token is server, [data: %s]", pbData.String())
|
|
||||||
reply, err := client.UserToken(context.Background(), pbData)
|
|
||||||
if err != nil {
|
|
||||||
log.Error("", "", "api user_token call rpc fail, [data: %s] [err: %s]", pbData.String(), err.Error())
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Info("", "", "api user_token call rpc success, [data: %s] [reply: %s]", pbData.String(), reply.String())
|
|
||||||
|
|
||||||
if reply.ErrCode == 0 {
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
|
||||||
"errCode": reply.ErrCode,
|
|
||||||
"errMsg": reply.ErrMsg,
|
|
||||||
"data": gin.H{
|
|
||||||
"uid": pbData.UID,
|
|
||||||
"token": reply.Token,
|
|
||||||
"expiredTime": reply.ExpiredTime,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
|
||||||
"errCode": reply.ErrCode,
|
|
||||||
"errMsg": reply.ErrMsg,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
95
internal/api/chat/del_msg.go
Normal file
95
internal/api/chat/del_msg.go
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
package apiChat
|
||||||
|
|
||||||
|
import (
|
||||||
|
api "Open_IM/pkg/base_info"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"Open_IM/pkg/common/constant"
|
||||||
|
"Open_IM/pkg/common/log"
|
||||||
|
"Open_IM/pkg/common/token_verify"
|
||||||
|
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
||||||
|
rpc "Open_IM/pkg/proto/chat"
|
||||||
|
pbCommon "Open_IM/pkg/proto/sdk_ws"
|
||||||
|
"Open_IM/pkg/utils"
|
||||||
|
"context"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func DelMsg(c *gin.Context) {
|
||||||
|
var (
|
||||||
|
req api.DelMsgReq
|
||||||
|
resp api.DelMsgResp
|
||||||
|
reqPb pbCommon.DelMsgListReq
|
||||||
|
)
|
||||||
|
if err := c.BindJSON(&req); err != nil {
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req)
|
||||||
|
if err := utils.CopyStructFields(&reqPb, &req); err != nil {
|
||||||
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields", err.Error())
|
||||||
|
}
|
||||||
|
grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName, req.OperationID)
|
||||||
|
if grpcConn == nil {
|
||||||
|
errMsg := req.OperationID + " getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
msgClient := rpc.NewChatClient(grpcConn)
|
||||||
|
respPb, err := msgClient.DelMsgList(context.Background(), &reqPb)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "DelMsgList failed", err.Error(), reqPb)
|
||||||
|
c.JSON(http.StatusOK, gin.H{"errCode": constant.ErrServer.ErrCode, "errMsg": constant.ErrServer.ErrMsg + err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp.ErrCode = respPb.ErrCode
|
||||||
|
resp.ErrMsg = respPb.ErrMsg
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ClearMsg(c *gin.Context) {
|
||||||
|
params := api.CleanUpMsgReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//
|
||||||
|
req := &rpc.ClearMsgReq{}
|
||||||
|
utils.CopyStructFields(req, ¶ms)
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " api args ", req.String())
|
||||||
|
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName, req.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.OperationID + " getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := rpc.NewChatClient(etcdConn)
|
||||||
|
RpcResp, err := client.ClearMsg(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.OperationID, " CleanUpMsg failed ", err.Error(), req.String(), RpcResp.ErrMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": RpcResp.ErrMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := api.CleanUpMsgResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}}
|
||||||
|
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
@@ -5,7 +5,8 @@ import (
|
|||||||
"Open_IM/pkg/common/log"
|
"Open_IM/pkg/common/log"
|
||||||
"Open_IM/pkg/common/token_verify"
|
"Open_IM/pkg/common/token_verify"
|
||||||
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
||||||
pbMsg "Open_IM/pkg/proto/chat"
|
pbChat "Open_IM/pkg/proto/chat"
|
||||||
|
sdk_ws "Open_IM/pkg/proto/sdk_ws"
|
||||||
"context"
|
"context"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -19,7 +20,7 @@ type paramsUserNewestSeq struct {
|
|||||||
MsgIncr int `json:"msgIncr" binding:"required"`
|
MsgIncr int `json:"msgIncr" binding:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func UserGetSeq(c *gin.Context) {
|
func GetSeq(c *gin.Context) {
|
||||||
params := paramsUserNewestSeq{}
|
params := paramsUserNewestSeq{}
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
@@ -31,15 +32,18 @@ func UserGetSeq(c *gin.Context) {
|
|||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err" + err.Error()})
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err" + err.Error()})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pbData := pbMsg.GetMaxAndMinSeqReq{}
|
pbData := sdk_ws.GetMaxAndMinSeqReq{}
|
||||||
pbData.UserID = params.SendID
|
pbData.UserID = params.SendID
|
||||||
pbData.OperationID = params.OperationID
|
pbData.OperationID = params.OperationID
|
||||||
grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
|
grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName, pbData.OperationID)
|
||||||
|
|
||||||
if grpcConn == nil {
|
if grpcConn == nil {
|
||||||
log.ErrorByKv("get grpcConn err", pbData.OperationID, "args", params)
|
errMsg := pbData.OperationID + " getcdv3.GetConn == nil"
|
||||||
|
log.NewError(pbData.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
}
|
}
|
||||||
msgClient := pbMsg.NewChatClient(grpcConn)
|
|
||||||
|
msgClient := pbChat.NewChatClient(grpcConn)
|
||||||
reply, err := msgClient.GetMaxAndMinSeq(context.Background(), &pbData)
|
reply, err := msgClient.GetMaxAndMinSeq(context.Background(), &pbData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.NewError(params.OperationID, "UserGetSeq rpc failed, ", params, err.Error())
|
log.NewError(params.OperationID, "UserGetSeq rpc failed, ", params, err.Error())
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import (
|
|||||||
"Open_IM/pkg/common/token_verify"
|
"Open_IM/pkg/common/token_verify"
|
||||||
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
||||||
"Open_IM/pkg/proto/chat"
|
"Open_IM/pkg/proto/chat"
|
||||||
|
open_im_sdk "Open_IM/pkg/proto/sdk_ws"
|
||||||
|
"Open_IM/pkg/utils"
|
||||||
"context"
|
"context"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -22,64 +24,14 @@ type paramsUserPullMsg struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func UserPullMsg(c *gin.Context) {
|
|
||||||
params := paramsUserPullMsg{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
token := c.Request.Header.Get("token")
|
|
||||||
if ok, err := token_verify.VerifyToken(token, params.SendID); !ok {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err" + err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
pbData := pbChat.PullMessageReq{}
|
|
||||||
pbData.UserID = params.SendID
|
|
||||||
pbData.OperationID = params.OperationID
|
|
||||||
pbData.SeqBegin = *params.Data.SeqBegin
|
|
||||||
pbData.SeqEnd = *params.Data.SeqEnd
|
|
||||||
grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
|
|
||||||
msgClient := pbChat.NewChatClient(grpcConn)
|
|
||||||
reply, err := msgClient.PullMessage(context.Background(), &pbData)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(params.OperationID, "UserPullMsg rpc failed, ", params, err.Error())
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "UserPullMsg rpc failed, " + err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.InfoByKv("rpc call success to pullMsgRep", pbData.OperationID, "ReplyArgs", reply.String(), "maxSeq", reply.GetMaxSeq(),
|
|
||||||
"MinSeq", reply.GetMinSeq(), "singLen", len(reply.GetSingleUserMsg()), "groupLen", len(reply.GetGroupUserMsg()))
|
|
||||||
|
|
||||||
msg := make(map[string]interface{})
|
|
||||||
if v := reply.GetSingleUserMsg(); v != nil {
|
|
||||||
msg["single"] = v
|
|
||||||
} else {
|
|
||||||
msg["single"] = []pbChat.GatherFormat{}
|
|
||||||
}
|
|
||||||
if v := reply.GetGroupUserMsg(); v != nil {
|
|
||||||
msg["group"] = v
|
|
||||||
} else {
|
|
||||||
msg["group"] = []pbChat.GatherFormat{}
|
|
||||||
}
|
|
||||||
msg["maxSeq"] = reply.GetMaxSeq()
|
|
||||||
msg["minSeq"] = reply.GetMinSeq()
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
|
||||||
"errCode": reply.ErrCode,
|
|
||||||
"errMsg": reply.ErrMsg,
|
|
||||||
"reqIdentifier": *params.ReqIdentifier,
|
|
||||||
"data": msg,
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
type paramsUserPullMsgBySeqList struct {
|
type paramsUserPullMsgBySeqList struct {
|
||||||
ReqIdentifier int `json:"reqIdentifier" binding:"required"`
|
ReqIdentifier int `json:"reqIdentifier" binding:"required"`
|
||||||
SendID string `json:"sendID" binding:"required"`
|
SendID string `json:"sendID" binding:"required"`
|
||||||
OperationID string `json:"operationID" binding:"required"`
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
SeqList []int64 `json:"seqList"`
|
SeqList []uint32 `json:"seqList"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func UserPullMsgBySeqList(c *gin.Context) {
|
func PullMsgBySeqList(c *gin.Context) {
|
||||||
params := paramsUserPullMsgBySeqList{}
|
params := paramsUserPullMsgBySeqList{}
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
@@ -88,41 +40,35 @@ func UserPullMsgBySeqList(c *gin.Context) {
|
|||||||
|
|
||||||
token := c.Request.Header.Get("token")
|
token := c.Request.Header.Get("token")
|
||||||
if ok, err := token_verify.VerifyToken(token, params.SendID); !ok {
|
if ok, err := token_verify.VerifyToken(token, params.SendID); !ok {
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err" + err.Error()})
|
if err != nil {
|
||||||
|
log.NewError(params.OperationID, utils.GetSelfFuncName(), err.Error(), token, params.SendID)
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "token validate err"})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pbData := pbChat.PullMessageBySeqListReq{}
|
pbData := open_im_sdk.PullMessageBySeqListReq{}
|
||||||
pbData.UserID = params.SendID
|
pbData.UserID = params.SendID
|
||||||
pbData.OperationID = params.OperationID
|
pbData.OperationID = params.OperationID
|
||||||
pbData.SeqList = params.SeqList
|
pbData.SeqList = params.SeqList
|
||||||
|
|
||||||
grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
|
grpcConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName, pbData.OperationID)
|
||||||
|
if grpcConn == nil {
|
||||||
|
errMsg := pbData.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(pbData.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
msgClient := pbChat.NewChatClient(grpcConn)
|
msgClient := pbChat.NewChatClient(grpcConn)
|
||||||
reply, err := msgClient.PullMessageBySeqList(context.Background(), &pbData)
|
reply, err := msgClient.PullMessageBySeqList(context.Background(), &pbData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.ErrorByKv("PullMessageBySeqList error", pbData.OperationID, "err", err.Error())
|
log.Error(pbData.OperationID, "PullMessageBySeqList error", err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.InfoByKv("rpc call success to PullMessageBySeqList", pbData.OperationID, "ReplyArgs", reply.String(), "maxSeq", reply.GetMaxSeq(),
|
log.NewInfo(pbData.OperationID, "rpc call success to PullMessageBySeqList", reply.String(), len(reply.List))
|
||||||
"MinSeq", reply.GetMinSeq(), "singLen", len(reply.GetSingleUserMsg()), "groupLen", len(reply.GetGroupUserMsg()))
|
|
||||||
|
|
||||||
msg := make(map[string]interface{})
|
|
||||||
if v := reply.GetSingleUserMsg(); v != nil {
|
|
||||||
msg["single"] = v
|
|
||||||
} else {
|
|
||||||
msg["single"] = []pbChat.GatherFormat{}
|
|
||||||
}
|
|
||||||
if v := reply.GetGroupUserMsg(); v != nil {
|
|
||||||
msg["group"] = v
|
|
||||||
} else {
|
|
||||||
msg["group"] = []pbChat.GatherFormat{}
|
|
||||||
}
|
|
||||||
msg["maxSeq"] = reply.GetMaxSeq()
|
|
||||||
msg["minSeq"] = reply.GetMinSeq()
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, gin.H{
|
||||||
"errCode": reply.ErrCode,
|
"errCode": reply.ErrCode,
|
||||||
"errMsg": reply.ErrMsg,
|
"errMsg": reply.ErrMsg,
|
||||||
"reqIdentifier": params.ReqIdentifier,
|
"reqIdentifier": params.ReqIdentifier,
|
||||||
"data": msg,
|
"data": reply.List,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"Open_IM/pkg/common/config"
|
"Open_IM/pkg/common/config"
|
||||||
"Open_IM/pkg/common/log"
|
"Open_IM/pkg/common/log"
|
||||||
pbChat "Open_IM/pkg/proto/chat"
|
pbChat "Open_IM/pkg/proto/chat"
|
||||||
"Open_IM/pkg/utils"
|
open_im_sdk "Open_IM/pkg/proto/sdk_ws"
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
||||||
@@ -14,81 +14,85 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type paramsUserSendMsg struct {
|
type paramsUserSendMsg struct {
|
||||||
ReqIdentifier int32 `json:"reqIdentifier" binding:"required"`
|
SenderPlatformID int32 `json:"senderPlatformID" binding:"required"`
|
||||||
PlatformID int32 `json:"platformID" binding:"required"`
|
SendID string `json:"sendID" binding:"required"`
|
||||||
SendID string `json:"sendID" binding:"required"`
|
SenderNickName string `json:"senderNickName"`
|
||||||
SenderNickName string `json:"senderNickName"`
|
SenderFaceURL string `json:"senderFaceUrl"`
|
||||||
SenderFaceURL string `json:"senderFaceUrl"`
|
OperationID string `json:"operationID" binding:"required"`
|
||||||
OperationID string `json:"operationID" binding:"required"`
|
Data struct {
|
||||||
Data struct {
|
SessionType int32 `json:"sessionType" binding:"required"`
|
||||||
SessionType int32 `json:"sessionType" binding:"required"`
|
MsgFrom int32 `json:"msgFrom" binding:"required"`
|
||||||
MsgFrom int32 `json:"msgFrom" binding:"required"`
|
ContentType int32 `json:"contentType" binding:"required"`
|
||||||
ContentType int32 `json:"contentType" binding:"required"`
|
RecvID string `json:"recvID" `
|
||||||
RecvID string `json:"recvID" binding:"required"`
|
GroupID string `json:"groupID" `
|
||||||
ForceList []string `json:"forceList"`
|
ForceList []string `json:"forceList"`
|
||||||
Content string `json:"content" binding:"required"`
|
Content []byte `json:"content" binding:"required"`
|
||||||
Options map[string]int32 `json:"options" `
|
Options map[string]bool `json:"options" `
|
||||||
ClientMsgID string `json:"clientMsgID" binding:"required"`
|
ClientMsgID string `json:"clientMsgID" binding:"required"`
|
||||||
OffLineInfo map[string]interface{} `json:"offlineInfo" `
|
CreateTime int64 `json:"createTime" binding:"required"`
|
||||||
Ex map[string]interface{} `json:"ext"`
|
OffLineInfo *open_im_sdk.OfflinePushInfo `json:"offlineInfo" `
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newUserSendMsgReq(token string, params *paramsUserSendMsg) *pbChat.UserSendMsgReq {
|
func newUserSendMsgReq(token string, params *paramsUserSendMsg) *pbChat.SendMsgReq {
|
||||||
pbData := pbChat.UserSendMsgReq{
|
pbData := pbChat.SendMsgReq{
|
||||||
ReqIdentifier: params.ReqIdentifier,
|
Token: token,
|
||||||
Token: token,
|
OperationID: params.OperationID,
|
||||||
SendID: params.SendID,
|
MsgData: &open_im_sdk.MsgData{
|
||||||
SenderNickName: params.SenderNickName,
|
SendID: params.SendID,
|
||||||
SenderFaceURL: params.SenderFaceURL,
|
RecvID: params.Data.RecvID,
|
||||||
OperationID: params.OperationID,
|
GroupID: params.Data.GroupID,
|
||||||
PlatformID: params.PlatformID,
|
ClientMsgID: params.Data.ClientMsgID,
|
||||||
SessionType: params.Data.SessionType,
|
SenderPlatformID: params.SenderPlatformID,
|
||||||
MsgFrom: params.Data.MsgFrom,
|
SenderNickname: params.SenderNickName,
|
||||||
ContentType: params.Data.ContentType,
|
SenderFaceURL: params.SenderFaceURL,
|
||||||
RecvID: params.Data.RecvID,
|
SessionType: params.Data.SessionType,
|
||||||
ForceList: params.Data.ForceList,
|
MsgFrom: params.Data.MsgFrom,
|
||||||
Content: params.Data.Content,
|
ContentType: params.Data.ContentType,
|
||||||
Options: utils.MapIntToJsonString(params.Data.Options),
|
Content: params.Data.Content,
|
||||||
ClientMsgID: params.Data.ClientMsgID,
|
CreateTime: params.Data.CreateTime,
|
||||||
OffLineInfo: utils.MapToJsonString(params.Data.OffLineInfo),
|
Options: params.Data.Options,
|
||||||
Ex: utils.MapToJsonString(params.Data.Ex),
|
OfflinePushInfo: params.Data.OffLineInfo,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
return &pbData
|
return &pbData
|
||||||
}
|
}
|
||||||
|
|
||||||
func UserSendMsg(c *gin.Context) {
|
func SendMsg(c *gin.Context) {
|
||||||
params := paramsUserSendMsg{}
|
params := paramsUserSendMsg{}
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
log.ErrorByKv("json unmarshal err", "", "err", err.Error(), "data", c.PostForm("data"))
|
log.Error("0", "BindJSON failed ", err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
token := c.Request.Header.Get("token")
|
token := c.Request.Header.Get("token")
|
||||||
|
log.NewInfo(params.OperationID, "api call success to sendMsgReq", params)
|
||||||
log.InfoByKv("api call success to sendMsgReq", params.OperationID, "Parameters", params)
|
|
||||||
|
|
||||||
pbData := newUserSendMsgReq(token, ¶ms)
|
pbData := newUserSendMsgReq(token, ¶ms)
|
||||||
log.Info("", "", "api UserSendMsg call start..., [data: %s]", pbData.String())
|
log.Info(params.OperationID, "", "api SendMsg call start..., [data: %s]", pbData.String())
|
||||||
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName)
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOfflineMessageName, params.OperationID)
|
||||||
client := pbChat.NewChatClient(etcdConn)
|
if etcdConn == nil {
|
||||||
|
errMsg := params.OperationID + "getcdv3.GetConn == nil"
|
||||||
log.Info("", "", "api UserSendMsg call, api call rpc...")
|
log.NewError(params.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
reply, err := client.UserSendMsg(context.Background(), pbData)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(params.OperationID, "UserSendMsg rpc failed, ", params, err.Error())
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "UserSendMsg rpc failed, " + err.Error()})
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Info("", "", "api UserSendMsg call end..., [data: %s] [reply: %s]", pbData.String(), reply.String())
|
client := pbChat.NewChatClient(etcdConn)
|
||||||
|
|
||||||
|
log.Info("", "", "api SendMsg call, api call rpc...")
|
||||||
|
|
||||||
|
reply, err := client.SendMsg(context.Background(), pbData)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(params.OperationID, "SendMsg rpc failed, ", params, err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "SendMsg rpc failed, " + err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Info(params.OperationID, "", "api SendMsg call end..., [data: %s] [reply: %s]", pbData.String(), reply.String())
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, gin.H{
|
||||||
"errCode": reply.ErrCode,
|
"errCode": reply.ErrCode,
|
||||||
"errMsg": reply.ErrMsg,
|
"errMsg": reply.ErrMsg,
|
||||||
"reqIdentifier": reply.ReqIdentifier,
|
|
||||||
"data": gin.H{
|
"data": gin.H{
|
||||||
"clientMsgID": reply.ClientMsgID,
|
"clientMsgID": reply.ClientMsgID,
|
||||||
"serverMsgID": reply.ServerMsgID,
|
"serverMsgID": reply.ServerMsgID,
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
package conversation
|
package conversation
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
api "Open_IM/pkg/base_info"
|
||||||
"Open_IM/pkg/common/config"
|
"Open_IM/pkg/common/config"
|
||||||
"Open_IM/pkg/common/log"
|
"Open_IM/pkg/common/log"
|
||||||
"Open_IM/pkg/common/token_verify"
|
|
||||||
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
||||||
"Open_IM/pkg/proto/user"
|
pbConversation "Open_IM/pkg/proto/conversation"
|
||||||
|
pbUser "Open_IM/pkg/proto/user"
|
||||||
"Open_IM/pkg/utils"
|
"Open_IM/pkg/utils"
|
||||||
"context"
|
"context"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@@ -13,182 +14,279 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type paramsSetReceiveMessageOpt struct {
|
func SetConversation(c *gin.Context) {
|
||||||
OperationID string `json:"operationID" binding:"required"`
|
var (
|
||||||
Option *int32 `json:"option" binding:"required"`
|
req api.SetConversationReq
|
||||||
ConversationIdList []string `json:"conversationIdList" binding:"required"`
|
resp api.SetConversationResp
|
||||||
}
|
reqPb pbUser.SetConversationReq
|
||||||
|
)
|
||||||
type OptResult struct {
|
if err := c.BindJSON(&req); err != nil {
|
||||||
ConversationId string `json:"conversationId" binding:"required"`
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error())
|
||||||
Result int32 `json:"result" binding:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type SetReceiveMessageOptResp struct {
|
|
||||||
ErrCode int32 `json:"errCode"`
|
|
||||||
ErrMsg string `json:"errMsg"`
|
|
||||||
Data []OptResult `json:"data"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type paramGetReceiveMessageOpt struct {
|
|
||||||
ConversationIdList []string `json:"conversationIdList" binding:"required"`
|
|
||||||
OperationID string `json:"operationID" binding:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetReceiveMessageOptResp struct {
|
|
||||||
SetReceiveMessageOptResp
|
|
||||||
}
|
|
||||||
|
|
||||||
type paramGetAllConversationMessageOpt struct {
|
|
||||||
OperationID string `json:"operationID" binding:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetAllConversationMessageOptResp struct {
|
|
||||||
SetReceiveMessageOptResp
|
|
||||||
}
|
|
||||||
|
|
||||||
//CopyStructFields
|
|
||||||
|
|
||||||
func GetAllConversationMessageOpt(c *gin.Context) {
|
|
||||||
params := paramGetAllConversationMessageOpt{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
log.NewError(params.OperationID, "bind json failed ", err.Error(), c)
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req)
|
||||||
claims, err := token_verify.ParseToken(c.Request.Header.Get("token"))
|
reqPb.Conversation = &pbUser.Conversation{}
|
||||||
|
err := utils.CopyStructFields(&reqPb, req)
|
||||||
|
err = utils.CopyStructFields(reqPb.Conversation, req.Conversation)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.NewError(params.OperationID, "ParseToken failed, ", err.Error(), c.Request.Header.Get("token"))
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "ParseToken failed, " + err.Error()})
|
}
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
client := pbUser.NewUserClient(etcdConn)
|
||||||
req := &user.GetAllConversationMsgOptReq{
|
respPb, err := client.SetConversation(context.Background(), &reqPb)
|
||||||
UId: claims.UID,
|
|
||||||
OperationID: params.OperationID,
|
|
||||||
}
|
|
||||||
log.NewInfo(req.OperationID, "GetAllConversationMsgOpt req: ", req)
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
|
|
||||||
client := user.NewUserClient(etcdConn)
|
|
||||||
resp, err := client.GetAllConversationMsgOpt(context.Background(), req)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.NewError(params.OperationID, "GetAllConversationMsgOpt rpc failed, ", req, err.Error())
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error())
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()})
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var ginResp GetAllConversationMessageOptResp
|
resp.ErrMsg = respPb.CommonResp.ErrMsg
|
||||||
ginResp.ErrCode = resp.ErrCode
|
resp.ErrCode = respPb.CommonResp.ErrCode
|
||||||
ginResp.ErrMsg = resp.ErrMsg
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp)
|
||||||
for _, v := range resp.ConversationOptResult {
|
c.JSON(http.StatusOK, resp)
|
||||||
var opt OptResult
|
|
||||||
err := utils.CopyStructFields(&opt, *v, "ConversationId", "Result")
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(req.OperationID, "CopyStructFields failed ", err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
ginResp.Data = append(ginResp.Data, opt)
|
|
||||||
}
|
|
||||||
log.NewInfo(req.OperationID, "GetAllConversationMsgOpt resp: ", ginResp, req)
|
|
||||||
c.JSON(http.StatusOK, ginResp)
|
|
||||||
}
|
}
|
||||||
|
func ModifyConversationField(c *gin.Context) {
|
||||||
func GetReceiveMessageOpt(c *gin.Context) {
|
var (
|
||||||
params := paramGetReceiveMessageOpt{}
|
req api.ModifyConversationFieldReq
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
resp api.ModifyConversationFieldResp
|
||||||
log.NewError(params.OperationID, "bind json failed ", err.Error(), c)
|
reqPb pbConversation.ModifyConversationFieldReq
|
||||||
|
)
|
||||||
|
if err := c.BindJSON(&req); err != nil {
|
||||||
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error())
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req)
|
||||||
claims, err := token_verify.ParseToken(c.Request.Header.Get("token"))
|
reqPb.Conversation = &pbConversation.Conversation{}
|
||||||
|
err := utils.CopyStructFields(&reqPb, req)
|
||||||
|
err = utils.CopyStructFields(reqPb.Conversation, req.Conversation)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.NewError(params.OperationID, "ParseToken failed, ", err.Error(), c.Request.Header.Get("token"))
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "ParseToken failed, " + err.Error()})
|
}
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImConversationName, req.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
client := pbConversation.NewConversationClient(etcdConn)
|
||||||
req := &user.GetReceiveMessageOptReq{
|
respPb, err := client.ModifyConversationField(context.Background(), &reqPb)
|
||||||
UId: claims.UID,
|
|
||||||
ConversationId: params.ConversationIdList,
|
|
||||||
OperationID: params.OperationID,
|
|
||||||
}
|
|
||||||
log.NewInfo(req.OperationID, "GetReceiveMessageOptReq req: ", req)
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
|
|
||||||
client := user.NewUserClient(etcdConn)
|
|
||||||
resp, err := client.GetReceiveMessageOpt(context.Background(), req)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.NewError(params.OperationID, "GetReceiveMessageOpt rpc failed, ", req, err.Error())
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error())
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "GetReceiveMessageOpt rpc failed, " + err.Error()})
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.NewInfo(req.OperationID, "GetReceiveMessageOptReq req: ", req, resp)
|
resp.ErrMsg = respPb.CommonResp.ErrMsg
|
||||||
var ginResp GetReceiveMessageOptResp
|
resp.ErrCode = respPb.CommonResp.ErrCode
|
||||||
ginResp.ErrCode = resp.ErrCode
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp)
|
||||||
ginResp.ErrMsg = resp.ErrMsg
|
c.JSON(http.StatusOK, resp)
|
||||||
|
|
||||||
for _, v := range resp.ConversationOptResult {
|
|
||||||
var opt OptResult
|
|
||||||
log.NewInfo("CopyStructFields begin ", v, req.OperationID)
|
|
||||||
err := utils.CopyStructFields(&opt, *v, "ConversationId", "Result")
|
|
||||||
log.NewInfo("CopyStructFields end ", v, req.OperationID)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(req.OperationID, "CopyStructFields failed ", err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
ginResp.Data = append(ginResp.Data, opt)
|
|
||||||
}
|
|
||||||
log.NewInfo(req.OperationID, "GetReceiveMessageOpt resp: ", ginResp)
|
|
||||||
c.JSON(http.StatusOK, ginResp)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BatchSetConversations(c *gin.Context) {
|
||||||
|
var (
|
||||||
|
req api.BatchSetConversationsReq
|
||||||
|
resp api.BatchSetConversationsResp
|
||||||
|
reqPb pbUser.BatchSetConversationsReq
|
||||||
|
)
|
||||||
|
if err := c.BindJSON(&req); err != nil {
|
||||||
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req)
|
||||||
|
if err := utils.CopyStructFields(&reqPb, req); err != nil {
|
||||||
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
||||||
|
}
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := pbUser.NewUserClient(etcdConn)
|
||||||
|
respPb, err := client.BatchSetConversations(context.Background(), &reqPb)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := utils.CopyStructFields(&resp.Data, respPb); err != nil {
|
||||||
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
||||||
|
}
|
||||||
|
resp.ErrMsg = respPb.CommonResp.ErrMsg
|
||||||
|
resp.ErrCode = respPb.CommonResp.ErrCode
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAllConversations(c *gin.Context) {
|
||||||
|
var (
|
||||||
|
req api.GetAllConversationsReq
|
||||||
|
resp api.GetAllConversationsResp
|
||||||
|
reqPb pbUser.GetAllConversationsReq
|
||||||
|
)
|
||||||
|
if err := c.BindJSON(&req); err != nil {
|
||||||
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req)
|
||||||
|
if err := utils.CopyStructFields(&reqPb, req); err != nil {
|
||||||
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
||||||
|
}
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := pbUser.NewUserClient(etcdConn)
|
||||||
|
respPb, err := client.GetAllConversations(context.Background(), &reqPb)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp.ErrMsg = respPb.CommonResp.ErrMsg
|
||||||
|
resp.ErrCode = respPb.CommonResp.ErrCode
|
||||||
|
if err := utils.CopyStructFields(&resp.Conversations, respPb.Conversations); err != nil {
|
||||||
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed, ", err.Error())
|
||||||
|
}
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetConversation(c *gin.Context) {
|
||||||
|
var (
|
||||||
|
req api.GetConversationReq
|
||||||
|
resp api.GetConversationResp
|
||||||
|
reqPb pbUser.GetConversationReq
|
||||||
|
)
|
||||||
|
if err := c.BindJSON(&req); err != nil {
|
||||||
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req)
|
||||||
|
if err := utils.CopyStructFields(&reqPb, req); err != nil {
|
||||||
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
||||||
|
}
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := pbUser.NewUserClient(etcdConn)
|
||||||
|
respPb, err := client.GetConversation(context.Background(), &reqPb)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "GetConversation rpc failed, ", reqPb.String(), err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp.ErrMsg = respPb.CommonResp.ErrMsg
|
||||||
|
resp.ErrCode = respPb.CommonResp.ErrCode
|
||||||
|
if err := utils.CopyStructFields(&resp.Conversation, respPb.Conversation); err != nil {
|
||||||
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
||||||
|
}
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetConversations(c *gin.Context) {
|
||||||
|
var (
|
||||||
|
req api.GetConversationsReq
|
||||||
|
resp api.GetConversationsResp
|
||||||
|
reqPb pbUser.GetConversationsReq
|
||||||
|
)
|
||||||
|
if err := c.BindJSON(&req); err != nil {
|
||||||
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req)
|
||||||
|
if err := utils.CopyStructFields(&reqPb, req); err != nil {
|
||||||
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
||||||
|
}
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := pbUser.NewUserClient(etcdConn)
|
||||||
|
respPb, err := client.GetConversations(context.Background(), &reqPb)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetConversation rpc failed, ", reqPb.String(), err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp.ErrMsg = respPb.CommonResp.ErrMsg
|
||||||
|
resp.ErrCode = respPb.CommonResp.ErrCode
|
||||||
|
if err := utils.CopyStructFields(&resp.Conversations, respPb.Conversations); err != nil {
|
||||||
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
||||||
|
}
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetRecvMsgOpt(c *gin.Context) {
|
||||||
|
var (
|
||||||
|
req api.SetRecvMsgOptReq
|
||||||
|
resp api.SetRecvMsgOptResp
|
||||||
|
reqPb pbUser.SetRecvMsgOptReq
|
||||||
|
)
|
||||||
|
if err := c.BindJSON(&req); err != nil {
|
||||||
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "bind json failed", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req: ", req)
|
||||||
|
if err := utils.CopyStructFields(&reqPb, req); err != nil {
|
||||||
|
log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", err.Error())
|
||||||
|
}
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName, req.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := pbUser.NewUserClient(etcdConn)
|
||||||
|
respPb, err := client.SetRecvMsgOpt(context.Background(), &reqPb)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.OperationID, utils.GetSelfFuncName(), "SetRecvMsgOpt rpc failed, ", reqPb.String(), err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": "GetAllConversationMsgOpt rpc failed, " + err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp.ErrMsg = respPb.CommonResp.ErrMsg
|
||||||
|
resp.ErrCode = respPb.CommonResp.ErrCode
|
||||||
|
log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp: ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
//Deprecated
|
||||||
func SetReceiveMessageOpt(c *gin.Context) {
|
func SetReceiveMessageOpt(c *gin.Context) {
|
||||||
params := paramsSetReceiveMessageOpt{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
log.NewError(params.OperationID, "bind json failed ", err.Error(), c)
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": "bind json failed " + err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
claims, err := token_verify.ParseToken(c.Request.Header.Get("token"))
|
}
|
||||||
if err != nil {
|
|
||||||
log.NewError(params.OperationID, "ParseToken failed, ", err.Error(), c.Request.Header.Get("token"))
|
//Deprecated
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "ParseToken failed, " + err.Error()})
|
func GetReceiveMessageOpt(c *gin.Context) {
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
req := &user.SetReceiveMessageOptReq{
|
//Deprecated
|
||||||
UId: claims.UID,
|
func GetAllConversationMessageOpt(c *gin.Context) {
|
||||||
Opt: *params.Option,
|
|
||||||
ConversationId: params.ConversationIdList,
|
|
||||||
OperationID: params.OperationID,
|
|
||||||
}
|
|
||||||
log.NewInfo(req.OperationID, "SetReceiveMessageOpt req: ", req)
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImUserName)
|
|
||||||
client := user.NewUserClient(etcdConn)
|
|
||||||
resp, err := client.SetReceiveMessageOpt(context.Background(), req)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(params.OperationID, "SetReceiveMessageOpt rpc failed, ", req, err.Error())
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 401, "errMsg": "SetReceiveMessageOpt rpc failed, " + err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.NewInfo(req.OperationID, "SetReceiveMessageOpt req: ", req, resp)
|
|
||||||
ginResp := SetReceiveMessageOptResp{
|
|
||||||
ErrCode: resp.ErrCode,
|
|
||||||
ErrMsg: resp.ErrMsg,
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, v := range resp.OptResult {
|
|
||||||
var opt OptResult
|
|
||||||
log.NewDebug("CopyStructFields begin ", v, req.OperationID)
|
|
||||||
err := utils.CopyStructFields(&opt, *v, "ConversationId", "Result")
|
|
||||||
log.NewDebug("CopyStructFields end ", v, req.OperationID)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(req.OperationID, "CopyStructFields failed ", err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
ginResp.Data = append(ginResp.Data, opt)
|
|
||||||
}
|
|
||||||
log.NewInfo(req.OperationID, "SetReceiveMessageOpt resp: ", ginResp)
|
|
||||||
c.JSON(http.StatusOK, ginResp)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
package friend
|
|
||||||
|
|
||||||
import (
|
|
||||||
"Open_IM/pkg/common/config"
|
|
||||||
"Open_IM/pkg/common/log"
|
|
||||||
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
|
||||||
pbFriend "Open_IM/pkg/proto/friend"
|
|
||||||
"context"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
type paramsAddBlackList struct {
|
|
||||||
OperationID string `json:"operationID" binding:"required"`
|
|
||||||
UID string `json:"uid" binding:"required"`
|
|
||||||
}*/
|
|
||||||
|
|
||||||
func AddBlacklist(c *gin.Context) {
|
|
||||||
log.Info("", "", "api add blacklist init ....")
|
|
||||||
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
|
|
||||||
client := pbFriend.NewFriendClient(etcdConn)
|
|
||||||
//defer etcdConn.Close()
|
|
||||||
|
|
||||||
params := paramsSearchFriend{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req := &pbFriend.AddBlacklistReq{
|
|
||||||
Uid: params.UID,
|
|
||||||
OperationID: params.OperationID,
|
|
||||||
Token: c.Request.Header.Get("token"),
|
|
||||||
OwnerUid: params.OwnerUid,
|
|
||||||
}
|
|
||||||
log.Info(req.Token, req.OperationID, "api add blacklist is server:userID=%s", req.Uid)
|
|
||||||
RpcResp, err := client.AddBlacklist(context.Background(), req)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(req.Token, req.OperationID, "err=%s,call add blacklist rpc server failed", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add blacklist rpc server failed"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.InfoByArgs("call add blacklist rpc server success,args=%s", RpcResp.String())
|
|
||||||
resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
|
|
||||||
c.JSON(http.StatusOK, resp)
|
|
||||||
log.InfoByArgs("api add blacklist success return,get args=%s,return args=%s", req.String(), RpcResp.String())
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
package friend
|
|
||||||
|
|
||||||
import (
|
|
||||||
"Open_IM/pkg/common/config"
|
|
||||||
"Open_IM/pkg/common/log"
|
|
||||||
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
|
||||||
pbFriend "Open_IM/pkg/proto/friend"
|
|
||||||
"context"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type paramsImportFriendReq struct {
|
|
||||||
OperationID string `json:"operationID" binding:"required"`
|
|
||||||
UIDList []string `json:"uidList" binding:"required"`
|
|
||||||
OwnerUid string `json:"ownerUid" binding:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type paramsAddFriend struct {
|
|
||||||
OperationID string `json:"operationID" binding:"required"`
|
|
||||||
UID string `json:"uid" binding:"required"`
|
|
||||||
ReqMessage string `json:"reqMessage"`
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
func ImportFriend(c *gin.Context) {
|
|
||||||
log.Info("", "", "ImportFriend init ....")
|
|
||||||
log.NewDebug("", "api importFriend start")
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
|
|
||||||
client := pbFriend.NewFriendClient(etcdConn)
|
|
||||||
|
|
||||||
params := paramsImportFriendReq{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req := &pbFriend.ImportFriendReq{
|
|
||||||
UidList: params.UIDList,
|
|
||||||
OperationID: params.OperationID,
|
|
||||||
OwnerUid: params.OwnerUid,
|
|
||||||
Token: c.Request.Header.Get("token"),
|
|
||||||
}
|
|
||||||
log.NewDebug(req.OperationID, "args is ", req.String())
|
|
||||||
RpcResp, err := client.ImportFriend(context.Background(), req)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(req.OperationID, "rpc importFriend failed", err.Error())
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "cImportFriend failed " + err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
failedUidList := make([]string, 0)
|
|
||||||
for _, v := range RpcResp.FailedUidList {
|
|
||||||
failedUidList = append(failedUidList, v)
|
|
||||||
}
|
|
||||||
log.NewDebug(req.OperationID, "rpc importFriend success", RpcResp.CommonResp.ErrorMsg, RpcResp.CommonResp.ErrorCode, RpcResp.FailedUidList)
|
|
||||||
c.JSON(http.StatusOK, gin.H{"errCode": RpcResp.CommonResp.ErrorCode, "errMsg": RpcResp.CommonResp.ErrorMsg, "failedUidList": failedUidList})
|
|
||||||
}
|
|
||||||
|
|
||||||
func AddFriend(c *gin.Context) {
|
|
||||||
log.Info("", "", "api add friend init ....")
|
|
||||||
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
|
|
||||||
client := pbFriend.NewFriendClient(etcdConn)
|
|
||||||
|
|
||||||
params := paramsAddFriend{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req := &pbFriend.AddFriendReq{
|
|
||||||
Uid: params.UID,
|
|
||||||
OperationID: params.OperationID,
|
|
||||||
ReqMessage: params.ReqMessage,
|
|
||||||
Token: c.Request.Header.Get("token"),
|
|
||||||
}
|
|
||||||
log.Info(req.Token, req.OperationID, "api add friend is server")
|
|
||||||
RpcResp, err := client.AddFriend(context.Background(), req)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(req.Token, req.OperationID, "err=%s,call add friend rpc server failed", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add friend rpc server failed"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.InfoByArgs("call add friend rpc server success,args=%s", RpcResp.String())
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
|
||||||
"errCode": RpcResp.ErrorCode,
|
|
||||||
"errMsg": RpcResp.ErrorMsg,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
package friend
|
|
||||||
|
|
||||||
import (
|
|
||||||
"Open_IM/pkg/common/config"
|
|
||||||
"Open_IM/pkg/common/log"
|
|
||||||
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
|
||||||
pbFriend "Open_IM/pkg/proto/friend"
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type paramsAddFriendResponse struct {
|
|
||||||
OperationID string `json:"operationID" binding:"required"`
|
|
||||||
UID string `json:"uid" binding:"required"`
|
|
||||||
Flag int32 `json:"flag" binding:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func AddFriendResponse(c *gin.Context) {
|
|
||||||
log.Info("", "", fmt.Sprintf("api add friend response init ...."))
|
|
||||||
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
|
|
||||||
client := pbFriend.NewFriendClient(etcdConn)
|
|
||||||
//defer etcdConn.Close()
|
|
||||||
|
|
||||||
params := paramsAddFriendResponse{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req := &pbFriend.AddFriendResponseReq{
|
|
||||||
Uid: params.UID,
|
|
||||||
Flag: params.Flag,
|
|
||||||
OperationID: params.OperationID,
|
|
||||||
Token: c.Request.Header.Get("token"),
|
|
||||||
}
|
|
||||||
log.Info(req.Token, req.OperationID, "api add friend response is server:userID=%s", req.Uid)
|
|
||||||
RpcResp, err := client.AddFriendResponse(context.Background(), req)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(req.Token, req.OperationID, "err=%s,call add_friend_response rpc server failed", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add_friend_response rpc server failed"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.InfoByArgs("call add friend response rpc server success,args=%s", RpcResp.String())
|
|
||||||
c.JSON(http.StatusOK, gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg})
|
|
||||||
log.InfoByArgs("api add friend response success return,get args=%s,return args=%s", req.String(), RpcResp.String())
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
package friend
|
|
||||||
|
|
||||||
import (
|
|
||||||
"Open_IM/pkg/common/config"
|
|
||||||
"Open_IM/pkg/common/log"
|
|
||||||
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
|
||||||
pbFriend "Open_IM/pkg/proto/friend"
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type paramsDeleteFriend struct {
|
|
||||||
OperationID string `json:"operationID" binding:"required"`
|
|
||||||
UID string `json:"uid" binding:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteFriend(c *gin.Context) {
|
|
||||||
log.Info("", "", fmt.Sprintf("api delete_friend init ...."))
|
|
||||||
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
|
|
||||||
client := pbFriend.NewFriendClient(etcdConn)
|
|
||||||
//defer etcdConn.Close()
|
|
||||||
|
|
||||||
params := paramsDeleteFriend{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req := &pbFriend.DeleteFriendReq{
|
|
||||||
Uid: params.UID,
|
|
||||||
OperationID: params.OperationID,
|
|
||||||
Token: c.Request.Header.Get("token"),
|
|
||||||
}
|
|
||||||
log.Info(req.Token, req.OperationID, "api delete_friend is server:%s", req.Uid)
|
|
||||||
RpcResp, err := client.DeleteFriend(context.Background(), req)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(req.Token, req.OperationID, "err=%s,call delete_friend rpc server failed", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call delete_friend rpc server failed"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.InfoByArgs("call delete_friend rpc server,args=%s", RpcResp.String())
|
|
||||||
resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
|
|
||||||
c.JSON(http.StatusOK, resp)
|
|
||||||
log.InfoByArgs("api delete_friend success return,get args=%s,return args=%s", req.String(), RpcResp.String())
|
|
||||||
}
|
|
||||||
534
internal/api/friend/friend.go
Normal file
534
internal/api/friend/friend.go
Normal file
@@ -0,0 +1,534 @@
|
|||||||
|
package friend
|
||||||
|
|
||||||
|
import (
|
||||||
|
jsonData "Open_IM/internal/utils"
|
||||||
|
api "Open_IM/pkg/base_info"
|
||||||
|
"Open_IM/pkg/common/config"
|
||||||
|
"Open_IM/pkg/common/log"
|
||||||
|
"Open_IM/pkg/common/token_verify"
|
||||||
|
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
||||||
|
rpc "Open_IM/pkg/proto/friend"
|
||||||
|
open_im_sdk "Open_IM/pkg/proto/sdk_ws"
|
||||||
|
"Open_IM/pkg/utils"
|
||||||
|
"context"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func AddBlack(c *gin.Context) {
|
||||||
|
params := api.AddBlacklistReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.AddBlacklistReq{CommID: &rpc.CommID{}}
|
||||||
|
utils.CopyStructFields(req.CommID, ¶ms)
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.CommID.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.CommID.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.CommID.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.NewInfo(params.OperationID, "AddBlacklist args ", req.String())
|
||||||
|
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName, req.CommID.OperationID)
|
||||||
|
client := rpc.NewFriendClient(etcdConn)
|
||||||
|
RpcResp, err := client.AddBlacklist(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.CommID.OperationID, "AddBlacklist failed ", err.Error())
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add blacklist rpc server failed"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp := api.AddBlacklistResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
|
||||||
|
log.NewInfo(req.CommID.OperationID, "AddBlacklist api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ImportFriend(c *gin.Context) {
|
||||||
|
params := api.ImportFriendReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.ImportFriendReq{}
|
||||||
|
utils.CopyStructFields(req, ¶ms)
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.NewInfo(req.OperationID, "ImportFriend args ", req.String())
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName, req.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
client := rpc.NewFriendClient(etcdConn)
|
||||||
|
RpcResp, err := client.ImportFriend(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.OperationID, "ImportFriend failed ", err.Error(), req.String())
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "ImportFriend failed "})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp := api.ImportFriendResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
|
||||||
|
if resp.ErrCode == 0 {
|
||||||
|
for _, v := range RpcResp.UserIDResultList {
|
||||||
|
resp.UserIDResultList = append(resp.UserIDResultList, api.UserIDResult{UserID: v.UserID, Result: v.Result})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(resp.UserIDResultList) == 0 {
|
||||||
|
resp.UserIDResultList = []api.UserIDResult{}
|
||||||
|
}
|
||||||
|
log.NewInfo(req.OperationID, "ImportFriend api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddFriend(c *gin.Context) {
|
||||||
|
params := api.AddFriendReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.AddFriendReq{CommID: &rpc.CommID{}}
|
||||||
|
utils.CopyStructFields(req.CommID, ¶ms.ParamsCommFriend)
|
||||||
|
req.ReqMsg = params.ReqMsg
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.CommID.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.CommID.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.CommID.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.NewInfo(req.CommID.OperationID, "AddFriend args ", req.String())
|
||||||
|
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName, req.CommID.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.CommID.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := rpc.NewFriendClient(etcdConn)
|
||||||
|
RpcResp, err := client.AddFriend(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.CommID.OperationID, "AddFriend failed ", err.Error(), req.String())
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call AddFriend rpc server failed"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := api.AddFriendResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
|
||||||
|
log.NewInfo(req.CommID.OperationID, "AddFriend api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddFriendResponse(c *gin.Context) {
|
||||||
|
params := api.AddFriendResponseReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.AddFriendResponseReq{CommID: &rpc.CommID{}}
|
||||||
|
utils.CopyStructFields(req.CommID, ¶ms.ParamsCommFriend)
|
||||||
|
req.HandleMsg = params.HandleMsg
|
||||||
|
req.HandleResult = params.Flag
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.CommID.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.CommID.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.CommID.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
utils.CopyStructFields(req, ¶ms)
|
||||||
|
log.NewInfo(req.CommID.OperationID, "AddFriendResponse args ", req.String())
|
||||||
|
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName, req.CommID.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.CommID.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
client := rpc.NewFriendClient(etcdConn)
|
||||||
|
RpcResp, err := client.AddFriendResponse(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.CommID.OperationID, "AddFriendResponse failed ", err.Error(), req.String())
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add_friend_response rpc server failed"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := api.AddFriendResponseResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
|
||||||
|
log.NewInfo(req.CommID.OperationID, "AddFriendResponse api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteFriend(c *gin.Context) {
|
||||||
|
params := api.DeleteFriendReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.DeleteFriendReq{CommID: &rpc.CommID{}}
|
||||||
|
utils.CopyStructFields(req.CommID, ¶ms.ParamsCommFriend)
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.CommID.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.CommID.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.CommID.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.NewInfo(req.CommID.OperationID, "DeleteFriend args ", req.String())
|
||||||
|
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName, req.CommID.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.CommID.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := rpc.NewFriendClient(etcdConn)
|
||||||
|
RpcResp, err := client.DeleteFriend(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.CommID.OperationID, "DeleteFriend failed ", err, req.String())
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call delete_friend rpc server failed"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := api.DeleteFriendResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
|
||||||
|
log.NewInfo(req.CommID.OperationID, "DeleteFriend api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetBlacklist(c *gin.Context) {
|
||||||
|
params := api.GetBlackListReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.GetBlacklistReq{CommID: &rpc.CommID{}}
|
||||||
|
utils.CopyStructFields(req.CommID, ¶ms)
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.CommID.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.CommID.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.CommID.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.NewInfo(req.CommID.OperationID, "GetBlacklist args ", req.String())
|
||||||
|
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName, req.CommID.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.CommID.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := rpc.NewFriendClient(etcdConn)
|
||||||
|
RpcResp, err := client.GetBlacklist(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.CommID.OperationID, "GetBlacklist failed ", err.Error(), req.String())
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get blacklist rpc server failed"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := api.GetBlackListResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}}
|
||||||
|
for _, v := range RpcResp.BlackUserInfoList {
|
||||||
|
black := open_im_sdk.PublicUserInfo{}
|
||||||
|
utils.CopyStructFields(&black, v)
|
||||||
|
resp.BlackUserInfoList = append(resp.BlackUserInfoList, &black)
|
||||||
|
}
|
||||||
|
resp.Data = jsonData.JsonDataList(resp.BlackUserInfoList)
|
||||||
|
log.NewInfo(req.CommID.OperationID, "GetBlacklist api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetFriendRemark(c *gin.Context) {
|
||||||
|
params := api.SetFriendRemarkReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.SetFriendRemarkReq{CommID: &rpc.CommID{}}
|
||||||
|
utils.CopyStructFields(req.CommID, ¶ms.ParamsCommFriend)
|
||||||
|
req.Remark = params.Remark
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.CommID.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.CommID.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.CommID.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.NewInfo(req.CommID.OperationID, "SetFriendComment args ", req.String())
|
||||||
|
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName, req.CommID.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.CommID.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := rpc.NewFriendClient(etcdConn)
|
||||||
|
RpcResp, err := client.SetFriendRemark(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.CommID.OperationID, "SetFriendComment failed ", err.Error(), req.String())
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call set friend comment rpc server failed"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp := api.SetFriendRemarkResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
|
||||||
|
|
||||||
|
log.NewInfo(req.CommID.OperationID, "SetFriendComment api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RemoveBlack(c *gin.Context) {
|
||||||
|
params := api.RemoveBlackListReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.RemoveBlacklistReq{CommID: &rpc.CommID{}}
|
||||||
|
utils.CopyStructFields(req.CommID, ¶ms.ParamsCommFriend)
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.CommID.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.CommID.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.CommID.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.NewInfo(req.CommID.OperationID, "RemoveBlacklist args ", req.String())
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName, req.CommID.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.CommID.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
client := rpc.NewFriendClient(etcdConn)
|
||||||
|
RpcResp, err := client.RemoveBlacklist(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.CommID.OperationID, "RemoveBlacklist failed ", err.Error(), req.String())
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call remove blacklist rpc server failed"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp := api.RemoveBlackListResp{CommResp: api.CommResp{ErrCode: RpcResp.CommonResp.ErrCode, ErrMsg: RpcResp.CommonResp.ErrMsg}}
|
||||||
|
log.NewInfo(req.CommID.OperationID, "RemoveBlacklist api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsFriend(c *gin.Context) {
|
||||||
|
params := api.IsFriendReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.IsFriendReq{CommID: &rpc.CommID{}}
|
||||||
|
utils.CopyStructFields(req.CommID, ¶ms.ParamsCommFriend)
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.CommID.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.CommID.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.CommID.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.NewInfo(req.CommID.OperationID, "IsFriend args ", req.String())
|
||||||
|
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName, req.CommID.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.CommID.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := rpc.NewFriendClient(etcdConn)
|
||||||
|
RpcResp, err := client.IsFriend(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.CommID.OperationID, "IsFriend failed ", err.Error(), req.String())
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call add friend rpc server failed"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp := api.IsFriendResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}}
|
||||||
|
resp.Response.Friend = RpcResp.Response
|
||||||
|
|
||||||
|
log.NewInfo(req.CommID.OperationID, "IsFriend api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetFriendList(c *gin.Context) {
|
||||||
|
params := api.GetFriendListReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.GetFriendListReq{CommID: &rpc.CommID{}}
|
||||||
|
utils.CopyStructFields(req.CommID, ¶ms)
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.CommID.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.CommID.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.CommID.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.NewInfo(req.CommID.OperationID, "GetFriendList args ", req.String())
|
||||||
|
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName, req.CommID.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.CommID.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := rpc.NewFriendClient(etcdConn)
|
||||||
|
RpcResp, err := client.GetFriendList(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.CommID.OperationID, "GetFriendList failed ", err.Error(), req.String())
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get friend list rpc server failed"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := api.GetFriendListResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, FriendInfoList: RpcResp.FriendInfoList}
|
||||||
|
resp.Data = jsonData.JsonDataList(resp.FriendInfoList)
|
||||||
|
log.NewInfo(req.CommID.OperationID, "GetFriendList api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
//c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetFriendApplyList(c *gin.Context) {
|
||||||
|
params := api.GetFriendApplyListReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.GetFriendApplyListReq{CommID: &rpc.CommID{}}
|
||||||
|
utils.CopyStructFields(req.CommID, ¶ms)
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.CommID.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.CommID.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.CommID.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.NewInfo(req.CommID.OperationID, "GetFriendApplyList args ", req.String())
|
||||||
|
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName, req.CommID.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.CommID.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := rpc.NewFriendClient(etcdConn)
|
||||||
|
|
||||||
|
RpcResp, err := client.GetFriendApplyList(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.CommID.OperationID, "GetFriendApplyList failed ", err.Error(), req.String())
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get friend apply list rpc server failed"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := api.GetFriendApplyListResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, FriendRequestList: RpcResp.FriendRequestList}
|
||||||
|
resp.Data = jsonData.JsonDataList(resp.FriendRequestList)
|
||||||
|
log.NewInfo(req.CommID.OperationID, "GetFriendApplyList api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSelfFriendApplyList(c *gin.Context) {
|
||||||
|
params := api.GetSelfApplyListReq{}
|
||||||
|
if err := c.BindJSON(¶ms); err != nil {
|
||||||
|
log.NewError("0", "BindJSON failed ", err.Error())
|
||||||
|
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
req := &rpc.GetSelfApplyListReq{CommID: &rpc.CommID{}}
|
||||||
|
utils.CopyStructFields(req.CommID, ¶ms)
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var errInfo string
|
||||||
|
ok, req.CommID.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.CommID.OperationID)
|
||||||
|
if !ok {
|
||||||
|
errMsg := req.CommID.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.NewInfo(req.CommID.OperationID, "GetSelfApplyList args ", req.String())
|
||||||
|
|
||||||
|
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName, req.CommID.OperationID)
|
||||||
|
if etcdConn == nil {
|
||||||
|
errMsg := req.CommID.OperationID + "getcdv3.GetConn == nil"
|
||||||
|
log.NewError(req.CommID.OperationID, errMsg)
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
client := rpc.NewFriendClient(etcdConn)
|
||||||
|
RpcResp, err := client.GetSelfApplyList(context.Background(), req)
|
||||||
|
if err != nil {
|
||||||
|
log.NewError(req.CommID.OperationID, "GetSelfApplyList failed ", err.Error(), req.String())
|
||||||
|
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get self apply list rpc server failed"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp := api.GetSelfApplyListResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, FriendRequestList: RpcResp.FriendRequestList}
|
||||||
|
resp.Data = jsonData.JsonDataList(resp.FriendRequestList)
|
||||||
|
log.NewInfo(req.CommID.OperationID, "GetSelfApplyList api return ", resp)
|
||||||
|
c.JSON(http.StatusOK, resp)
|
||||||
|
}
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
package friend
|
|
||||||
|
|
||||||
import (
|
|
||||||
"Open_IM/pkg/common/config"
|
|
||||||
"Open_IM/pkg/common/log"
|
|
||||||
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
|
||||||
pbFriend "Open_IM/pkg/proto/friend"
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type paramsGetBlackList struct {
|
|
||||||
OperationID string `json:"operationID" binding:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type blackListUserInfo struct {
|
|
||||||
UID string `json:"uid"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Icon string `json:"icon"`
|
|
||||||
Gender int32 `json:"gender"`
|
|
||||||
Mobile string `json:"mobile"`
|
|
||||||
Birth string `json:"birth"`
|
|
||||||
Email string `json:"email"`
|
|
||||||
Ex string `json:"ex"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetBlacklist(c *gin.Context) {
|
|
||||||
log.Info("", "", "api get blacklist init ....")
|
|
||||||
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
|
|
||||||
client := pbFriend.NewFriendClient(etcdConn)
|
|
||||||
//defer etcdConn.Close()
|
|
||||||
|
|
||||||
params := paramsGetBlackList{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req := &pbFriend.GetBlacklistReq{
|
|
||||||
OperationID: params.OperationID,
|
|
||||||
Token: c.Request.Header.Get("token"),
|
|
||||||
}
|
|
||||||
log.Info(req.Token, req.OperationID, fmt.Sprintf("api get blacklist is server"))
|
|
||||||
RpcResp, err := client.GetBlacklist(context.Background(), req)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(req.Token, req.OperationID, "err=%s,call get_friend_list rpc server failed", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get blacklist rpc server failed"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.InfoByArgs("call get blacklist rpc server success,args=%s", RpcResp.String())
|
|
||||||
if RpcResp.ErrorCode == 0 {
|
|
||||||
userBlackList := make([]blackListUserInfo, 0)
|
|
||||||
for _, friend := range RpcResp.Data {
|
|
||||||
var fi blackListUserInfo
|
|
||||||
fi.UID = friend.Uid
|
|
||||||
fi.Name = friend.Name
|
|
||||||
fi.Icon = friend.Icon
|
|
||||||
fi.Gender = friend.Gender
|
|
||||||
fi.Mobile = friend.Mobile
|
|
||||||
fi.Birth = friend.Birth
|
|
||||||
fi.Email = friend.Email
|
|
||||||
fi.Ex = friend.Ex
|
|
||||||
userBlackList = append(userBlackList, fi)
|
|
||||||
}
|
|
||||||
resp := gin.H{
|
|
||||||
"errCode": RpcResp.ErrorCode,
|
|
||||||
"errMsg": RpcResp.ErrorMsg,
|
|
||||||
"data": userBlackList,
|
|
||||||
}
|
|
||||||
c.JSON(http.StatusOK, resp)
|
|
||||||
} else {
|
|
||||||
resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
|
|
||||||
c.JSON(http.StatusOK, resp)
|
|
||||||
}
|
|
||||||
log.InfoByArgs("api get black list success return,get args=%s,return=%s", req.String(), RpcResp.String())
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
package friend
|
|
||||||
|
|
||||||
import (
|
|
||||||
"Open_IM/pkg/common/config"
|
|
||||||
"Open_IM/pkg/common/log"
|
|
||||||
"Open_IM/pkg/grpc-etcdv3/getcdv3"
|
|
||||||
pbFriend "Open_IM/pkg/proto/friend"
|
|
||||||
"context"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type paramsGetApplyList struct {
|
|
||||||
OperationID string `json:"operationID" binding:"required"`
|
|
||||||
}
|
|
||||||
type UserInfo struct {
|
|
||||||
UID string `json:"uid"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Icon string `json:"icon"`
|
|
||||||
Gender int32 `json:"gender"`
|
|
||||||
Mobile string `json:"mobile"`
|
|
||||||
Birth string `json:"birth"`
|
|
||||||
Email string `json:"email"`
|
|
||||||
Ex string `json:"ex"`
|
|
||||||
ReqMessage string `json:"reqMessage"`
|
|
||||||
ApplyTime string `json:"applyTime"`
|
|
||||||
Flag int32 `json:"flag"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetFriendApplyList(c *gin.Context) {
|
|
||||||
log.Info("", "", "api get_friend_apply_list init ....")
|
|
||||||
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
|
|
||||||
client := pbFriend.NewFriendClient(etcdConn)
|
|
||||||
//defer etcdConn.Close()
|
|
||||||
|
|
||||||
params := paramsGetApplyList{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req := &pbFriend.GetFriendApplyReq{
|
|
||||||
OperationID: params.OperationID,
|
|
||||||
Token: c.Request.Header.Get("token"),
|
|
||||||
}
|
|
||||||
log.Info(req.Token, req.OperationID, "api get friend apply list is server")
|
|
||||||
RpcResp, err := client.GetFriendApplyList(context.Background(), req)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(req.Token, req.OperationID, "err=%s,call get friend apply list rpc server failed", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get friend apply list rpc server failed"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.InfoByArgs("call get friend apply list rpc server success,args=%s", RpcResp.String())
|
|
||||||
if RpcResp.ErrorCode == 0 {
|
|
||||||
userInfoList := make([]UserInfo, 0)
|
|
||||||
for _, applyUserinfo := range RpcResp.Data {
|
|
||||||
var un UserInfo
|
|
||||||
un.UID = applyUserinfo.Uid
|
|
||||||
un.Name = applyUserinfo.Name
|
|
||||||
un.Icon = applyUserinfo.Icon
|
|
||||||
un.Gender = applyUserinfo.Gender
|
|
||||||
un.Mobile = applyUserinfo.Mobile
|
|
||||||
un.Birth = applyUserinfo.Birth
|
|
||||||
un.Email = applyUserinfo.Email
|
|
||||||
un.Ex = applyUserinfo.Ex
|
|
||||||
un.Flag = applyUserinfo.Flag
|
|
||||||
un.ApplyTime = applyUserinfo.ApplyTime
|
|
||||||
un.ReqMessage = applyUserinfo.ReqMessage
|
|
||||||
userInfoList = append(userInfoList, un)
|
|
||||||
}
|
|
||||||
resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg, "data": userInfoList}
|
|
||||||
c.JSON(http.StatusOK, resp)
|
|
||||||
} else {
|
|
||||||
resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
|
|
||||||
c.JSON(http.StatusOK, resp)
|
|
||||||
}
|
|
||||||
log.InfoByArgs("api get friend apply list success return,get args=%s,return args=%s", req.String(), RpcResp.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSelfApplyList(c *gin.Context) {
|
|
||||||
log.Info("", "", "api get self friend apply list init ....")
|
|
||||||
|
|
||||||
etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
|
|
||||||
client := pbFriend.NewFriendClient(etcdConn)
|
|
||||||
//defer etcdConn.Close()
|
|
||||||
|
|
||||||
params := paramsGetApplyList{}
|
|
||||||
if err := c.BindJSON(¶ms); err != nil {
|
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req := &pbFriend.GetFriendApplyReq{
|
|
||||||
OperationID: params.OperationID,
|
|
||||||
Token: c.Request.Header.Get("token"),
|
|
||||||
}
|
|
||||||
log.Info(req.Token, req.OperationID, "api get self apply list is server")
|
|
||||||
RpcResp, err := client.GetSelfApplyList(context.Background(), req)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(req.Token, req.OperationID, "err=%s,call get self apply list rpc server failed", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call get self apply list rpc server failed"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.InfoByArgs("call get self apply list rpc server success,args=%s", RpcResp.String())
|
|
||||||
if RpcResp.ErrorCode == 0 {
|
|
||||||
userInfoList := make([]UserInfo, 0)
|
|
||||||
for _, selfApplyOtherUserinfo := range RpcResp.Data {
|
|
||||||
var un UserInfo
|
|
||||||
un.UID = selfApplyOtherUserinfo.Uid
|
|
||||||
un.Name = selfApplyOtherUserinfo.Name
|
|
||||||
un.Icon = selfApplyOtherUserinfo.Icon
|
|
||||||
un.Gender = selfApplyOtherUserinfo.Gender
|
|
||||||
un.Mobile = selfApplyOtherUserinfo.Mobile
|
|
||||||
un.Birth = selfApplyOtherUserinfo.Birth
|
|
||||||
un.Email = selfApplyOtherUserinfo.Email
|
|
||||||
un.Ex = selfApplyOtherUserinfo.Ex
|
|
||||||
un.Flag = selfApplyOtherUserinfo.Flag
|
|
||||||
un.ApplyTime = selfApplyOtherUserinfo.ApplyTime
|
|
||||||
un.ReqMessage = selfApplyOtherUserinfo.ReqMessage
|
|
||||||
userInfoList = append(userInfoList, un)
|
|
||||||
}
|
|
||||||
resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg, "data": userInfoList}
|
|
||||||
c.JSON(http.StatusOK, resp)
|
|
||||||
} else {
|
|
||||||
resp := gin.H{"errCode": RpcResp.ErrorCode, "errMsg": RpcResp.ErrorMsg}
|
|
||||||
c.JSON(http.StatusOK, resp)
|
|
||||||
}
|
|
||||||
log.InfoByArgs("api get self apply list success return,get args=%s,return args=%s", req.String(), RpcResp.String())
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user