DhammaTermController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Support\Facades\DB;
  5. use Illuminate\Support\Str;
  6. use Illuminate\Support\Facades\App;
  7. use Illuminate\Support\Facades\Log;
  8. use App\Models\DhammaTerm;
  9. use App\Models\Channel;
  10. use App\Http\Resources\TermResource;
  11. use App\Http\Api\AuthApi;
  12. use App\Http\Api\StudioApi;
  13. use App\Http\Api\ChannelApi;
  14. use App\Http\Api\ShareApi;
  15. use App\Tools\Tools;
  16. use App\Tools\RedisClusters;
  17. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  18. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  19. class DhammaTermController extends Controller
  20. {
  21. /**
  22. * Display a listing of the resource.
  23. *
  24. * @return \Illuminate\Http\Response
  25. */
  26. public function index(Request $request)
  27. {
  28. $result = false;
  29. $indexCol = [
  30. 'id',
  31. 'guid',
  32. 'word',
  33. 'meaning',
  34. 'other_meaning',
  35. 'note',
  36. 'tag',
  37. 'language',
  38. 'channal',
  39. 'owner',
  40. 'editor_id',
  41. 'created_at',
  42. 'updated_at'
  43. ];
  44. switch ($request->get('view')) {
  45. case 'create-by-channel':
  46. # 新建术语时。根据术语所在channel 给出新建术语所需数据。如语言,备选意思等。
  47. #获取channel信息
  48. $currChannel = Channel::where('uid', $request->get('channel'))->first();
  49. if (!$currChannel) {
  50. return $this->error(__('auth.failed'));
  51. }
  52. #TODO 查询studio信息
  53. #获取同studio的channel列表
  54. $studioChannels = Channel::where('owner_uid', $currChannel->owner_uid)
  55. ->select(['name', 'uid'])
  56. ->get();
  57. #获取全网意思列表
  58. $meanings = DhammaTerm::where('word', $request->get('word'))
  59. ->where('language', $currChannel->lang)
  60. ->select(['meaning', 'other_meaning'])
  61. ->get();
  62. $meaningList = [];
  63. foreach ($meanings as $key => $value) {
  64. # code...
  65. $meaning1 = [$value->meaning];
  66. if (!empty($value->other_meaning)) {
  67. $meaning2 = \explode(',', $value->other_meaning);
  68. $meaning1 = array_merge($meaning1, $meaning2);
  69. }
  70. foreach ($meaning1 as $key => $value) {
  71. # code...
  72. if (isset($meaningList[$value])) {
  73. $meaningList[$value]++;
  74. } else {
  75. $meaningList[$value] = 1;
  76. }
  77. }
  78. }
  79. $meaningCount = [];
  80. foreach ($meaningList as $key => $value) {
  81. # code...
  82. $meaningCount[] = ['meaning' => $key, 'count' => $value];
  83. }
  84. return $this->ok([
  85. "word" => $request->get('word'),
  86. "meaningCount" => $meaningCount,
  87. "studioChannels" => $studioChannels,
  88. "language" => $currChannel->lang,
  89. 'studio' => StudioApi::getById($currChannel->owner_uid),
  90. ]);
  91. break;
  92. case 'studio':
  93. # 获取 studio 内所有 term
  94. $user = AuthApi::current($request);
  95. if (!$user) {
  96. return $this->error(__('auth.failed'), [], 401);
  97. }
  98. //判断当前用户是否有指定的studio的权限
  99. if ($user['user_uid'] !== StudioApi::getIdByName($request->get('name'))) {
  100. return $this->error(__('auth.failed'), [], 403);
  101. }
  102. $table = DhammaTerm::select($indexCol)
  103. ->where('owner', $user["user_uid"]);
  104. break;
  105. case 'channel':
  106. # 获取 studio 内所有 term
  107. $user = AuthApi::current($request);
  108. if (!$user) {
  109. return $this->error(__('auth.failed'));
  110. }
  111. //判断当前用户是否有指定的 channel 的权限
  112. $channel = Channel::find($request->get('id'));
  113. if ($user['user_uid'] !== $channel->owner_uid) {
  114. //看是否为协作
  115. $power = ShareApi::getResPower($user['user_uid'], $request->get('id'));
  116. if ($power === 0) {
  117. return $this->error(__('auth.failed'), [], 403);
  118. }
  119. }
  120. $table = DhammaTerm::select($indexCol)
  121. ->where('channal', $request->get('id'));
  122. break;
  123. case 'show':
  124. return $this->ok(DhammaTerm::find($request->get('id')));
  125. break;
  126. case 'user':
  127. # code...
  128. $user = AuthApi::current($request);
  129. if (!$user) {
  130. return $this->error(__('auth.failed'));
  131. }
  132. $userUid = $user['user_uid'];
  133. $search = $request->get('search');
  134. $table = DhammaTerm::select($indexCol)
  135. ->where('owner', $userUid);
  136. break;
  137. case 'word':
  138. $table = DhammaTerm::select($indexCol)
  139. ->whereIn('word', explode(',', $request->get("word")))
  140. ->orWhereIn('meaning', explode(',', $request->get("word")));
  141. break;
  142. case 'tag':
  143. $table = DhammaTerm::select($indexCol)
  144. ->whereIn('tag', explode(',', $request->get("tag")));
  145. break;
  146. case 'hot-meaning':
  147. $key = 'term/hot_meaning';
  148. $value = RedisClusters::get($key, function () use ($request) {
  149. $hotMeaning = [];
  150. $words = DhammaTerm::select('word')
  151. ->where('language', $request->get("language"))
  152. ->groupby('word')
  153. ->get();
  154. foreach ($words as $key => $word) {
  155. # code...
  156. $result = DhammaTerm::select(DB::raw('count(*) as word_count, meaning'))
  157. ->where('language', $request->get("language"))
  158. ->where('word', $word['word'])
  159. ->groupby('meaning')
  160. ->orderby('word_count', 'desc')
  161. ->first();
  162. if ($result) {
  163. $hotMeaning[] = [
  164. 'word' => $word['word'],
  165. 'meaning' => $result['meaning'],
  166. 'language' => $request->get("language"),
  167. 'owner' => '',
  168. ];
  169. }
  170. }
  171. RedisClusters::put($key, $hotMeaning, 3600);
  172. return $hotMeaning;
  173. }, config('mint.cache.expire'));
  174. return $this->ok(["rows" => $value, "count" => count($value)]);
  175. break;
  176. default:
  177. # code...
  178. break;
  179. }
  180. $search = $request->get('search');
  181. if (!empty($search)) {
  182. $table = $table->where(function ($query) use ($search) {
  183. $query->where('word', 'like', $search . "%")
  184. ->orWhere('word_en', 'like', $search . "%")
  185. ->orWhere('meaning', 'like', "%" . $search . "%");
  186. });
  187. }
  188. $count = $table->count();
  189. $table = $table->orderBy($request->get('order', 'updated_at'), $request->get('dir', 'desc'));
  190. $table = $table->skip($request->get("offset", 0))
  191. ->take($request->get('limit', 1000));
  192. $result = $table->get();
  193. return $this->ok(["rows" => TermResource::collection($result), "count" => $count]);
  194. }
  195. /**
  196. * Store a newly created resource in storage.
  197. *
  198. * @param \Illuminate\Http\Request $request
  199. * @return \Illuminate\Http\Response
  200. */
  201. public function store(Request $request)
  202. {
  203. $user = AuthApi::current($request);
  204. if (!$user) {
  205. return $this->error(__('auth.failed'));
  206. }
  207. $validated = $request->validate([
  208. 'word' => 'required',
  209. 'meaning' => 'required',
  210. ]);
  211. /**
  212. * 查询重复的
  213. * 一个channel下面word+tag+language 唯一
  214. */
  215. $table = DhammaTerm::where('owner', $user["user_uid"])
  216. ->where('word', $request->get("word"))
  217. ->where('tag', $request->get("tag"));
  218. if (!empty($request->get("channel"))) {
  219. $isDoesntExist = $table->where('channal', $request->get("channel"))
  220. ->doesntExist();
  221. } else {
  222. $isDoesntExist = $table->whereNull('channal')->where('language', $request->get("language"))
  223. ->doesntExist();
  224. }
  225. if ($isDoesntExist) {
  226. #没有重复的 插入数据
  227. $term = new DhammaTerm;
  228. $term->id = app('snowflake')->id();
  229. $term->guid = Str::uuid();
  230. $term->word = $request->get("word");
  231. $term->word_en = Tools::getWordEn($request->get("word"));
  232. $term->meaning = $request->get("meaning");
  233. $term->other_meaning = $request->get("other_meaning");
  234. $term->note = $request->get("note");
  235. $term->tag = $request->get("tag");
  236. $term->channal = $request->get("channel");
  237. $term->language = $request->get("language");
  238. if (!empty($request->get("channel"))) {
  239. $channelInfo = ChannelApi::getById($request->get("channel"));
  240. if (!$channelInfo) {
  241. return $this->error("channel id failed");
  242. } else {
  243. //查看有没有channel权限
  244. $power = ShareApi::getResPower($user["user_uid"], $request->get("channel"), 2);
  245. if ($power < 20) {
  246. return $this->error(__('auth.failed'));
  247. }
  248. $term->owner = $channelInfo['studio_id'];
  249. $term->language = $channelInfo['lang'];
  250. }
  251. } else {
  252. if ($request->has("studioId")) {
  253. $studioId = $request->get("studioId");
  254. } else if ($request->has("studioName")) {
  255. $studioId = StudioApi::getIdByName($request->get("studioName"));
  256. }
  257. if (Str::isUuid($studioId)) {
  258. $term->owner = $studioId;
  259. } else {
  260. return $this->error('not valid studioId');
  261. }
  262. }
  263. $term->editor_id = $user["user_id"];
  264. $term->create_time = time() * 1000;
  265. $term->modify_time = time() * 1000;
  266. $term->save();
  267. //删除cache
  268. $this->deleteCache($term);
  269. return $this->ok(new TermResource($term));
  270. } else {
  271. return $this->error("word existed", [], 200);
  272. }
  273. }
  274. private function deleteCache($term)
  275. {
  276. if (empty($term->channal)) {
  277. //通用 查询studio所有channel
  278. $channels = Channel::where('owner_uid', $term->owner)->select('uid')->get();
  279. foreach ($channels as $channel) {
  280. RedisClusters::forget("/term/{$channel}/{$term->word}");
  281. }
  282. } else {
  283. RedisClusters::forget("/term/{$term->channal}/{$term->word}");
  284. }
  285. }
  286. /**
  287. * Display the specified resource.
  288. *
  289. * @param string $id
  290. * @return \Illuminate\Http\Response
  291. */
  292. public function show(Request $request, $id)
  293. {
  294. //
  295. $result = DhammaTerm::where('guid', $id)->first();
  296. if ($result) {
  297. return $this->ok(new TermResource($result));
  298. } else {
  299. return $this->error("没有查询到数据");
  300. }
  301. }
  302. /**
  303. * Update the specified resource in storage.
  304. *
  305. * @param \Illuminate\Http\Request $request
  306. * @param \App\Models\DhammaTerm $dhammaTerm
  307. * @return \Illuminate\Http\Response
  308. */
  309. public function update(Request $request, string $id)
  310. {
  311. //
  312. $user = AuthApi::current($request);
  313. if (!$user) {
  314. return $this->error(__('auth.failed'), [], 401);
  315. }
  316. $dhammaTerm = DhammaTerm::find($id);
  317. if (!$dhammaTerm) {
  318. return $this->error('404');
  319. }
  320. if (empty($dhammaTerm->channal)) {
  321. //查看有没有studio权限
  322. if ($user['user_uid'] !== $dhammaTerm->owner) {
  323. return $this->error(__('auth.failed'), [], 403);
  324. }
  325. } else {
  326. //查看有没有channel权限
  327. $power = ShareApi::getResPower($user["user_uid"], $dhammaTerm->channal, 2);
  328. if ($power < 20) {
  329. return $this->error(__('auth.failed'), [], 403);
  330. }
  331. }
  332. $dhammaTerm->word = $request->get("word");
  333. $dhammaTerm->word_en = Tools::getWordEn($request->get("word"));
  334. $dhammaTerm->meaning = $request->get("meaning");
  335. $dhammaTerm->other_meaning = $request->get("other_meaning");
  336. $dhammaTerm->note = $request->get("note");
  337. $dhammaTerm->tag = $request->get("tag");
  338. $dhammaTerm->language = $request->get("language");
  339. $dhammaTerm->editor_id = $user["user_id"];
  340. $dhammaTerm->create_time = time() * 1000;
  341. $dhammaTerm->modify_time = time() * 1000;
  342. $dhammaTerm->save();
  343. //删除cache
  344. $this->deleteCache($dhammaTerm);
  345. return $this->ok(new TermResource($dhammaTerm));
  346. }
  347. /**
  348. * Remove the specified resource from storage.
  349. *
  350. * @param \App\Models\DhammaTerm $dhammaTerm
  351. * @return \Illuminate\Http\Response
  352. */
  353. public function destroy(DhammaTerm $dhammaTerm, Request $request)
  354. {
  355. /**
  356. * 一次删除多个单词
  357. */
  358. $user = AuthApi::current($request);
  359. if (!$user) {
  360. return $this->error(__('auth.failed'));
  361. }
  362. $count = 0;
  363. if ($request->has("uuid")) {
  364. //查看是否有删除权限
  365. foreach ($request->get("id") as $key => $uuid) {
  366. $term = DhammaTerm::find($uuid);
  367. if ($term->owner !== $user['user_uid']) {
  368. if (!empty($term->channal)) {
  369. //看是否为协作
  370. $power = ShareApi::getResPower($user['user_uid'], $term->channal);
  371. if ($power < 20) {
  372. continue;
  373. }
  374. } else {
  375. continue;
  376. }
  377. }
  378. $count += $term->delete();
  379. //删除cache
  380. $this->deleteCache($term);
  381. }
  382. } else {
  383. $arrId = json_decode($request->get("id"), true);
  384. foreach ($arrId as $key => $id) {
  385. # code...
  386. $term = DhammaTerm::where('id', $id)
  387. ->where('owner', $user['user_uid']);
  388. $result = $term->delete();
  389. $this->deleteCache($term);
  390. if ($result) {
  391. $count++;
  392. }
  393. }
  394. }
  395. return $this->ok($count);
  396. }
  397. }