Compare commits

...

1074 Commits

Author SHA1 Message Date
jasder cb11a5c8e9 发布v3.1.1版本
* FIX 修复pulls、issues 搜索数量统计问题
* FIX 解决在线创建文件错误提示信息不准确的问题
* FIX table name bug
* FIX 解决applied_projects相关表操作的问题
* FIX 解决排序参数的判断预防SQL注入
* FIX 项目导航栏数量改为开启中的数量
* FIX 解决项目邀请码的索引查询问题
* FIX FIX get readme file bug
* FIX sql attack
* FIX projects load by invite code slowly
2021-06-18 17:09:57 +08:00
jasder 1fd514186c Merge branch 'sync_develop' into develop 2021-06-18 11:03:18 +08:00
jasder aff088a444 ADD issues all count for issues api 2021-06-18 11:02:58 +08:00
jasder 4223100180 "FIX 修复pulls、issues 搜索数量统计问题 2021-06-18 10:54:05 +08:00
jasder fd9cc46fc0 Merge branch 'develop' into sync_develop 2021-06-18 10:52:47 +08:00
jasder 67e49a4f56 FIX 修复pulls、issues 搜索数量统计问题 2021-06-18 10:52:14 +08:00
jasder c4f701607c fix table name bug 2021-06-17 17:31:08 +08:00
jasder 80a6ad6712 fix meger develop branch 2021-06-17 17:30:11 +08:00
jasder 9e01bb4f24 FIX change table name 2021-06-17 17:28:15 +08:00
jasder bf0bf0e23b 解决applied_projects相关表操作的问题 2021-06-17 17:05:32 +08:00
jasder b38e7dce2d 增加排序参数的判断预防SQL注入、项目导航栏数量改为开启中的数量、项目邀请码增加索引、搜索用户sql优化 2021-06-17 17:03:56 +08:00
jasder ffc14da311 FIX get readme file bug 2021-06-17 17:01:23 +08:00
vilet.yy 2682d60717 fix: repeat table name 2021-06-17 16:37:48 +08:00
vilet.yy bdb8154a55 add: fork user type 2021-06-17 16:25:48 +08:00
vilet.yy 09dfd504c2 fix: sql attack 2021-06-17 16:13:40 +08:00
jasder 155fafff9a FIX code bug 2021-06-17 14:42:32 +08:00
vilet.yy 880f09a94a fix: change pulls navbar count 2021-06-16 11:10:26 +08:00
vilet.yy 80c1573aea fix: change issue navbar count 2021-06-16 10:42:04 +08:00
vilet.yy be63beb78b fix: update openning count navbar 2021-06-16 09:49:08 +08:00
vilet.yy 7fccd2aed2 fix: nickname search alone 2021-06-15 16:14:15 +08:00
vilet.yy 818317c292 fix: projects load by invite code slowly 2021-06-15 15:33:23 +08:00
jasder 7c43f2d8fc ADD 邀请码功能 2021-06-11 17:43:14 +08:00
jasder d5ad96c7d2 ADD 数据统计功能 2021-06-11 17:41:59 +08:00
vilet.yy 1501b21f8c fix: update doc 2021-06-11 16:29:25 +08:00
vilet.yy bdec369ec2 back: change navbar count 2021-06-11 16:19:43 +08:00
vilet.yy 1376e004f2 fix 2021-06-11 14:54:24 +08:00
vilet.yy 672f37fe48 add: project detail show open task count 2021-06-11 14:11:44 +08:00
vilet.yy 7c1725ebe2 fix: invite code error 2021-06-11 11:54:00 +08:00
jasder a99fb69b30 Merge branch 'develop' into sync_develop 2021-06-11 11:22:12 +08:00
jasder d2340e30cb ADD admim statistics url 2021-06-11 11:21:44 +08:00
jasder a695600b52 FIX update CHANGELOG.md 2021-06-11 11:20:39 +08:00
vilet.yy d077f18590 fix: update invite_code error 2021-06-11 09:30:22 +08:00
vilet.yy 44cbb537ca add: role field 2021-06-10 11:44:48 +08:00
vilet.yy 9d07181733 fix: undo_events 2021-06-10 10:57:06 +08:00
vilet.yy 77c1b1e188 add: undo_join_projects 2021-06-10 10:49:26 +08:00
vilet.yy 5489ea9fbc add: applied join project 2021-06-09 16:53:09 +08:00
vilet.yy d4b8b3e24f add: invite code 2021-06-09 13:36:57 +08:00
jasder c5d73b7cf8 v3.1.0
* 改版升级个人主页
* 修复bug
* 更改license
2021-06-09 09:52:57 +08:00
jasder 5ef9549b6b change license 2021-06-09 09:48:51 +08:00
jasder 1fca089949 FIX change license 2021-06-09 09:43:34 +08:00
jasder 8831345fd2 搜索无法匹配昵称用户、用户画像开发能力缓存数据 2021-06-08 18:11:41 +08:00
jasder 39acaa7f21 FIX 解决头歌版本库无法访问的问题 2021-06-08 14:34:03 +08:00
vilet.yy 02fe8a8966 add: user and platform cache 2021-06-08 11:51:46 +08:00
jasder 5ca897dc43 Merge branch 'develop' into sync_develop 2021-06-08 09:39:14 +08:00
vilet.yy a5b98bcad4 fix: concat nickname 2021-06-07 14:56:23 +08:00
vilet.yy d5a65112ca fix: statistics develop load slowly 2021-06-07 14:17:12 +08:00
jasder 4754993e2a ADD 个人中心模块
用户开发能力
用户近期活动统计
用户贡献度
用户动态
用户开发能力
用户角色定位
用户专业定位
用户精选模块
修改个人资料
修改账号密码
调整导入初始数据的顺序
mimemagic安装不上
2021-06-04 18:51:09 +08:00
vilet.yy e8f4b3f17c fix 2021-06-04 18:43:12 +08:00
vilet.yy c211c38d87 fix 2021-06-04 18:41:19 +08:00
vilet.yy 12c252ea10 fix: merge from hh_develop 2021-06-04 18:36:33 +08:00
vilet.yy 2ea9fcd4d7 add: projects filter choosed 2021-06-04 18:35:35 +08:00
jasder 8133fcd37a FIX 更改推荐项目排序方式 2021-06-04 11:33:21 +08:00
jasder c5c67afacc 解决一些bug
* FIX 解决镜像项目手动同步镜像不成功的问题
* FIX新建易修api中 更新相关cache key
2021-06-03 17:26:19 +08:00
viletyy ed8d646d47 add: user update password 2021-06-03 17:12:27 +08:00
jasder fcf8033fbf FIX 解决镜像项目手动同步镜像不成功的问题 2021-06-03 17:04:22 +08:00
jasder 2b82b2c4f5 FIX [bug]新建易修api中 更新相关cache key 2021-06-03 16:56:54 +08:00
viletyy 93169f8c96 fix: user update return info 2021-06-03 15:43:36 +08:00
viletyy 6b436acfaf add: user info add gender 2021-06-03 15:22:08 +08:00
viletyy 317c211de9 add: user info add show field 2021-06-03 11:56:32 +08:00
viletyy c58b074173 fix: init project 2021-06-03 11:27:13 +08:00
vilet.yy 7dc21ff388 add: update user more info 2021-06-03 11:27:13 +08:00
vilet.yy 0368c0321f fix: org transfer bug 2021-06-03 11:27:13 +08:00
vilet.yy fff790bb19 add: pinned projects project_id 2021-06-03 11:27:13 +08:00
vilet.yy 16c293562a add: pinned projects order by position 2021-06-03 11:27:12 +08:00
vilet.yy 7ba45bc866 fix: some bug 2021-06-03 11:27:12 +08:00
vilet.yy 21d4751327 add: update user image 2021-06-03 11:27:12 +08:00
vilet.yy dc91cd4346 fix 2021-06-03 11:27:12 +08:00
vilet.yy 86f0f2051d add: update user_info 2021-06-03 11:27:12 +08:00
vilet.yy dc4c99c305 fix: psimple issue field 2021-06-03 11:27:12 +08:00
vilet.yy 7fa1cdf73e add: user created time 2021-06-03 11:27:12 +08:00
vilet.yy cdce7049ad fix 2021-06-03 11:27:12 +08:00
vilet.yy 1872ad00d5 uupdate: api docs 2021-06-03 11:27:12 +08:00
vilet.yy 2410f5bbc0 add: user statistics 2021-06-03 11:27:12 +08:00
vilet.yy ca8fa20c2c add: user project trends 2021-06-03 11:27:12 +08:00
vilet.yy ea79772bd2 add: user pinned projects 2021-06-03 11:27:12 +08:00
vilet.yy 422fd35f1e add: user headmap 2021-06-03 11:27:12 +08:00
vilet.yy 496867cac7 add: update user more info 2021-06-03 10:19:33 +08:00
vilet.yy e4a40fb382 fix: org transfer bug 2021-06-03 09:48:58 +08:00
jasder a0ca4d3acb FIX 新建易修api中 更新相关cache key 2021-06-02 17:35:06 +08:00
vilet.yy c727ccf3e6 add: pinned projects project_id 2021-06-02 17:29:11 +08:00
vilet.yy 96a8da5d26 add: pinned projects order by position 2021-06-02 16:40:40 +08:00
vilet.yy df6da37b95 fix: some bug 2021-06-02 15:29:00 +08:00
vilet.yy 2ad963cdf1 add: update user image 2021-06-01 10:07:01 +08:00
vilet.yy 4a1b857655 fix 2021-05-31 18:46:39 +08:00
vilet.yy 0b450c0c5f add: update user_info 2021-05-31 18:39:49 +08:00
vilet.yy a0f0b5e3f1 fix: psimple issue field 2021-05-28 18:00:53 +08:00
vilet.yy 9a2b067bc1 add: user created time 2021-05-28 16:53:37 +08:00
vilet.yy 5431349d46 fix 2021-05-28 16:08:49 +08:00
vilet.yy 61b19c1745 uupdate: api docs 2021-05-28 16:04:52 +08:00
vilet.yy 1df95eab4d add: user statistics 2021-05-28 15:36:05 +08:00
vilet.yy ff1c80d1de add: user project trends 2021-05-27 16:40:15 +08:00
vilet.yy c2449d59af add: user pinned projects 2021-05-27 14:23:59 +08:00
vilet.yy cacc807978 add: user headmap 2021-05-27 10:30:34 +08:00
jasder 77076c60a6 ADD issue、pull、milestone钩子,自动触发项目的更新时间 2021-05-26 17:37:13 +08:00
jasder e716dba249 FIX query project members api bug 2021-05-24 17:05:06 +08:00
jasder 8a10a183e0 Merge branch 'develop' 2021-05-24 10:18:03 +08:00
jasder 554925eacd FIX update CHANGELOG.md 2021-05-24 10:17:20 +08:00
jasder 6d1bcabd51 Merge branch 'master' of https://git.trustie.net/jasder/forgeplus 2021-05-24 10:10:24 +08:00
jasder 203624a615 Merge branch 'sync_develop' into develop 2021-05-21 19:26:31 +08:00
jasder e0eae66ab4 FIX [用户查询方式]临时处理获取readme文件问题 2021-05-21 19:26:17 +08:00
jasder a8e53d4e5c FIX [code bug]临时处理获取readme文件问题 2021-05-21 18:51:46 +08:00
jasder 1c8d0686ee FIX [base64解码操作]临时处理获取readme文件问题 2021-05-21 18:41:29 +08:00
jasder 5b2d6a8063 FIX [bug]临时处理获取readme文件问题 2021-05-21 18:34:33 +08:00
jasder ffa74e92a3 FIX 临时处理获取readme文件问题 2021-05-21 18:29:14 +08:00
jasder 00f5a7f916 ADD issue pull 支持内容搜索 2021-05-21 16:42:53 +08:00
jasder 8a47761afb ADD mergeable column for get pull api 2021-05-21 11:39:50 +08:00
jasder c627ea6c19 FIX migration project accelerator's bug 2021-05-17 17:14:55 +08:00
jasder 2f9d583fac FIX add nickname lastname query conditions for list users api 2021-05-17 16:57:46 +08:00
jasder acc4282c8e Merge branch 'sync_develop' into develop 2021-05-15 10:19:57 +08:00
jasder 27d9d806ce FIX update project bug 2021-05-15 10:19:25 +08:00
jasder 5d91b6b3be ADD 页面置顶功能等功能
* ADD 页面置顶功能
* ADD FAQ快速入口
* 修复bug
2021-05-14 17:34:07 +08:00
jasder 8ee0acae85 set default desc sort for faqs api 2021-05-14 16:39:32 +08:00
jasder dac07bcae0 ADD 页面置顶功能、帮助文档快速入口 2021-05-14 16:23:19 +08:00
jasder b1abac201f FIX query columns bug with query recommend organization api 2021-05-13 15:06:41 +08:00
jasder e304dd0c98 FIX query recommend organization bug 2021-05-13 15:02:28 +08:00
jasder fe9201d9f6 FIX code bug 2021-05-13 14:56:58 +08:00
jasder c2d7d8289e FIX dismiss num for recommend projects api 2021-05-13 14:53:46 +08:00
jasder 2cca2c756e ADD recommend organizations api 2021-05-13 14:52:07 +08:00
jasder 3c61848a77 Merge branch 'sync_develop' into develop 2021-05-10 14:38:46 +08:00
jasder 23704dbae3 FIX get mirror url bug with get detail repo api 2021-05-10 14:38:39 +08:00
jasder 86f03ffafc Merge OK 2021-05-08 17:46:22 +08:00
jasder 9f837c62fb Update CHANGELOG.md 2021-05-08 17:01:50 +08:00
jasder d768e81afd Update CHANGELOG.md 2021-05-08 16:48:56 +08:00
jasder 8341c177b6 FIX craete team bug 2021-05-08 16:44:51 +08:00
vilet.yy 5c9702b308 fix: build owner team need nickname 2021-05-08 15:12:48 +08:00
jasder f470807225 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-05-08 14:23:05 +08:00
jasder 51597335a4 FIX 修复易修标题过长导致排版问题 2021-05-08 14:13:16 +08:00
jasder eba8a3553d ADD valiate
* ADD 项目验证信息
* ADD 组织验证信息
* ADD 团队验证信息
* FIX 处理找不到贡献者的bug
* FIX 处理同步镜像项目导航设置功能的bug
2021-05-08 14:11:37 +08:00
vilet.yy e490ddb1f5 add: sync mirror project remove pulls module 2021-05-07 17:27:37 +08:00
guotao c96dacbf88 修复编号:45283 易修标题过长导致排版问题 去掉多余的属性 2021-05-07 16:26:56 +08:00
jasder b162b3357a FIX get mirror url bug 2021-05-07 14:06:40 +08:00
jasder c67686bdf5 FIX code review 2021-05-07 11:10:03 +08:00
guotao 1021731d2b 修复编号:45283 易修标题过长导致排版问题 2021-05-07 10:45:31 +08:00
vilet.yy fc5876fc32 add: team valid 2021-05-06 18:22:30 +08:00
vilet.yy 411c10e8f3 add: project update valid and user login valid 2021-05-06 17:37:30 +08:00
vilet.yy d867823f01 add: organization validate 2021-05-06 17:04:08 +08:00
vilet.yy 604c2595d3 add: projects create validate length 2021-05-06 15:10:02 +08:00
vilet.yy 1c111e83b3 fix: project controbutor nil 2021-05-06 14:48:59 +08:00
jasder 4643d2387c ADD 创建合并请求错误提示
创建合并请求错误提示
2021-04-30 16:55:06 +08:00
vilet.yy 3ca629d47d fix:create repo error 2021-04-30 16:45:09 +08:00
vilet.yy a9c0d18a5f add: gitea response process 2021-04-30 16:28:29 +08:00
jasder b22330d146 Merge branch 'sync_develop' into develop 2021-04-29 23:23:25 +08:00
jasder b2e338732d FIX 解决合并请求的权限问题 2021-04-29 23:23:16 +08:00
jasder d71272146f Merge branch 'sync_develop' into develop 2021-04-29 23:18:56 +08:00
jasder c56f0ca7fc FIX 解决合并请求的权限问题 2021-04-29 23:17:55 +08:00
jasder 744f857f20 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-04-29 19:24:49 +08:00
jasder f222cc6e4f FIX bug
个人名下所有仓库加载接口调整
2021-04-29 19:18:58 +08:00
jasder e87413f8a0 FIX migrate repo api bug 2021-04-29 19:12:48 +08:00
jasder 0133ec24ca FIX pr merge bug 2021-04-29 18:48:54 +08:00
jasder 03e54f9b3d Merge branch 'sync_develop' into develop 2021-04-29 18:37:09 +08:00
jasder 1277e717ff ADD github gitlab镜像加速器 2021-04-29 18:35:57 +08:00
vilet.yy 1a7b323120 fix: user info projects count 2021-04-29 18:09:39 +08:00
vilet.yy fffe57a211 fix: mirror project permission error 2021-04-29 18:09:39 +08:00
vilet.yy b673747475 fix: personal projects 2021-04-29 18:09:38 +08:00
jasder a4555e2d10 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-04-29 10:41:40 +08:00
jasder c920994274 FIX bug
* 解决合并请求允许指派给开发者
* 开发者可以合并请求
* 更新仓库信息自动删除代码库模块
2021-04-29 10:41:30 +08:00
vilet.yy c14c92ac11 fix: pull_request permit develop create pr 2021-04-29 10:32:49 +08:00
jasder 8bf02b1ee5 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-04-28 21:16:52 +08:00
jasder 9876e84c17 FIX bug 2021-04-28 21:15:58 +08:00
vilet.yy ea42b0d6ed fix: pull_request can not select reporter and compare userinfo lose 2021-04-28 20:10:21 +08:00
jasder 660a48b257 FIX 易修、合并请求选择成员增加组织成员 2021-04-28 16:57:12 +08:00
vilet.yy 65d51e8578 add: project operate add organization team users 2021-04-28 15:15:45 +08:00
jasder c3d9e38e05 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-04-27 18:24:25 +08:00
jasder 7d612ea6b3 ADD 转移仓库功能以及待办事项 2021-04-27 18:24:10 +08:00
vilet.yy 120a33bc8a add: undo count 2021-04-27 15:43:37 +08:00
vilet.yy b68c9945e5 add: project edit transfer 2021-04-27 14:40:18 +08:00
vilet.yy 01360de423 fix: acceptor must exist 2021-04-27 13:56:12 +08:00
jasder 5bd33c033c FIX bug 2021-04-26 16:52:48 +08:00
vilet.yy 0d828ead1f fix:some bug 2021-04-26 16:50:50 +08:00
jasder 1a22491e36 ADD admin role to org api 2021-04-26 16:45:58 +08:00
jasder 95a355b87c FIX admin projects api bug 2021-04-26 16:45:26 +08:00
vilet.yy 13768f9778 add: same repo condition 2021-04-26 15:28:49 +08:00
vilet.yy 220ca96669 fix 2021-04-26 15:17:51 +08:00
vilet.yy 28c8761f32 fix 2021-04-26 15:11:08 +08:00
vilet.yy 1d81548eb6 fix 2021-04-26 11:32:59 +08:00
vilet.yy 96238c2e13 fix 2021-04-26 11:04:10 +08:00
vilet.yy d532dc7cf5 fix: some bug and users api doc 2021-04-26 10:57:57 +08:00
vilet.yy 8b7b1b7a4e add: api doc about projects 2021-04-26 10:07:22 +08:00
vilet.yy 1e081b5a3e add: transfer project 2021-04-25 18:41:13 +08:00
jasder 8c71a72fce FIX code bug 2021-04-23 17:53:59 +08:00
jasder ee7acaaa82 FIX update README.md 2021-04-23 17:32:45 +08:00
jasder c1d4df6e06 FIX release show time bug 2021-04-23 17:21:17 +08:00
jasder 55f7beb22d FIX update CHANGELOG.md 2021-04-23 17:19:28 +08:00
jasder aa314c141c ADD some url with in hovercoard api 2021-04-23 14:40:26 +08:00
jasder 37e1704897 ADD location column for user hovercard api 2021-04-22 18:10:20 +08:00
jasder ddacf2a733 FIX get organzition's name bug 2021-04-22 16:45:26 +08:00
jasder d07543111a FIX code bug 2021-04-22 16:42:50 +08:00
jasder 908cda56f3 ADD users/hovercard api 2021-04-22 16:36:40 +08:00
jasder 841778900c FIX code review 2021-04-22 16:35:54 +08:00
jasder 6a3d297b30 FIX code bug 2021-04-20 19:07:48 +08:00
jasder 002c773746 FIX code bug 2021-04-20 19:06:31 +08:00
jasder 45f05c9fc4 FIX render commmiter and author avatar bug 2021-04-20 18:58:14 +08:00
jasder 84e48d25c1 FIX render user bug with pull‘s commits and repo's commits api 2021-04-20 18:35:41 +08:00
jasder 37d8a5426f Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-04-20 11:14:03 +08:00
jasder df3bf621ce FIX 团队中的项目名称显示问题 2021-04-20 11:08:18 +08:00
vilet.yy da98efe04f add: org project field 2021-04-20 10:50:06 +08:00
vilet.yy 2976742b29 fix: org team nickname change error 2021-04-19 18:37:30 +08:00
vilet.yy 55e081ba2b fix 2021-04-19 18:37:30 +08:00
vilet.yy a3c49b3d5f add: org valid 2021-04-19 18:37:30 +08:00
vilet.yy 5a9f29c25f fix 2021-04-19 18:37:30 +08:00
vilet.yy f75827bcf0 fix: org not need create member 2021-04-19 18:37:30 +08:00
vilet.yy f0c4d1226b fix: org not need create member 2021-04-19 18:37:30 +08:00
vilet.yy 3a47c61010 add: team nickname 2021-04-19 18:37:30 +08:00
jasder 1f0388c1a1 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-04-19 18:36:07 +08:00
jasder de6ae5b720 Upate models Schema Information 2021-04-19 18:36:02 +08:00
jasder 8a55e84372 FIX 调整自动生成头像中字母大小 2021-04-19 18:34:18 +08:00
jasder f055fed7d0 ADD 创建团队支持中文名称
创建组织团队使用中文名称报错、组织项目下创建issue报错
2021-04-19 18:10:31 +08:00
jasder 21befb6486 FIX auto generate avatar bug 2021-04-19 17:28:57 +08:00
jasder b6e8a135f0 FIX url_to_avatar bug 2021-04-19 15:42:54 +08:00
jasder 9cddda7fd4 Update render user avatar url in projects api 2021-04-19 15:38:51 +08:00
jasder 002ae9f327 ADD auto generate user avatar 2021-04-19 15:06:56 +08:00
vilet.yy 8055ae2c07 fix: org team nickname change error 2021-04-19 12:14:11 +08:00
vilet.yy 01f32ae2d7 fix 2021-04-19 12:09:38 +08:00
vilet.yy 1c6982d15b add: org valid 2021-04-19 12:07:12 +08:00
vilet.yy 9300483c1a fix 2021-04-19 11:40:38 +08:00
vilet.yy 1920cb5ce3 fix: org not need create member 2021-04-19 11:35:12 +08:00
vilet.yy 5a20842edb fix: org not need create member 2021-04-19 11:26:30 +08:00
vilet.yy 506ab1722d add: team nickname 2021-04-19 10:54:36 +08:00
jasder 07d11737e9 组织权限问题
组织权限问题
2021-04-13 16:39:50 +08:00
vilet.yy 1fe9ea126a fix: permission with organization 2021-04-13 11:53:06 +08:00
jasder dcd4457cf5 FIX 开放平台管理员可以访问所有团队信息 2021-04-13 10:16:18 +08:00
jasder 0bd6621821 项目增加课程链接 2021-04-08 18:35:49 +08:00
vilet.yy 04a1376820 add: project's lesson_url 2021-04-08 15:20:34 +08:00
jasder c3a1fb78ea 组织支持中文名称 2021-04-07 11:34:37 +08:00
vilet.yy cf224bc9fe add: project menulist resources 2021-04-07 11:29:44 +08:00
vilet.yy d6c3bcfaf1 add: org add nickname 2021-04-07 11:29:44 +08:00
vilet.yy a66e5b876d fix 2021-04-07 11:29:44 +08:00
vilet.yy b11fd350da fix: project permission 2021-04-07 11:29:44 +08:00
vilet.yy c417fa7369 add: project list author type 2021-04-07 11:29:44 +08:00
jasder e9a4370adc pull bug 2021-04-02 18:57:49 +08:00
jasder e6b8435037 FIX gug 2021-04-02 18:57:13 +08:00
vilet.yy c175fa1339 fix: commit author and fork create units 2021-04-02 18:53:53 +08:00
jasder 6ce4b26047 FIX api bug 2021-04-02 18:40:26 +08:00
jasder e022e429d4 FIX code bug 2021-04-02 18:22:21 +08:00
jasder 50fb8d3983 ADD sync user info api 2021-04-02 18:18:52 +08:00
jasder 02d26df172 FIX query builds api bug 2021-04-02 15:53:17 +08:00
jasder 254718e390 Update db/structure.sql 2021-04-01 20:33:05 +08:00
jasder 0b6ebb7b36 FIX get site url bug with setting api 2021-04-01 15:04:17 +08:00
jasder e638dccfa5 update readme 2021-03-31 16:08:00 +08:00
jasder b89501822f FIX code bug 2021-03-31 14:53:50 +08:00
jasder 5f5b380514 FIX conflict 2021-03-31 13:35:40 +08:00
jasder d2293a2778 FIX setting api bug 2021-03-31 12:44:40 +08:00
jasder 7d0b05f975 update readme 2021-03-31 12:43:06 +08:00
jasder 9393ceb8b7 Update readme and deploy 2021-03-31 10:30:39 +08:00
jasder 860b46685a fix bug 2021-03-31 10:24:37 +08:00
jasder 62b99c517e Update deploy doc 2021-03-31 10:08:20 +08:00
jasder 3869529620 Update setting api 2021-03-31 09:49:05 +08:00
vilet.yy 9394d15752 fix: menu manager allow visit 2021-03-30 17:27:50 +08:00
vilet.yy 8952f6a944 fix: menu manager allow visit 2021-03-30 17:13:58 +08:00
vilet.yy ffa2782637 fix: detail release version limit 2021-03-30 16:34:31 +08:00
vilet.yy d0a65775aa fix: not show commiter avatar 2021-03-30 16:34:12 +08:00
vilet.yy d7a459bad2 add: dir md 2021-03-30 16:33:21 +08:00
jasder fc522be5ea Merge branch 'trustie_server' into develop 2021-03-30 15:25:59 +08:00
jasder 9195d43a34 Update readme and deply doc 2021-03-30 15:15:17 +08:00
jasder a866415990 Merge branch 'master' into develop 2021-03-30 14:20:47 +08:00
jasder 69bf30d482 Merge branch 'develop' into trustie_server 2021-03-28 20:05:34 +08:00
jasder c4560ebb66 FIX tags api bug 2021-03-28 20:05:13 +08:00
jasder 0211d6152e fix conflict 2021-03-28 20:00:28 +08:00
jasder 12f1aba07e Merge branch 'develop' into trustie_server 2021-03-28 19:44:36 +08:00
jasder 63d91919ae FIX repo detail api bug 2021-03-28 19:44:23 +08:00
jasder 06c851d22f Merge branch 'develop' into trustie_server 2021-03-27 23:54:32 +08:00
jasder ad4617288d FIX repositories detail api bug 2021-03-27 23:54:14 +08:00
jasder 7c0a2aa89e Merge branch 'develop' into trustie_server 2021-03-25 14:31:45 +08:00
jasder e1d7b0b881 FIX readme decoder bug
safe
2021-03-25 14:30:26 +08:00
vilet.yy 7f28f07665 fix: readme error 2021-03-25 11:31:43 +08:00
jasder 3be5c013a8 fix bug 2021-03-24 18:36:05 +08:00
vilet.yy 70c7b1da0c add: auto counter rake 2021-03-24 15:42:57 +08:00
vilet.yy 66608b3baa add: detail project description 2021-03-24 13:59:24 +08:00
vilet.yy 9ee42e805b fix: update error 2021-03-24 13:50:17 +08:00
vilet.yy 15f9004f63 add: edit permit website 2021-03-24 10:50:47 +08:00
jasder 0f67944911 FIX code bug 2021-03-23 15:58:12 +08:00
jasder 8b656fd409 FIX bug 2021-03-23 15:47:01 +08:00
jasder 815b364428 ADD common url with setting api 2021-03-23 15:42:56 +08:00
jasder 18ae3853d7 FIX update setting api 2021-03-23 11:42:22 +08:00
jasder ce18cc380a Merge branch 'develop' into trustie_server 2021-03-22 21:02:17 +08:00
jasder cbc6f4e7d1 fix bug 2021-03-22 20:53:39 +08:00
jasder aa23762b2f FIX update setting api for nav bar url 2021-03-22 18:02:12 +08:00
vilet.yy 5c864acb64 fix: create repo not use website 2021-03-22 15:50:08 +08:00
vilet.yy 8bbfea2079 fix 2021-03-22 11:18:04 +08:00
vilet.yy 8c2a543e61 fix: project code change to default 2021-03-22 11:16:35 +08:00
jasder 2932866198 Merge branch 'master' of https://git.trustie.net/jasder/forgeplus 2021-03-22 09:50:35 +08:00
jasder 0d8ddc34cc FIX update Changelog 2021-03-22 09:50:24 +08:00
jasder 0909223867 FIX get readme api method 2021-03-21 11:24:34 +08:00
jasder c07c570061 动态导航权限控制,没有勾选模块不能进入页面,语言过滤0.0%
动态导航权限控制,没有勾选模块不能进入页面,语言过滤0.0%
2021-03-19 18:40:23 +08:00
vilet.yy 223755a965 fix: languages filter 0.0% 2021-03-19 18:36:55 +08:00
vilet.yy f1ed61c687 add: menu permission control 2021-03-19 18:01:29 +08:00
vilet.yy 553a584121 fix: migrate create unit
fix
2021-03-19 17:38:14 +08:00
jasder 04288a734e 木兰项目同步脚本以及动态导航简化 2021-03-19 15:07:07 +08:00
vilet.yy db2ba95e24 fadd: repo edit unit 2021-03-19 15:05:09 +08:00
vilet.yy 39f0811f0a fix:simple unit 2021-03-19 14:58:25 +08:00
vilet.yy 495de925dd add: sync mulan repo 2021-03-19 11:29:31 +08:00
jasder f18c56129e FIX 改版项目详情页面 2021-03-18 18:08:38 +08:00
vilet.yy 6a7ef2a1a7 add: repo contributors 2021-03-18 16:35:46 +08:00
vilet.yy 25186b4e81 fix 2021-03-18 09:55:58 +08:00
vilet.yy a627ab4d82 fix 2021-03-18 09:51:56 +08:00
vilet.yy 187ad1d263 fix 2021-03-17 13:51:08 +08:00
vilet.yy 8f98a83379 add: project unit list 2021-03-17 13:50:26 +08:00
vilet.yy a14459da50 add: project menu list 2021-03-17 11:52:36 +08:00
vilet.yy f17e436d62 add: doc 2021-03-16 11:10:58 +08:00
vilet.yy 34d95451b5 add: get project all files 2021-03-16 10:25:37 +08:00
vilet.yy b43926f69f add: new project detail 2021-03-15 19:01:35 +08:00
jasder bd46d2dcc7 fix 2021-03-11 14:59:21 +08:00
jasder 6063c7c414 fix 更新api文档 2021-03-11 14:58:44 +08:00
jasder af289d1f5e Update changelog 2021-03-05 15:52:50 +08:00
jasder 899e7ccab8 FIX CI 修复参数设置的bug 2021-03-05 15:48:08 +08:00
victor d3df04fb97 参数管理修改 2021-03-05 15:43:42 +08:00
jasder 50928f82c0 FIX valid user before register action 2021-03-05 15:36:26 +08:00
victor 33984e16d0 参数管理修改 2021-03-05 15:26:29 +08:00
jasder 8942c694c4 Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-03-05 11:38:45 +08:00
jasder d3a3c645c8 集成CI/CD参数管理功能 2021-03-05 10:48:38 +08:00
victor 3b5d971964 参数删除接口文档 2021-03-04 17:00:29 +08:00
victor 61e5b9132a 参数删除接口修改 2021-03-04 16:52:00 +08:00
victor d7bc309d49 参数管理删除 2021-03-04 09:33:04 +08:00
victor cb90dc1f51 参数管理 2021-03-03 15:36:59 +08:00
jasder 347af1a8ad Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-03-02 15:21:50 +08:00
jasder 41118f6d12 解决pull创建和更新操作的bug 2021-03-02 10:07:13 +08:00
vilet.yy ccbaa8efe5 [FIX]pull_request create and update error 2021-03-01 16:43:09 +08:00
jasder 11350bb76f Merge branch 'develop' of https://git.trustie.net/jasder/forgeplus into develop 2021-03-01 10:02:35 +08:00
jasder b6b3cb0825 fix bug 2021-02-26 17:51:42 +08:00
jasder fc680b5372 fix notice api 2021-02-26 14:38:32 +08:00
vilet.yy c299c9fa69 [FIX]repository setting entry error 2021-02-26 13:49:29 +08:00
vilet.yy 70922b81db [FIX]watcher type error 2021-02-25 11:52:24 +08:00
vilet.yy 93fa02bd7b [FIX]
[FIX]

[FIX]
2021-02-22 10:53:01 +08:00
vilet.yy ef0c44f29c [ADD]fix error script 2021-02-22 10:10:22 +08:00
vilet.yy 9681a1a491 [FIX]sync mirror project 2021-02-21 17:14:51 +08:00
vilet.yy f7b7122d60 [FIX]join projects add org projects and update project private bug 2021-02-21 15:20:04 +08:00
Gitea 11471b1520 [FIX]transfer need to save clone_url 2021-02-21 10:02:47 +08:00
jasder 50d81b2490 FIX schema 2021-02-09 11:49:47 +08:00
jasder 9f4c2bd673 FIX repo setting api for forbidden 2021-02-09 11:48:05 +08:00
viletyy 2b898b0d1f [FIX]remove description 2021-02-06 16:43:41 +08:00
jasder 8e4d6c7064 合并组织模块功能 2021-02-06 16:21:47 +08:00
viletyy f06a1f63dd [ADD]project transfer
[FIX]

[FIX]
2021-02-06 15:49:59 +08:00
viletyy d85075f951 [FIX]org sync gitea_uid
[FIX]
2021-02-06 15:49:56 +08:00
viletyy ec1acde99a [FIX]show teams, org name valid message 2021-02-06 15:49:56 +08:00
viletyy 55528950f1 [FIX]owner text 2021-02-06 15:49:56 +08:00
viletyy 54204d4db8 [ADD]org team search, project teams add\remove, org can create field
[FIX]
2021-02-06 15:49:55 +08:00
viletyy 4f6f257b37 [FIX]concat change to concat_ws, org render 403, normal team leave 2021-02-06 15:49:54 +08:00
viletyy 629f3fbbe1 [FIX]little vliad about team_user 2021-02-06 15:49:54 +08:00
viletyy ddaca5bafc [ADD]organization add num_teams 2021-02-06 15:49:54 +08:00
viletyy 1e70764d63 [FIX]teams add user info 2021-02-06 15:49:54 +08:00
viletyy 152e301bf3 [ADD]search is_member is_admin 2021-02-06 15:49:54 +08:00
viletyy c6269f44ee [FIX]add user organization count 2021-02-06 15:49:54 +08:00
viletyy 3d495797c0 [FIX]organization add created_at and total_count 2021-02-06 15:49:54 +08:00
viletyy ce4c71c6a0 [FIX]组织可以不上传头像 2021-02-06 15:49:54 +08:00
viletyy dab57e9af3 [FIX]一些筛选以及创建最大项目数量验证 2021-02-06 15:49:53 +08:00
viletyy fef43caf4c [ADD]组织项目相关 2021-02-06 15:49:53 +08:00
viletyy 289d1877d6 [ADD]组织、组织团队 2021-02-06 15:49:53 +08:00
viletyy 0c58447afb [FIX]组织上传头像支持多种格式、项目详情返回拥有者类型
[FIX]

[FIX]
2021-02-06 15:49:52 +08:00
viletyy 3f73484596 [FIX]一些筛选以及创建最大项目数量验证
[FIX]
2021-02-06 15:49:49 +08:00
viletyy f094fe1799 [ADD]组织项目相关 2021-02-06 14:27:47 +08:00
viletyy 1dc43a23b7 [FIX]为组织创建项目做准备 2021-02-06 14:27:47 +08:00
viletyy 31858a79e3 [FIX]成员细节修改 2021-02-06 14:27:47 +08:00
viletyy 7f309edc91 [ADD]组织、组织团队 2021-02-06 14:27:47 +08:00
viletyy c278ed1863 [FIX] 2021-02-06 14:27:47 +08:00
viletyy 2434ca9681 [ADD]组织模块相关代码 2021-02-06 14:27:47 +08:00
jasder 178991b245 平台数据统计功能
1. 新增平台数据统计相关API
2.新增平台数据统计邮件消息系统
2021-02-06 11:27:28 +08:00
viletyy c00336e7b5 [ADD]统计平台概况
[FIX]更改请求参数

[FIX]

[ADD]rank statistic

[FIX]
2021-02-06 11:15:25 +08:00
Jasder 713b249fa5 ADD requierd nodejs version for deploy document 2021-02-03 11:50:31 +08:00
Jasder 5875c625ab FIX set login column value ro ci_templates table 2021-02-02 18:08:27 +08:00
Jasder be57c75166 ADD schema for pipeline model 2021-02-02 16:42:48 +08:00
Jasder 440cedc109 Merge branch 'develop' of http://git.trustie.net/jasder/forgeplus into develop 2021-02-02 16:40:33 +08:00
jasder bbcb515e24 模板管理功能
新增功能:
1. 支持多条流水线
2. 完善CI/CD模板管理功能
2021-02-02 16:39:31 +08:00
victor b18fbd698f Merge branch 'develop' into trustie-pipeline
# Conflicts:
#	app/models/ci/pipeline.rb
2021-02-02 14:41:23 +08:00
Jasder 6053907828 fix change stoage file derictory 2021-02-02 14:32:16 +08:00
Jasder 9f7c9d6ec7 FIX CORS problem for develop 2021-02-02 14:32:13 +08:00
Jasder 9121033a10 ADD upload avatar api with support multiple image formats 2021-02-02 14:32:08 +08:00
victor 8d3838614f FIX pipeline model schma
# Conflicts:
#	app/models/ci/pipeline.rb
2021-02-02 14:32:02 +08:00
Jasder 165f8108f7 ADD api document on line 2021-02-02 14:07:46 +08:00
victor 4816ee04d3 流水线列表查询 2021-02-02 13:10:53 +08:00
victor d2209619f0 流水线增加owner选项 2021-02-02 11:48:09 +08:00
victor 155fc35cfa 获取代码库文件sha 2021-02-01 16:19:42 +08:00
victor ce31875c19 根据阶段查询模板接口 2021-02-01 15:17:03 +08:00
victor d214b1ddae 流水线初始化模板名称修改 2021-02-01 13:40:15 +08:00
victor 22d7478349 content接口返回分支 2021-02-01 10:36:30 +08:00
Jasder 458fca9992 fix change stoage file derictory 2021-01-28 15:11:47 +08:00
victor c3f69a48d6 流水线sha查询 2021-01-28 15:04:51 +08:00
victor c3136fc1a8 流水线查询接口修改 2021-01-28 14:14:22 +08:00
Jasder a93baa908f FIX CORS problem for develop 2021-01-27 17:22:16 +08:00
victor 2c648b7941 流水线创建修改 2021-01-27 16:27:56 +08:00
victor e1ddad5040 新增流水线接口修改 2021-01-27 10:22:53 +08:00
victor 24d5f16302 接口文档修改 2021-01-27 09:35:41 +08:00
victor 6c77b73ec6 创建多条流水线、模板管理 2021-01-26 17:15:53 +08:00
Jasder 3b7d425198 ADD upload avatar api with support multiple image formats 2021-01-26 14:49:02 +08:00
moshenglv 131ccc36c7 Merge branch 'master' into trustie-pipeline 2021-01-21 16:15:18 +08:00
Jasder dcda8671b3 FIX pipeline model schma 2021-01-20 17:00:19 +08:00
jasder 122667c67c Merge pull request '【devops】可视化创建流水线' (#13) from trustie-pipeline into develop
Reviewed-on: https://git.trustie.net/jasder/forgeplus/pulls/13
2021-01-20 16:01:21 +08:00
Jasder 6d51657ecf FIX get latest commit bug
(cherry picked from commit b7e23a62d0)
2021-01-20 14:30:49 +08:00
Jasder 67a7df085c ADD sync repo time print log
(cherry picked from commit f3d4f437cb)
2021-01-20 14:30:44 +08:00
Jasder 0adcbaa19f ADD repository languages percentage api
(cherry picked from commit efa99e0f06)
2021-01-20 14:30:41 +08:00
Jasder 1c59832abf FIX get assignees bug in issues
(cherry picked from commit e9223c53de)
2021-01-20 14:30:39 +08:00
Jasder 814a1d9e6a FIX deal with gitea api response body bug
(cherry picked from commit e7662b66ce)
2021-01-20 14:30:36 +08:00
Jasder 18c989bb6f Update api document
(cherry picked from commit 0f338ede7d)
2021-01-20 14:30:32 +08:00
Jasder ffeb076086 FIX pull api bug
(cherry picked from commit 36a3e36edb)
2021-01-20 14:30:29 +08:00
Jasder 06a7cb7558 FIX get readme file bug
(cherry picked from commit 30138cc1fa)
2021-01-20 14:30:26 +08:00
Jasder 6fa4ee6c14 ADD get readme api
(cherry picked from commit 232f26ea3b)
2021-01-20 14:30:24 +08:00
Jasder 4b34822fe2 FIX sidekiq cron config yml bug
(cherry picked from commit 2253dce4d7)
2021-01-20 14:30:21 +08:00
Jasder 536e78ffd6 FIX code bug
(cherry picked from commit 0e8d475de7)
2021-01-20 14:30:19 +08:00
Jasder e796776f1e FIX updage sidekiq cron
(cherry picked from commit 1e9bd451e5)
2021-01-20 14:30:16 +08:00
Jasder 10883bf05a FIX update cron
(cherry picked from commit f959b38a89)
2021-01-20 14:30:13 +08:00
Jasder 5667c0854c FIX [api] get pull bug
(cherry picked from commit fa01194d3c)
2021-01-20 14:30:10 +08:00
Jasder b6aa0fd76c FIX render json builder partil performance for pull some api
(cherry picked from commit f084b72e3a)
2021-01-20 14:30:06 +08:00
Jasder f212c5213d FIX base and head params problem for compare api
(cherry picked from commit 4c2c3d17e2)
2021-01-20 14:30:01 +08:00
Jasder d2e2793d29 FIX pull request bug
(cherry picked from commit 2b140d6f7c)
2021-01-20 14:29:52 +08:00
Jasder 20b06473be ADD gem 'sidekiq-cron'
(cherry picked from commit 8f24f65820)
2021-01-20 14:29:48 +08:00
Jasder 8c8d9f64c4 ADD sync repo updated at time
(cherry picked from commit 8c6df359a5)
2021-01-20 14:28:56 +08:00
Jasder b7e23a62d0 FIX get latest commit bug 2021-01-20 14:25:07 +08:00
moshenglv f4dc82f7d5 初始化模板脚本 2021-01-20 14:21:16 +08:00
moshenglv f2efed0f1f 初始化数据脚本 2021-01-20 14:03:08 +08:00
moshenglv ab4af170fb 连接ci数据库名修改,根据repo 2021-01-20 13:52:30 +08:00
moshenglv ab3242569d 流水线查询 2021-01-20 11:54:10 +08:00
Jasder f3d4f437cb ADD sync repo time print log 2021-01-20 09:38:11 +08:00
moshenglv 69c6e2ac3f cotent接口修改 2021-01-19 18:39:57 +08:00
moshenglv efdbc6fd4e 创建流水线文件新增接口返回内容修改 2021-01-19 18:23:28 +08:00
moshenglv 3946c7116b 创建pipeline文件接口 2021-01-19 18:11:00 +08:00
moshenglv 0d6ddad013 查询steps接口修改 2021-01-19 16:23:19 +08:00
Jasder efa99e0f06 ADD repository languages percentage api 2021-01-19 16:21:31 +08:00
moshenglv 7e9acd1850 返回流水线文件sha 2021-01-19 14:19:06 +08:00
moshenglv 1001d10017 流水线字段校验 2021-01-19 14:00:22 +08:00
moshenglv 703be3f9a1 返回流水线内容同步状态 2021-01-19 13:59:55 +08:00
moshenglv f90bc0897b 流水线关联项目 2021-01-19 11:52:29 +08:00
moshenglv 05416339e5 流水线查询返回字段修改 2021-01-19 11:10:47 +08:00
moshenglv 5e0cdba1f9 流水线与项目关联 2021-01-19 11:03:27 +08:00
Jasder 5fd5bf32d8 Merge branch 'develop' 2021-01-18 15:28:38 +08:00
Jasder e9223c53de FIX get assignees bug in issues 2021-01-18 15:28:20 +08:00
Jasder e7662b66ce FIX deal with gitea api response body bug 2021-01-18 11:22:31 +08:00
moshenglv c6aeecb33c 查询阶段返回流水线名称 2021-01-18 09:58:33 +08:00
Jasder 0f338ede7d Update api document 2021-01-18 09:51:07 +08:00
moshenglv 2d99713cd0 流水线增加用户字段 2021-01-18 09:32:23 +08:00
Jasder 36a3e36edb FIX pull api bug 2021-01-15 18:38:53 +08:00
Jasder 30138cc1fa FIX get readme file bug 2021-01-15 18:36:19 +08:00
Jasder 232f26ea3b ADD get readme api 2021-01-15 15:38:49 +08:00
moshenglv 9af0ff4a71 步骤查询接口返回模板信息修改 2021-01-15 11:05:38 +08:00
Jasder 2253dce4d7 FIX sidekiq cron config yml bug 2021-01-14 18:39:12 +08:00
Jasder 0e8d475de7 FIX code bug 2021-01-14 18:25:49 +08:00
Jasder 1e9bd451e5 FIX updage sidekiq cron 2021-01-14 18:22:01 +08:00
Jasder f959b38a89 FIX update cron 2021-01-14 17:04:58 +08:00
moshenglv ac6858a205 阶段步骤修改接口 2021-01-14 15:36:22 +08:00
moshenglv a71f0b0550 阶段步骤新增接口 2021-01-14 15:34:35 +08:00
moshenglv 4ac7634031 流水线步骤新增、更新 2021-01-14 15:32:49 +08:00
moshenglv da1a992670 流水线查询返回时间格式化 2021-01-13 15:10:24 +08:00
moshenglv cb6c4b1e3f 阶段新增、删除、查询步骤接口修改 2021-01-12 17:40:42 +08:00
Jasder fa01194d3c FIX [api] get pull bug 2021-01-12 17:34:07 +08:00
Jasder f084b72e3a FIX render json builder partil performance for pull some api 2021-01-12 15:55:11 +08:00
Jasder 4c2c3d17e2 FIX base and head params problem for compare api 2021-01-12 15:47:04 +08:00
Jasder 2b140d6f7c FIX pull request bug 2021-01-12 15:45:18 +08:00
moshenglv bcb4e78829 修改模板查询相关接口 2021-01-12 13:54:11 +08:00
moshenglv 77529319a1 可视化创建流水线后端代码 2021-01-12 10:23:26 +08:00
Jasder 8c6df359a5 ADD sync repo updated at time 2021-01-08 18:07:48 +08:00
Jasder 8f24f65820 ADD gem 'sidekiq-cron' 2021-01-08 18:03:51 +08:00
jasder 2f140d13f0 Merge pull request '用户可以查看其他用户的构建列表' (#10) from trustie_server into develop
Reviewed-on: https://git.trustie.net/jasder/forgeplus/pulls/10
2021-01-06 18:50:31 +08:00
moshenglv 9a66b48726 用户可以查看其他用户的构建列表 2021-01-06 18:47:39 +08:00
jasder 5cdfc4ba62 Merge pull request '解绑流程修改' (#9) from trustie_server into develop
Reviewed-on: https://git.trustie.net/jasder/forgeplus/pulls/9
2021-01-06 16:53:22 +08:00
moshenglv 06b8aab455 解绑时先判断是否是trustie提供服务器的场景 2021-01-06 16:45:18 +08:00
jasder 2abf1f0665 Merge pull request '【devops】trustie提供服务器后台代码' (#8) from trustie_server into develop
Reviewed-on: https://git.trustie.net/jasder/forgeplus/pulls/8
2021-01-06 15:38:29 +08:00
moshenglv cbe5b3afde 解绑时取消激活该用户的所有项目 2021-01-06 14:45:34 +08:00
Jasder 8f846ae29b FIX gitea user register service 2021-01-06 14:00:15 +08:00
moshenglv f7a5157788 使用trustie提供的服务器,需要多增加一条授权信息 2021-01-06 12:59:34 +08:00
moshenglv 910425ddb3 修改授权接口,当选择trustie服务器时,clientId使用创建drone的clientId 2021-01-05 16:40:09 +08:00
moshenglv e412b97003 修改授权接口 2021-01-05 15:04:01 +08:00
moshenglv 387a565fe3 自有服务器进行判断是否已经绑定云账号 2021-01-04 16:18:49 +08:00
moshenglv bab9174966 选trustie服务器解绑时删除drone用户 2021-01-04 14:57:28 +08:00
moshenglv 4aae60f3d8 打印调用drone创建用户接口日志 2021-01-04 09:49:42 +08:00
moshenglv 1108b298f0 绑定调用gitea接口,,错误,抛出异常 2021-01-04 09:41:04 +08:00
moshenglv 47093ffcb9 调用drone创建用户接口 2020-12-31 19:39:20 +08:00
moshenglv 3d332c75d6 连接ci数据库方法 2020-12-31 17:13:41 +08:00
moshenglv a84af1d743 根据用户选择的服务器类型创建不同的CI数据库连接 2020-12-31 17:07:10 +08:00
moshenglv 2b86c7eb95 修改turstie提供服务器,认证时调用drone url 2020-12-31 16:47:16 +08:00
Jasder 0476246585 Merge branch 'develop' 2020-12-30 15:05:24 +08:00
Jasder d62df0f087 ADD MuLan licenses 2020-12-30 15:05:07 +08:00
Jasder a80037ae8a FIX init db structrue and add records of roles 2020-12-30 15:00:15 +08:00
Jasder ad129db4e6 Merge branch 'develop' 2020-12-30 14:02:32 +08:00
Jasder fa98636eb9 FIX migrate bug 2020-12-30 14:02:21 +08:00
Jasder e127d12390 Merge branch 'develop' 2020-12-30 13:47:26 +08:00
Jasder 56965910a5 ADD column to cloud table 2020-12-30 13:47:00 +08:00
jasder 584ed2e852 NICE 2020-12-30 09:37:02 +08:00
Jasder 6b244b7b80 Merge branch 'develop' 2020-12-29 18:18:44 +08:00
Jasder 50021a278b FIX generate token bug for regitster api 2020-12-29 18:18:17 +08:00
Jasder 1420a47a5c FIX bug 2020-12-28 13:44:03 +08:00
Jasder 72d8af8d7b FIX update deploy file 2020-12-28 13:42:59 +08:00
moshenglv b5ab230a5c 删除调用drone创建用户接口 2020-12-24 10:40:42 +08:00
moshenglv 2666a95176 Merge branch 'master' of https://git.trustie.net/moshenglv/forgeplus into master 2020-12-24 10:38:16 +08:00
moshenglv a3724e80b9 增加trustie提供服务器流程。
1、增加接口trustie_bind
2、根据server_type字段判断使用哪个数据库连接
2020-12-24 10:35:38 +08:00
jasder e370c4df1b Update deploy file 2020-12-24 10:07:36 +08:00
jasder 9e5cf6c2f6 Update README.md 2020-12-24 10:00:39 +08:00
Jasder 32a52a5c7a Update model schemas 2020-12-23 15:48:07 +08:00
Jasder 01f79c81cc FIX code review for create pull request 2020-12-23 15:47:08 +08:00
Jasder ffb71512fc FIX code review for create pull request 2020-12-23 15:46:06 +08:00
moshenglv d70168d255 增加trustie提供服务器流程。
1、增加接口trustie_bind
2、根据server_type字段判断使用哪个数据库连接
2020-12-18 13:14:30 +08:00
Jasder 6cbaf410b2 FIX Grammatical errors 2020-12-10 18:05:33 +08:00
Jasder 5a25ffe101 FIX get repository protected branches bug 2020-12-08 16:48:28 +08:00
Jasder 61c8e41136 FIX log writing failed. xE6 from ASCII-8BIT to UTF-8 2020-12-07 16:04:13 +08:00
Jasder 087ad08303 Merge branch 'develop' 2020-12-07 10:29:37 +08:00
Jasder a4a315ea32 FIX bug 2020-12-07 10:29:18 +08:00
Jasder 0c98d13dbe Merge branch 'develop' 2020-12-07 10:12:49 +08:00
Jasder 07caa77f97 FIX code review 2020-12-07 10:06:08 +08:00
Jasder a357ea3ecd Merge branch 'develop' 2020-12-06 21:48:47 +08:00
Jasder 4c980b5774 FIX create protected branch params 2020-12-04 18:15:48 +08:00
Jasder 539b4a10a0 Upate README.md 2020-12-04 18:15:19 +08:00
Jasder aaf3661fd6 FIX Forces conversion str to boolean 2020-12-04 17:13:58 +08:00
Jasder 7c0c90b9bf Update api document 2020-12-04 16:31:52 +08:00
Jasder 3f60dd3f83 ADD edit protected branch api 2020-12-04 16:18:27 +08:00
Jasder b3649f03e7 ADD get protected branch api 2020-12-04 11:06:12 +08:00
Jasder 23a28cd1a9 FIX delete route regx 2020-12-03 16:06:15 +08:00
Jasder 6a8ae5234b ADD protected branch Features 2020-12-03 15:24:40 +08:00
jasder e8b5811151 test 2020-11-30 18:37:52 +08:00
jasder 6743f9c74c test 2020-11-30 18:27:21 +08:00
jasder c27ff02168 更新 'README.md' 2020-11-30 17:59:36 +08:00
jasder 1f804ceee7 更新 'README.md' 2020-11-30 17:46:06 +08:00
jasder bb93fde1f7 更新 'README.md' 2020-11-30 17:29:13 +08:00
jasder 6bc9ca50ee 更新 '.trustie-pipeline.yml' 2020-11-30 17:23:19 +08:00
jasder d6f57786ba 更新 '.trustie-pipeline.yml' 2020-11-30 17:20:03 +08:00
jasder 38873b25f7 Update '.trustie-pipeline.yml' 2020-11-30 17:19:21 +08:00
jasder ec3c64dc04 Update '.trustie-pipeline.yml' 2020-11-30 17:17:12 +08:00
jasder 0e8467987f Update '.trustie-pipeline.yml' 2020-11-30 17:12:17 +08:00
jasder 4305842a7d Update '.trustie-pipeline.yml' 2020-11-30 16:59:22 +08:00
jasder e40eeaef35 test the ci 2020-11-30 16:50:46 +08:00
jasder c4651fd578 Update '.trustie-pipeline.yml' 2020-11-30 13:47:27 +08:00
Jasder a24f0f8b45 FIX . 2020-11-30 11:50:41 +08:00
jasder e6e616a037 FIX update bunlder version 2020-11-30 11:47:48 +08:00
Jasder 5ab6d0db04 Merge branch 'master' of http://git.trustie.net/jasder/forgeplus 2020-11-30 11:39:35 +08:00
Jasder 8ee5bdbb5b Update deploy file 2020-11-30 11:39:28 +08:00
jasder 40cb8d7e68 Update ruby 2020-11-30 11:21:21 +08:00
Jasder 0089c1b8ba Update ruby version to 2.4.5
* delete ruby 2.3.7 version in Gemfile
* delete .ruby-version for local file with development
2020-11-30 10:27:49 +08:00
Jasder 44572d9b5c Merge branch 'master' of http://git.trustie.net/jasder/forgeplus 2020-11-27 18:09:34 +08:00
Jasder a74dd6605b FIX connection ci db when find repo 2020-11-27 18:09:12 +08:00
jasder c634f7dfeb Update '.trustie-pipeline.yml' 2020-11-27 17:56:33 +08:00
jasder 5cfff14cf1 Update '.trustie-pipeline.yml' 2020-11-27 17:34:52 +08:00
Jasder d3a088e5b6 Update ci yml 2020-11-27 16:50:00 +08:00
Jasder eb730e5d91 Merge branch 'master' of http://git.trustie.net/jasder/forgeplus 2020-11-27 16:46:41 +08:00
Jasder 60b74664e9 Merge branch 'develop' 2020-11-27 16:46:26 +08:00
Jasder a0cd50ffe6 Delete create pr when create or update repo file 2020-11-27 16:46:12 +08:00
jasder c865c948e7 Update '.trustie-pipeline.yml' 2020-11-27 15:46:51 +08:00
jasder 1f35d8ba53 Update '.trustie-pipeline.yml' 2020-11-27 15:22:11 +08:00
jasder dfeb053b30 Update '.trustie-pipeline.yml' 2020-11-27 14:58:45 +08:00
jasder dc8e44b553 Update '.trustie-pipeline.yml' 2020-11-27 13:48:17 +08:00
jasder c2f71c35c2 Update '.trustie-pipeline.yml' 2020-11-27 13:45:57 +08:00
jasder 7805e8d471 Update '.trustie-pipeline.yml' 2020-11-27 11:51:02 +08:00
jasder 2cf1b2b744 Update '.trustie-pipeline.yml' 2020-11-27 11:47:33 +08:00
jasder fbd189d610 Update '.trustie-pipeline.yml' 2020-11-27 11:02:58 +08:00
Jasder 8facfc96e4 FIX merge develop branch 2020-11-27 11:00:37 +08:00
Jasder ba14fce0bd ADD string to strip when crate ci cloud account 2020-11-27 10:19:11 +08:00
Jasder 1daf8591ca FIX Adjust call gitea api for security 2020-11-27 10:18:31 +08:00
Jasder a8cbe566cb FIX delete Chain job when create repo 2020-11-27 09:39:46 +08:00
Jasder 21169b4523 ADD api document 2020-11-26 15:16:23 +08:00
Jasder 0f81caefdf FIX register api for platform default forge 2020-11-26 15:15:51 +08:00
Jasder 9a27b26cef FIX local bug 2020-11-26 15:15:15 +08:00
Jasder 58a80af929 FIX bug 2020-11-24 17:56:30 +08:00
Jasder 17e182788f FIX bug 2020-11-24 17:55:12 +08:00
Jasder 225bb9f7b7 Update table structure's rake task 2020-11-24 17:00:42 +08:00
Jasder d7e0431606 Upate database.yml.example 2020-11-24 16:58:39 +08:00
Jasder 146c21648b FIX . 2020-11-24 11:33:23 +08:00
Jasder 75202b1fc3 FIX code bug 2020-11-24 11:32:03 +08:00
Jasder 5d5f0f42c0 FIX local register bug 2020-11-24 11:30:01 +08:00
Jasder 8f9e12a5e0 Update local register method 2020-11-24 11:22:32 +08:00
Jasder 69f2fd2fbb FIX code review 2020-11-23 15:52:00 +08:00
Jasder 60ac66ebe3 ADD db schema in models 2020-11-23 15:35:03 +08:00
Jasder ba1115f1f3 ADD annotate for models and migration with auto generate 2020-11-23 10:53:59 +08:00
Jasder 558abb71bb Update repository with default branch params 2020-11-19 10:30:18 +08:00
Jasder a54613752e FIX code bug when user register 2020-11-18 10:35:56 +08:00
Jasder f1e3e935af FIX check email exists for register 2020-11-18 10:25:44 +08:00
Jasder 66407eefe1 FIX only email register 2020-11-18 10:17:40 +08:00
Jasder fa6b25a22d FIX render commit bug for sub entries api 2020-11-16 16:03:41 +08:00
Jasder 7449351270 FIX sub entries api return hash object when entries is file 2020-11-16 15:34:16 +08:00
Jasder 0ca699cc49 FIX find educoder project's bug 2020-11-11 10:14:41 +08:00
Jasder b5d3f32d68 FIX code review 2020-11-10 18:18:08 +08:00
Jasder cc19783651 FIX code bug 2020-11-10 18:17:46 +08:00
jasder 3e25089066 Delete 'test_pr.rb' 2020-11-10 16:23:30 +08:00
jasder 1fa878f119 add 2020-11-10 15:40:56 +08:00
jasder 793c616a3b Update '.trustie-pipeline.yml' 2020-11-10 15:40:31 +08:00
jasder 228585c8f0 add 2020-11-10 15:20:36 +08:00
jasder 36e6f7cea0 Add '.trustie-pipeline.yml' 2020-11-10 15:19:42 +08:00
Jasder 1c386e0ab3 FIX coder review 2020-11-10 10:03:30 +08:00
Jasder 939f33a8a2 FIX sha value bug 2020-11-09 17:23:19 +08:00
Jasder 97973b95bf ADD sha column ro pull request's files compare api 2020-11-06 22:03:12 +08:00
Jasder 6b505a34cb Update README.md 2020-11-06 17:29:44 +08:00
Jasder a8c3328bd6 ADD get a commit api 2020-11-06 17:23:14 +08:00
Jasder 181bb05d4a FIX check pr can merge 2020-11-06 15:21:27 +08:00
Jasder 9438bf5cd1 FIX routes bug 2020-11-06 11:01:29 +08:00
Jasder c85ad6444d FIX code bug 2020-11-04 15:03:21 +08:00
Jasder 0fe0f8a38b ADD some fileds for pull api 2020-11-04 14:08:34 +08:00
Jasder 5d84df064a ADD some columns for pull 2020-11-04 14:07:53 +08:00
Jasder 58d8c911a8 ADD format time method 2020-11-04 11:21:51 +08:00
Jasder cfb794c94f FIX bug 2020-11-04 10:09:49 +08:00
Jasder 2347697e93 ADD some api
* api/v1/repos/{owner}/{repo}/pulls/{number}/commits
* api/v1/repos/{owner}/{repo}/pulls/{number}/files
* api/v1/repos/{owner}/{repo}/compare/{base}...{head}
2020-11-03 18:37:47 +08:00
Jasder 70f7b59349 Update search projects api 2020-10-30 17:20:06 +08:00
Jasder 1bc935ffd5 FIX code review and user cache 2020-10-30 15:47:09 +08:00
Jasder ece6cba4a4 FIX skip some action 2020-10-28 17:39:00 +08:00
Jasder b784bb97fd FIX delet some index with projects table 2020-10-23 12:25:08 +08:00
Jasder abcff440e7 ADD index for project_educodes table 2020-10-23 00:50:02 +08:00
Jasder af6c8efb2b FIX 更改 educoder用户头像链接 2020-10-23 00:16:41 +08:00
Jasder bf056a1531 FIX projects page count 2020-10-23 00:07:26 +08:00
Jasder 3f29c09b1b FIX project category order positoin 2020-10-22 22:45:05 +08:00
Jasder bfbe1fdce5 FIX bug 2020-10-22 22:16:55 +08:00
Jasder 91c9423c72 add platform column for projects api 2020-10-22 20:12:28 +08:00
Jasder 58f8d60646 FIX 版本库兼容euducoder平台数据 2020-10-22 18:00:31 +08:00
Jasder 1feb238e80 ADD educode repo api 2020-10-22 17:59:07 +08:00
Jasder 0192fa9f85 FIX bug 2020-10-21 18:14:06 +08:00
Jasder 84854e5c0c FIX code bug 2020-10-21 18:12:58 +08:00
Jasder 0c92b571c5 FIX perfect devops languages formate 2020-10-21 18:07:18 +08:00
Jasder f6937d96f4 ADD some index 2020-10-21 16:46:23 +08:00
Jasder 6cedf3b530 ADD some index to projects table 2020-10-21 15:13:30 +08:00
Jasder e0826da950 ADD index for updated_on column with projects table 2020-10-21 12:13:53 +08:00
Jasder 9477555ebd FIX merge dev_devops branch 2020-10-21 11:56:30 +08:00
Jasder a713e61437 FIX query branches bug 2020-10-21 11:55:03 +08:00
Jasder 99f67cf3a7 FIX merge 2020-10-21 11:54:22 +08:00
Jasder 495dc0d2e1 FIX query project 2020-10-21 11:53:52 +08:00
Jasder e3d9dae8fd Update projects sime api with statics 2020-10-21 11:45:55 +08:00
Jasder ca3b5f4284 ADD index for project_type column in projects table 2020-10-21 11:43:11 +08:00
Jasder f5eecdffdc ADD some columns for project_educoders table 2020-10-20 17:43:03 +08:00
Jasder 2eca095608 Merge branch 'dev_devops' into dev_sync_project_educoder 2020-10-20 16:45:04 +08:00
Jasder cb7d49506c FIX change description 'longtext' type with projects table 2020-10-20 15:19:26 +08:00
Jasder 831aea8b73 FIX bug 2020-10-20 00:10:29 +08:00
Jasder 46ccbbe699 ADD console info 2020-10-20 00:05:43 +08:00
Jasder 2f7b6c9b75 FIX bug 2020-10-19 23:41:05 +08:00
Jasder a63d675a92 FIX 同步educoder平台实训项目放入job中执行 2020-10-19 23:39:44 +08:00
Jasder 7f685e4119 FIX 完善同步educoder平台实训 2020-10-19 23:08:17 +08:00
Jasder 2eef143251 ADD 同步educoder平台实训项目 2020-10-19 22:59:41 +08:00
Jasder 1ac606a8aa FIX 去掉区块链相关的token值 2020-10-19 15:20:30 +08:00
Jasder 913f4b26a4 FIX 解决issue不能更改为 ‘关闭’状态的bug 2020-10-19 11:05:30 +08:00
Jasder 47f8197841 FIX ci connect database before fiter 2020-10-19 09:27:59 +08:00
Jasder 9332750aa7 FIX 2020-10-16 19:09:43 +08:00
Jasder 77de74fd4b FIX unbind account bug 2020-10-16 19:08:39 +08:00
Jasder 232bb054ce Merge branch 'dev_trustie' into dev_devops 2020-10-16 16:48:26 +08:00
sylor_huang@126.com 32bc3fe9f5 FIX merge 2020-10-16 16:48:11 +08:00
Jasder 1bff81bb66 Merge branch 'dev_trustie' into dev_devops 2020-10-16 16:44:44 +08:00
sylor_huang@126.com 248eadb918 Add Setting button 2020-10-16 16:43:59 +08:00
Jasder 7372911fea FIX 重构项目管理权限 2020-10-16 16:02:26 +08:00
Jasder 5156450eac ADD 更改工作流的权限 2020-10-16 11:57:20 +08:00
Jasder 6df01dead1 FIX unbind devops bug 2020-10-16 11:07:28 +08:00
Jasder 9a9540ad50 Fix forge connection ci databases bug 2020-10-16 09:50:30 +08:00
Jasder edcb9f863c FIX ci certification bug 2020-10-16 09:47:36 +08:00
Jasder e430645304 FIX ci connection database bug 2020-10-16 09:42:08 +08:00
Jasder a0c80d8d25 FIX code bug 2020-10-15 19:49:43 +08:00
Jasder d8910e3dbf FIX unbind ci cloud account bug 2020-10-15 19:46:56 +08:00
Jasder 7b0f219a82 FIX pwd bug 2020-10-15 19:40:50 +08:00
Jasder cfd285cbcd FIX delete drone database with undind cloud account 2020-10-15 17:40:39 +08:00
Jasder e0db7067ca FIX piple value 2020-10-15 17:20:09 +08:00
Jasder 6456a0f90c FIX code bug 2020-10-15 17:04:42 +08:00
Jasder 0c2c917c7f FIX 纠正drone授权流程 2020-10-15 17:00:02 +08:00
Jasder 38ca183bcd FIX code review 2020-10-15 16:04:32 +08:00
Jasder 8628891582 FIX gitea oauth grant url bug 2020-10-15 15:17:52 +08:00
Jasder 4ea033df23 FIX unbind ci user bug 2020-10-15 15:02:48 +08:00
Jasder 64a3ab24e2 FIX devops pwd auth bug 2020-10-15 14:37:24 +08:00
whystar 516b254aa3 smaller size of fig issue_assign 2020-10-14 10:35:33 +08:00
Jasder 28d6aa2dda ADD drone user oauth 2020-10-13 19:49:52 +08:00
whystar 774bcdd8b1 use high-quality figs in readme 2020-10-13 16:42:20 +08:00
whystar a9358552c0 upate readme 2020-10-13 16:29:49 +08:00
Jasder 9af3b5b757 Merge branch 'dev_trustie' into dev_devops 2020-10-09 11:40:34 +08:00
Jasder fbae5a36d0 Merge branch 'dev_trustie' into dev_devops 2020-10-05 17:41:54 +08:00
Jasder c7f141c468 Merge branch 'dev_trustie' into dev_devops 2020-10-05 17:30:21 +08:00
Jasder b8cace558b Merge branch 'dev_trustie' into dev_devops 2020-10-04 17:33:21 +08:00
Jasder 705ae1020b FIX merge dev_trustie branch 2020-10-04 12:05:53 +08:00
Jasder e2daffc826 Merge branch 'dev_trustie' into dev_devops 2020-09-29 13:51:32 +08:00
Jasder 2636923c9b FIX merge 2020-09-29 11:53:41 +08:00
Jasder 74a19bd2ce FIX code bug 2020-09-28 11:30:49 +08:00
Jasder fc6a05fe12 FIX code bug 2020-09-28 11:26:37 +08:00
Jasder 7f9674baf3 FIX bug 2020-09-27 16:35:38 +08:00
Jasder d9ed3baa02 Update readme.md 2020-09-27 15:37:02 +08:00
Jasder 3621f4ff48 ADD gitea databse config 2020-09-27 15:30:44 +08:00
Jasder a308862567 FIX 优化ci流程,并配置gitea相关database 2020-09-27 11:30:37 +08:00
Jasder 6cbb22acaf ADD open_devops_count column fro projects tables 2020-09-27 10:56:08 +08:00
Jasder f116e3347d FIX build detail render user bug 2020-09-24 11:14:16 +08:00
Jasder 7435d96eed ADD check cloud account 2020-09-23 16:22:18 +08:00
Jasder 27da6d9904 FIX ci create cloud account bug 2020-09-23 15:38:47 +08:00
Jasder 53224881ba ADD devops中限制每台服务器只能绑定一个用户 2020-09-23 11:40:13 +08:00
Jasder aa89103669 FIX connection ci database add condition 2020-09-23 11:15:14 +08:00
Jasder 135bdfd69f FIX code bug 2020-09-23 11:12:15 +08:00
Jasder 0f22110870 FIX ci author 2020-09-23 11:10:30 +08:00
Jasder 76b9031fc8 FIX bug 2020-09-23 11:06:54 +08:00
Jasder a97bbb6ddb Update ci db schema 2020-09-23 09:17:30 +08:00
Jasder a4c5db95bb FIX get user info api's bug 2020-09-22 18:12:13 +08:00
Jasder 1b1801319a FIX code bug 2020-09-22 17:40:21 +08:00
Jasder 4b3359108f FIX ci drone server cmd bug 2020-09-22 17:40:01 +08:00
Jasder 7e851fe5af FIX delete nil or empty string from sqls arrary 2020-09-22 16:22:55 +08:00
Jasder 9ebc0aa1dc ADD rails log 2020-09-22 16:15:30 +08:00
Jasder 88b2dd1208 FIX perfect ci init datbase 2020-09-22 15:50:16 +08:00
Jasder 7750ed18d7 FIX ci db init 2020-09-22 11:59:33 +08:00
Jasder a904adaaa0 FIX test ci init tables structure 2020-09-22 10:43:34 +08:00
Jasder 8f279753cc FIX code bug 2020-09-18 16:50:35 +08:00
Jasder 7789c30e5b FIX ci db bug 2020-09-18 16:44:38 +08:00
Jasder 467f278de5 ADD ci datbase config 2020-09-18 16:40:54 +08:00
Jasder 0467119605 FIX ci db bug 2020-09-18 15:46:36 +08:00
Jasder b74d43083e FIX 解决ci 数据库安全性问题 2020-09-18 15:26:14 +08:00
Jasder 12bef27260 Merge branch 'dev_trustie' into dev_devops 2020-09-11 23:24:50 +08:00
Jasder 1e823aef97 FIX ci log data with null bug 2020-09-11 17:08:40 +08:00
Jasder 5b8b74b808 ADD ci authorue column for get user info api 2020-09-11 16:35:08 +08:00
Jasder fae4907fd1 FIX set ci repo default value 2020-09-11 16:34:19 +08:00
Jasder 868ffbabac FIX ci query log with 404 bug 2020-09-11 15:05:03 +08:00
Jasder f9ec41f9bc FIX ci repo asstassion 2020-09-11 10:41:27 +08:00
Jasder 2e0d76575c FIX repo instance method's bug 2020-09-11 10:13:54 +08:00
Jasder 9568523286 FIX user bug 2020-09-11 10:00:29 +08:00
Jasder f3d6244fee FIX ci certification bug 2020-09-11 09:55:21 +08:00
Jasder ad43c6975b ADD 解决ci端用户授权后,项目同步失败的问题 2020-09-10 18:00:37 +08:00
Jasder 6419453fca FIX ci code review 2020-09-10 16:01:24 +08:00
Jasder 9b1f95bf08 ADD builds authorization 2020-09-10 11:52:54 +08:00
Jasder 217dfc03b2 ADD ci namespace modle associations 2020-09-10 10:53:12 +08:00
Jasder d802b8aba4 Merge branch 'dev_trustie' into dev_devops 2020-09-09 10:35:11 +08:00
Jasder be6ff6a043 FIX update query ci user and ci repo method 2020-09-09 09:57:44 +08:00
Jasder 0edac45e82 FIX 解决自动触发构建失败的问题 2020-09-09 09:17:11 +08:00
Jasder 5dfc6504a0 ADD sync ci user repos api 2020-09-08 15:29:38 +08:00
Jasder 3290609bbc FIX request devops languages api authoure 2020-09-08 15:29:19 +08:00
Jasder e877c2cde6 FIX code review 2020-09-07 16:25:06 +08:00
Jasder 2b470eed50 Delete some log info 2020-09-07 16:05:03 +08:00
Jasder 4a20caed0e FIX gitea webhook bug 2020-09-07 15:11:43 +08:00
Jasder 6985699989 Upage ci certifacate 2020-09-07 14:44:26 +08:00
Jasder c875451ac1 Merge branch 'dev_trustie' into dev_devops 2020-09-07 13:50:46 +08:00
Jasder a8821de85f Update gitea hooks api 2020-09-07 11:23:09 +08:00
Jasder 5cc5404915 FIX . 2020-09-04 18:20:50 +08:00
Jasder 401efd7c9b FIX code bug 2020-09-04 18:16:38 +08:00
Jasder 9613f4c485 FIX test gitea create webhook 2020-09-04 17:51:39 +08:00
Jasder e77475e26a ADD ci cloud account authenticate url 2020-09-04 17:35:29 +08:00
Jasder 81ec264483 Update destroy ci_user attassion 2020-09-04 17:26:37 +08:00
Jasder 0777db4ab4 FIX 2020-09-04 17:11:02 +08:00
Jasder 5c2bb71e57 FIX ci activate repo's bug 2020-09-04 16:57:23 +08:00
Jasder e0dac72114 FIX ci repos dependent destroy bug 2020-09-04 16:45:38 +08:00
Jasder 48350dc6f2 FIX delete webhook for bind ci service 2020-09-04 16:26:00 +08:00
Jasder 930f8195b7 FIX project search wrong 2020-09-04 16:24:20 +08:00
Jasder 15c92597a9 FIX code bug 2020-09-04 16:21:06 +08:00
Jasder f7d83acafe ADD webhook manager 2020-09-04 16:17:18 +08:00
Jasder eb2f1f46e0 ADD create gitea webhook api 2020-09-04 15:46:07 +08:00
Jasder 8c908a35ac FIX bug 2020-09-04 10:28:41 +08:00
Jasder 32ec60bbe3 FIX 完善ci服务的解绑流程 2020-09-04 10:17:44 +08:00
Jasder 74b2a5b021 FIX rename ucloud view dir 2020-09-03 17:10:23 +08:00
Jasder b31a11302c FIX devops admin bug 2020-09-03 17:05:38 +08:00
Jasder 562d0b7b07 ADD 个人中心添加devops管理功能 2020-09-03 15:52:54 +08:00
Jasder 731c06185b Merge branch 'dev_trustie' into dev_devops 2020-09-03 15:34:05 +08:00
Jasder 57ee5c5397 Merge branch 'dev_trustie' into dev_devops 2020-09-01 15:23:37 +08:00
Jasder d674fad604 Update readme.md 2020-09-01 15:16:00 +08:00
Jasder 003db1405d Merge branch 'dev_trustie' into dev_devops 2020-08-29 12:07:37 +08:00
Jasder 26f03badbc FIX change routes 2020-08-29 10:35:22 +08:00
Jasder 1290b3446f FIX update_column bug 2020-08-28 11:50:14 +08:00
Jasder 903103ec5d FIX ci active repo bug 2020-08-28 11:40:29 +08:00
Jasder b9a57be67d FIX code bug 2020-08-28 10:56:04 +08:00
Jasder f47eae3aeb FIX app/views/projects/ci_authorize.json.jbuilder 2020-08-28 10:46:23 +08:00
Jasder 27b6a251af FIX . 2020-08-28 10:43:32 +08:00
Jasder 30ff51f93b FIX devops author url 2020-08-28 10:38:39 +08:00
Jasder b75896821f FIX 优化ci初始化流程 2020-08-28 10:25:08 +08:00
Jasder b26c2f273f FIX build time bug 2020-08-27 16:01:10 +08:00
Jasder 0461c2735b Merge branch 'dev_trustie' into dev_devops 2020-08-27 15:10:25 +08:00
Jasder f09a9bdedc Merge branch 'dev_trustie' into dev_devops 2020-08-27 15:05:24 +08:00
Jasder 43a8576089 Merge branch 'dev_trustie' into dev_devops 2020-08-27 14:44:26 +08:00
Jasder 016971287c ADD open_devops for repositores show api 2020-08-27 11:50:17 +08:00
Jasder 82c4f4f38a ADD build error status 2020-08-27 11:39:11 +08:00
Jasder 2866c060c7 FIx code review 2020-08-26 16:24:51 +08:00
Jasder 518e966a87 FIX update trustie-pileline 2020-08-26 16:23:59 +08:00
Jasder 8c9c085259 ADD cloud account id 2020-08-26 15:14:00 +08:00
Jasder 72cacb72a6 FIX devops author api 2020-08-26 15:02:02 +08:00
Jasder 1e99e87228 FIX delete 'docker rm -f' command 2020-08-26 14:34:32 +08:00
Jasder 21fa22ed21 FIX 2020-08-26 12:02:51 +08:00
Jasder fc7b714d4c FIX delete project_id with create cloud_account 2020-08-26 11:57:47 +08:00
Jasder aac6df8790 FIX time count bug 2020-08-26 10:46:54 +08:00
Jasder 7e9d5a9acb FIX code bug 2020-08-26 10:45:21 +08:00
Jasder d16713e611 FIX buid time bug 2020-08-26 10:43:47 +08:00
Jasder 087f81a6aa ADD duration time for stage and step 2020-08-25 17:59:32 +08:00
Jasder c54723a6c6 FIX step bug 2020-08-25 17:14:55 +08:00
Jasder 21192d70b6 FIX stage bug 2020-08-25 17:09:44 +08:00
Jasder 5375c3ec71 ADD build status with killed 2020-08-25 17:01:03 +08:00
Jasder 66efdcc1b6 FIX build's number params 2020-08-25 16:39:31 +08:00
Jasder ec7becc26e FIX user search cloud account's bug 2020-08-25 16:34:13 +08:00
Jasder 1617a541fe FIX code review 2020-08-25 15:59:53 +08:00
Jasder 3e25a7b28c FIX code review 2020-08-25 15:49:47 +08:00
Jasder 41f876a714 FIX build finished time bug 2020-08-25 15:48:41 +08:00
Jasder 1ea9e420be ADD paginate for builds api 2020-08-25 15:43:30 +08:00
Jasder 4932eae285 ADD branch and sha for builds api 2020-08-25 14:25:42 +08:00
Jasder 405e5b5d3d FIX bug 2020-08-25 11:05:46 +08:00
sylor_huang@126.com e23ce05b1b Fixed: Issues2 2020-08-24 15:09:16 +08:00
sylor_huang@126.com 200cb70f4b Fixed: Issues 2020-08-24 15:06:05 +08:00
sylor_huang@126.com 46801284aa Test Project Validate Failed15 2020-08-24 14:28:30 +08:00
sylor_huang@126.com 7e7ab71231 Test Project Validate Failed14 2020-08-24 14:20:48 +08:00
sylor_huang@126.com 79bc2655b7 Test Project Validate Failed13 2020-08-24 14:19:32 +08:00
sylor_huang@126.com 5a065d83b7 Test Project Validate Failed12 2020-08-24 14:17:23 +08:00
sylor_huang@126.com 3586952a89 Test Project Validate Failed1 2020-08-24 14:16:11 +08:00
sylor_huang@126.com 72feacecbb Test Project Validate Failed 2020-08-24 14:12:59 +08:00
Jasder 8abf748778 FIX bug 2020-08-21 16:25:13 +08:00
Jasder 8758ec3197 Update trustie pipeline api 2020-08-21 16:06:47 +08:00
Jasder c1e6792f29 FIX cloud account bug 2020-08-21 15:26:42 +08:00
Jasder ae9d857d7f FIX ci server 2020-08-21 14:53:48 +08:00
Jasder e7a0bc7e0f FIX code bug 2020-08-21 10:46:37 +08:00
Jasder 137e780db4 FIX . 2020-08-21 10:15:26 +08:00
Jasder 3aa0cb70fe Merge branch 'dev_devops' of http://git.trustie.net/jasder/forgeplus into dev_devops 2020-08-20 18:38:05 +08:00
Jasder 7c1ab2cddf FIX 重构ci流程 2020-08-20 18:37:53 +08:00
sylor_huang@126.com 957df36fb1 Merge branch 'dev_trustie' into dev_devops 2020-08-20 18:04:53 +08:00
Jasder 89b2e263ae FIX devops builds api bug 2020-08-19 18:19:27 +08:00
Jasder ac2d2b842d Merge branch 'dev_trustie' into dev_devops 2020-08-19 17:13:48 +08:00
Jasder 1159a47b3e Update readme 2020-08-19 15:51:53 +08:00
Jasder 70e6c1395d FIX readme 2020-08-18 16:42:17 +08:00
Jasder 9b25b7a9e6 FIX ci drone server database 2020-08-18 16:40:39 +08:00
Jasder 5ac6133aef FIX ci drone server connect database 2020-08-18 09:23:23 +08:00
Jasder 3a18772de0 Merge branch 'dev_trustie' into dev_devops 2020-08-18 09:07:59 +08:00
Jasder a9012b4c53 Merge branch 'dev_trustie' into dev_devops 2020-08-17 18:08:41 +08:00
Jasder 90693d4745 Merge branch 'dev_trustie' into dev_devops 2020-08-17 17:48:07 +08:00
Jasder ad229081f0 Merge branch 'dev_trustie' into dev_devops 2020-08-17 17:41:39 +08:00
Jasder a4d8338cb5 ADD ci database port 2020-08-17 14:29:09 +08:00
Jasder af220cfffc FIX config drone database 2020-08-17 14:22:26 +08:00
Jasder 7bb43700b4 ADD namespace ci for model 2020-08-17 11:22:53 +08:00
Jasder 7b8bb996a6 Merge branch 'dev_trustie' into dev_devops 2020-08-17 11:14:35 +08:00
Jasder 480cfb66b1 Merge branch 'dev_devops' of http://git.trustie.net/jasder/forgeplus into dev_devops 2020-08-15 19:57:35 +08:00
Jasder b233586779 FIX merge 2020-08-15 19:57:20 +08:00
sylor_huang@126.com 8fd167b578 Merge branch 'dev_trustie' into dev_devops 2020-08-15 15:04:24 +08:00
sylor_huang@126.com 09802819b8 Merge branch 'dev_trustie' into dev_devops 2020-08-15 14:50:12 +08:00
sylor_huang@126.com 2979eaaeb4 Merge branch 'dev_trustie' into dev_devops 2020-08-15 14:48:42 +08:00
sylor_huang@126.com bc8240b772 Merge branch 'dev_trustie' into dev_devops 2020-08-15 14:35:52 +08:00
sylor_huang@126.com 372687e509 Merge branch 'dev_trustie' into dev_devops 2020-08-15 13:49:52 +08:00
sylor_huang@126.com a7b096d00e Merge branch 'dev_trustie' into dev_devops 2020-08-15 13:36:03 +08:00
sylor_huang@126.com 2267872076 Chnage 2020-08-15 13:30:44 +08:00
sylor_huang@126.com 929b56629c Change 2020-08-15 13:28:22 +08:00
sylor_huang@126.com 2154892a0b Merge branch 'dev_trustie' into dev_devops 2020-08-15 13:27:32 +08:00
sylor_huang@126.com 0af359ec0c Change 2020-08-15 13:21:33 +08:00
sylor_huang@126.com a0d287b1df Change 2020-08-15 12:50:04 +08:00
sylor_huang@126.com 466bdedfcd Change 2020-08-15 12:40:31 +08:00
sylor_huang@126.com e1c49c0ba8 Change 2020-08-15 12:38:25 +08:00
sylor_huang@126.com aa0f7ff873 Change 2020-08-15 12:37:26 +08:00
Jasder fb733722d6 Merge branch 'dev_change_route' into dev_devops 2020-08-15 11:06:04 +08:00
Jasder ef285f54c6 Merge branch 'dev_change_route' into dev_devops 2020-08-15 10:59:42 +08:00
Jasder 90f14d2051 FIX projects fork users bug 2020-08-15 10:58:56 +08:00
Jasder bd9f32cfaa Merge branch 'dev_change_route' into dev_devops 2020-08-15 10:26:47 +08:00
Jasder dac91f9a0c Merge branch 'dev_change_route' into dev_devops 2020-08-14 23:25:10 +08:00
Jasder 0c64b36fab FIX merge 2020-08-14 22:17:09 +08:00
Jasder 775c27a45b FIX login bug 2020-08-14 22:14:59 +08:00
Jasder 10adc42257 Merge branch 'dev_change_route' into dev_devops 2020-08-14 22:05:35 +08:00
Jasder 58d0044764 Merge branch 'dev_change_route' into dev_devops 2020-08-14 22:00:52 +08:00
Jasder 652654e606 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:57:10 +08:00
Jasder f7db9c0892 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:53:25 +08:00
Jasder 07edd5f8b4 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:49:47 +08:00
Jasder 94bf6f99cc Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:43:53 +08:00
Jasder 840e048d77 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:32:09 +08:00
Jasder 9317e21dd5 Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:17:50 +08:00
Jasder 39424ec8da Merge branch 'dev_change_route' into dev_devops 2020-08-14 21:09:12 +08:00
Jasder b2a6630e15 Merge branch 'dev_change_route' into dev_devops 2020-08-14 19:47:19 +08:00
Jasder 06d0065173 Merge branch 'dev_change_route' into dev_devops 2020-08-14 18:40:32 +08:00
Jasder 63148c339c Merge branch 'dev_change_route' into dev_devops 2020-08-14 18:21:04 +08:00
Jasder cf43a64ada FIX rewrite devops with ci 2020-08-13 23:38:32 +08:00
Jasder 8e7c25b5ed FIX code bug 2020-08-13 21:11:33 +08:00
Jasder 7a2d7f50fd Merge branch 'dev_change_route' into dev_devops 2020-08-13 20:49:33 +08:00
Jasder 78b091ddd3 FIX merge bug 2020-08-13 09:44:38 +08:00
Jasder 69ea60dfd5 FIX update devops process 2020-08-06 14:26:19 +08:00
Jasder 0b9a69ec56 ADD sha for get trsitie-pileline.yml file api 2020-07-24 15:35:43 +08:00
Jasder 3f92d99136 Merge branch 'dev_trustie' into dev_devops 2020-07-23 09:32:35 +08:00
sylor_huang@126.com 9694074b01 Fix trustie projects projectscore 2020-07-22 16:48:31 +08:00
sylor_huang@126.com c45b8184c6 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-22 16:43:09 +08:00
sylor_huang@126.com 5d7458bede Add trustie projects projectscore 2020-07-22 16:42:55 +08:00
Jasder b7b3751d43 ADD devops authorize 2020-07-22 15:16:01 +08:00
Jasder 3c7b257462 FIX devops 所有仓库相关的请求参数repo_id 改为project_id 2020-07-22 14:28:54 +08:00
Jasder 3d99dee31b Update devops redirect_url 2020-07-22 11:44:42 +08:00
Jasder 8b5c3797e9 FIX devops ucloud account 2020-07-22 11:27:30 +08:00
Jasder 1c2264f721 ADD get .trustie-pipeline.yml file api with devops 2020-07-22 11:18:02 +08:00
Jasder a22bd280bc Update api document 2020-07-21 17:34:47 +08:00
Jasder 07dfc06c9f FIX code review 2020-07-21 17:27:57 +08:00
Jasder 77b55daf04 Update README.md 2020-07-21 17:24:30 +08:00
Jasder cf244390ef FIX git drone logs api params's bug 2020-07-21 17:13:15 +08:00
Jasder 794f281787 FIX bug 2020-07-21 17:11:28 +08:00
Jasder 0f92aa7981 FIX test devops 2020-07-21 17:08:07 +08:00
Jasder 20d8f21ebb FIX bug 2020-07-21 15:19:43 +08:00
Jasder 236782eca8 FIX drone server command's bug 2020-07-21 15:07:42 +08:00
Jasder 5d34ac68d5 FIX create oauth bug 2020-07-21 14:17:19 +08:00
Jasder 15fc5de3de FIX 测试giteawebhook 2020-07-21 12:35:26 +08:00
Jasder 5fcb4a5500 FIX drone sever request params 2020-07-20 16:52:26 +08:00
Jasder 1f54e02ace ADD devops .trustie-pipeline.ym file 2020-07-20 16:12:37 +08:00
Jasder 9cc2e80e98 FIX bug 2020-07-20 15:47:58 +08:00
Jasder 2633e65a6c Update README.md 2020-07-20 15:39:12 +08:00
Jasder 3b26434c78 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-20 15:38:20 +08:00
Jasder e414960153 Update drone request server 2020-07-20 15:38:12 +08:00
sylor_huang@126.com 0fddf09e47 Merge branch 'dev_trustie' into dev_devops 2020-07-20 11:40:05 +08:00
sylor_huang@126.com b89598d452 Merge branch 'dev_trustie' into dev_devops 2020-07-20 09:58:21 +08:00
sylor_huang@126.com b07f84a3a0 Merge branch 'dev_trustie' into dev_devops 2020-07-20 09:53:12 +08:00
sylor_huang@126.com 1f86ad6349 Merge branch 'dev_trustie' into dev_devops 2020-07-20 09:45:53 +08:00
sylor_huang@126.com b47f38137b Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-17 18:30:09 +08:00
sylor_huang@126.com 8a7464cf6c change 2020-07-17 18:29:56 +08:00
Jasder 97b5193e2b Merge branch 'dev_trustie' into dev_devops 2020-07-17 18:18:31 +08:00
sylor_huang@126.com 26e1592d93 Merge branch 'dev_trustie' into dev_devops 2020-07-17 17:55:00 +08:00
sylor_huang@126.com 1223a8c2a1 Merge branch 'dev_trustie' into dev_devops 2020-07-17 17:04:27 +08:00
sylor_huang@126.com 0fd97e31a5 Merge branch 'dev_trustie' into dev_devops 2020-07-17 16:58:13 +08:00
sylor_huang@126.com 69d319ef3b Merge branch 'dev_trustie' into dev_devops 2020-07-17 16:18:51 +08:00
sylor_huang@126.com b73dc77a4b Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-17 16:16:44 +08:00
sylor_huang@126.com d4220efc00 Merge branch 'dev_trustie' into dev_devops 2020-07-17 16:16:23 +08:00
Jasder 69425d6d0a FIX . 2020-07-17 16:02:54 +08:00
sylor_huang@126.com bb9c79537d Merge branch 'dev_trustie' into dev_devops 2020-07-17 15:59:06 +08:00
Jasder 2defd123b3 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-17 15:38:28 +08:00
Jasder e9af85cd16 Merge branch 'dev_trustie' into dev_devops 2020-07-17 15:38:10 +08:00
sylor_huang@126.com bc10e0cfe5 Merge branch 'dev_trustie' into dev_devops 2020-07-17 15:37:58 +08:00
sylor_huang@126.com 46e8920f25 Merge branch 'dev_trustie' into dev_devops 2020-07-17 15:31:34 +08:00
sylor_huang@126.com 5439078427 Merge branch 'dev_trustie' into dev_devops 2020-07-17 14:33:41 +08:00
sylor_huang@126.com 6b725acbff Merge branch 'dev_trustie' into dev_devops 2020-07-17 14:24:48 +08:00
sylor_huang@126.com 4ab24c581b Merge branch 'dev_trustie' into dev_devops 2020-07-17 11:55:04 +08:00
sylor_huang@126.com 11ff3b8b12 Merge branch 'dev_trustie' into dev_devops 2020-07-17 11:28:04 +08:00
sylor_huang@126.com 6357bf91cd change versions_count and check mirrors 2020-07-17 11:25:13 +08:00
sylor_huang@126.com 4be353e239 Merge branch 'dev_trustie' into dev_devops 2020-07-16 14:26:00 +08:00
sylor_huang@126.com a10a3768c9 Merge branch 'dev_trustie' into dev_devops 2020-07-16 13:55:48 +08:00
sylor_huang@126.com 780480bc0b Merge branch 'dev_trustie' into dev_devops 2020-07-16 12:01:15 +08:00
sylor_huang@126.com 5100c352fe Merge branch 'dev_trustie' into dev_devops 2020-07-16 11:57:39 +08:00
sylor_huang@126.com f4a54dbb38 Merge branch 'dev_trustie' into dev_devops 2020-07-16 11:02:10 +08:00
sylor_huang@126.com 0c624f3503 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-15 23:48:52 +08:00
sylor_huang@126.com 02a16748ec Merge branch 'dev_trustie' into dev_devops 2020-07-15 23:48:39 +08:00
Jasder 98469f3e0a FIX merge 2020-07-15 23:32:35 +08:00
Jasder cdbca5c845 FIX merge 2020-07-15 23:31:48 +08:00
sylor_huang@126.com 1e96ecd440 chang 2020-07-15 23:28:24 +08:00
sylor_huang@126.com d08ebb3012 change 2020-07-15 22:56:36 +08:00
sylor_huang@126.com b077d0c361 change 2020-07-15 22:38:58 +08:00
sylor_huang@126.com 2ed819af39 Merge branch 'dev_trustie' into dev_devops 2020-07-15 22:02:47 +08:00
sylor_huang@126.com 289f4495b6 chang issues 2020-07-15 22:01:12 +08:00
sylor_huang@126.com 4411f469b0 Merge branch 'dev_trustie' into dev_devops 2020-07-15 21:31:18 +08:00
sylor_huang@126.com fb54d57561 change 2020-07-15 21:29:59 +08:00
sylor_huang@126.com 02e6ecae9e Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-15 21:17:44 +08:00
sylor_huang@126.com c2f702eacd add users 2020-07-15 21:17:30 +08:00
Jasder 7098692f08 Merge branch 'dev_trustie' into dev_devops 2020-07-15 20:35:15 +08:00
Jasder 00c0fa0eb4 Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-15 20:34:38 +08:00
Jasder 8d5a373c6b Update readme.md ducument 2020-07-15 20:34:25 +08:00
Jasder 006ff7fd62 ADD devops builds's api 2020-07-15 20:34:01 +08:00
sylor_huang@126.com 4f0b10a3da Merge branch 'dev_trustie' into dev_devops 2020-07-15 20:31:39 +08:00
sylor_huang@126.com f2df2e84cc Merge branch 'dev_trustie' into dev_devops 2020-07-15 18:33:36 +08:00
sylor_huang@126.com a7f80a5dde Merge branch 'dev_trustie' into dev_devops 2020-07-15 18:28:16 +08:00
sylor_huang@126.com d8ace90037 Merge branch 'dev_trustie' into dev_devops 2020-07-15 18:17:45 +08:00
sylor_huang@126.com 90d5fb7276 Merge branch 'dev_trustie' into dev_devops 2020-07-15 18:04:29 +08:00
sylor_huang@126.com bc82451fcc Change 2020-07-15 18:02:43 +08:00
sylor_huang@126.com df0fcdb5ce Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops 2020-07-15 17:35:21 +08:00
sylor_huang@126.com d2ef7ec5e4 Merge branch 'dev_trustie' into dev_devops 2020-07-15 17:34:55 +08:00
Jasder 8f96341679 FIX merge dev_trustie conflict 2020-07-15 17:16:41 +08:00
Jasder b9abd6a152 FIX 插销掉dev_chain分支的合并 2020-07-15 17:13:16 +08:00
Jasder c181abce81 FIX 完善devops流程 2020-07-15 16:53:38 +08:00
sylor_huang@126.com 57fb06a1b3 Merge branch 'dev_trustie' into dev_devops 2020-07-15 16:25:54 +08:00
sylor_huang@126.com 86fc1efb67 Merge branch 'dev_chain' into dev_devops 2020-07-15 16:06:31 +08:00
sylor_huang@126.com f71e65f600 change bugs 2020-07-15 16:06:06 +08:00
sylor_huang@126.com 2db35b6d40 Merge branch 'dev_chain' into dev_devops 2020-07-15 16:00:58 +08:00
sylor_huang@126.com bacfc5299b Merge branch 'dev_trustie' into dev_chain 2020-07-15 15:43:28 +08:00
Jasder 123e8d7659 FIX ucloud account bug 2020-07-15 10:22:41 +08:00
Jasder f358361b89 FIX bug 2020-07-15 09:59:12 +08:00
Jasder e0ae7b2aec Merge branch 'dev_trustie' into dev_devops 2020-07-15 09:44:55 +08:00
Jasder da0e45a3c6 ADD devops 2020-07-15 09:43:30 +08:00
sylor_huang@126.com 14628af4a5 Merge branch 'dev_trustie' into dev_chain 2020-07-14 22:45:27 +08:00
sylor_huang@126.com d09e0fd5fa Change bugs 2020-07-14 22:07:10 +08:00
sylor_huang@126.com eedaba9bed change 2020-07-14 20:19:16 +08:00
sylor_huang@126.com b8e1e7540a Merge branch 'dev_trustie' into dev_chain 2020-07-14 19:28:05 +08:00
Jasder 4518a3ea87 FIX simple api with open_devops columen 2020-07-14 15:34:01 +08:00
Jasder 4d9b8738d8 ADD a column 2020-07-14 15:33:32 +08:00
Jasder 2b6fe8f9a8 FIX merge 2020-07-14 15:15:50 +08:00
Jasder 6527603e24 FIX 完善devops流程 2020-07-14 15:06:09 +08:00
sylor_huang@126.com 944e5de8c6 Merge branch 'dev_trustie' into dev_chain 2020-07-14 14:25:26 +08:00
sylor_huang@126.com afd49eabdc Merge branch 'dev_trustie' into dev_chain 2020-07-14 14:15:49 +08:00
sylor_huang@126.com b0e6646c8e Merge branch 'dev_trustie' into dev_chain 2020-07-14 13:57:02 +08:00
sylor_huang@126.com dd2c70fcee Merge branch 'dev_trustie' into dev_chain 2020-07-14 13:46:28 +08:00
sylor_huang@126.com 0eb1abf850 Merge branch 'dev_trustie' into dev_chain 2020-07-14 11:27:59 +08:00
sylor_huang@126.com eb46496fb1 Merge branch 'dev_trustie' into dev_chain 2020-07-13 21:01:33 +08:00
sylor_huang@126.com d12fc65da5 chang 2020-07-13 20:58:48 +08:00
sylor_huang@126.com 4417f8c070 Merge branch 'dev_trustie' into dev_chain 2020-07-13 13:54:48 +08:00
sylor_huang@126.com 224b7c7cd4 Merge branch 'dev_trustie' into dev_chain 2020-07-13 11:49:25 +08:00
sylor_huang@126.com 86c63e39a0 Merge branch 'dev_trustie' into dev_chain 2020-07-13 11:08:37 +08:00
sylor_huang@126.com 27ee469d24 Merge branch 'dev_trustie' into dev_chain 2020-07-13 10:58:53 +08:00
sylor_huang@126.com 0180ec93bf Merge branch 'dev_trustie' into dev_chain 2020-07-13 10:09:05 +08:00
sylor_huang@126.com 2ccf667f20 change bugs 2020-07-13 10:08:20 +08:00
sylor_huang@126.com 2632cbb010 Merge branch 'dev_trustie' into dev_chain 2020-07-13 09:50:52 +08:00
sylor_huang@126.com 2941652375 Merge branch 'dev_trustie' into dev_chain 2020-07-10 21:13:44 +08:00
sylor_huang@126.com 94cd6202a9 Merge branch 'dev_trustie' into dev_chain 2020-07-10 21:09:25 +08:00
sylor_huang@126.com 3fe0c4752f Merge branch 'dev_trustie' into dev_chain 2020-07-10 20:43:12 +08:00
sylor_huang@126.com 9a1db03dca Merge branch 'dev_trustie' into dev_chain 2020-07-10 20:20:43 +08:00
sylor_huang@126.com ab2fe592ec Merge branch 'dev_trustie' into dev_chain 2020-07-10 20:10:48 +08:00
sylor_huang@126.com bb97f33732 Merge branch 'dev_trustie' into dev_chain 2020-07-10 20:04:03 +08:00
sylor_huang@126.com bfb437ae3e Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:56:24 +08:00
sylor_huang@126.com 3c66b92e90 Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:50:20 +08:00
sylor_huang@126.com 9e310f992e Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:44:21 +08:00
sylor_huang@126.com ce11dbba2e Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:37:54 +08:00
sylor_huang@126.com 6db500c0a6 Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:25:39 +08:00
sylor_huang@126.com 569a68e199 Merge branch 'dev_trustie' into dev_chain 2020-07-10 19:20:57 +08:00
sylor_huang@126.com ed80de25f3 Merge branch 'dev_trustie' into dev_chain 2020-07-10 18:44:25 +08:00
sylor_huang@126.com 2e2b4a9469 Merge branch 'dev_trustie' into dev_chain 2020-07-10 18:12:28 +08:00
sylor_huang@126.com 4b8563db5d Merge branch 'dev_trustie' into dev_chain 2020-07-10 18:03:29 +08:00
sylor_huang@126.com b936e0a3e8 Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:47:30 +08:00
sylor_huang@126.com ee95464033 Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:36:36 +08:00
sylor_huang@126.com 7415fa2b3c Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:20:44 +08:00
sylor_huang@126.com f4e1414f2a Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:05:16 +08:00
sylor_huang@126.com 3746db7fde Merge branch 'dev_trustie' into dev_chain 2020-07-10 17:00:17 +08:00
sylor_huang@126.com 06e914f398 Merge branch 'dev_trustie' into dev_chain 2020-07-10 16:51:51 +08:00
sylor_huang@126.com 7d76c6c85f Merge branch 'dev_trustie' into dev_chain 2020-07-10 16:32:33 +08:00
sylor_huang@126.com 1c482761cf Merge branch 'dev_trustie' into dev_chain 2020-07-10 16:25:27 +08:00
sylor_huang@126.com 4893edd6c1 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:56:16 +08:00
sylor_huang@126.com 61d8753b89 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:45:12 +08:00
sylor_huang@126.com 47c18cb218 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:36:13 +08:00
sylor_huang@126.com ad14aa758e Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:24:40 +08:00
sylor_huang@126.com 90aa97c444 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:12:19 +08:00
sylor_huang@126.com 4fdb2c2221 Merge branch 'dev_trustie' into dev_chain 2020-07-10 15:11:00 +08:00
sylor_huang@126.com 93b2872ad9 Merge branch 'dev_trustie' into dev_chain 2020-07-10 14:53:46 +08:00
sylor_huang@126.com 0323166499 Merge branch 'dev_trustie' into dev_chain 2020-07-10 14:45:10 +08:00
sylor_huang@126.com 962a92eeca Merge branch 'dev_trustie' into dev_chain 2020-07-10 14:24:43 +08:00
sylor_huang@126.com 50b79ee3cf Merge branch 'dev_trustie' into dev_chain 2020-07-10 14:10:06 +08:00
Jasder e74bba9092 ADD test devops 2020-07-10 14:08:16 +08:00
sylor_huang@126.com 05615500e6 change bugs 2020-07-10 14:06:26 +08:00
sylor_huang@126.com 66beab3457 s 2020-07-10 11:54:30 +08:00
sylor_huang@126.com a20cb9eb5b Merge branch 'dev_trustie' into dev_chain 2020-07-10 11:53:49 +08:00
sylor_huang@126.com 0db202585b change bugs 2020-07-10 11:15:04 +08:00
sylor_huang@126.com 8860a584ca change bugs 2020-07-10 11:13:27 +08:00
sylor_huang@126.com 28f777f5eb Merge branch 'dev_trustie' into dev_chain 2020-07-10 10:58:58 +08:00
sylor_huang@126.com 066a720525 Merge branch 'dev_trustie' into dev_chain 2020-07-10 10:53:15 +08:00
sylor_huang@126.com a6a65eb4c8 Merge branch 'dev_trustie' into dev_chain 2020-07-10 10:21:02 +08:00
sylor_huang@126.com 2664be17f9 Merge branch 'dev_trustie' into dev_chain 2020-07-10 10:10:36 +08:00
sylor_huang@126.com cd32b7e300 Merge branch 'dev_trustie' into dev_chain 2020-07-10 09:53:33 +08:00
sylor_huang@126.com ac2b8c9f65 Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:58:11 +08:00
sylor_huang@126.com dcbbf66e61 Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:40:59 +08:00
sylor_huang@126.com c6c7f0968b change bugs 2020-07-09 20:37:43 +08:00
sylor_huang@126.com 97844c47d7 Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:36:49 +08:00
sylor_huang@126.com 265562a260 change bugs 2020-07-09 20:33:18 +08:00
sylor_huang@126.com 7724c1bcce Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:24:53 +08:00
sylor_huang@126.com 946a5cc44a Merge branch 'dev_trustie' into dev_chain 2020-07-09 20:18:44 +08:00
sylor_huang@126.com a78ba32923 Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:57:50 +08:00
sylor_huang@126.com 704dda3a1c Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:47:03 +08:00
sylor_huang@126.com 7fdc61040c Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:43:39 +08:00
sylor_huang@126.com 7df67ebca6 Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:33:27 +08:00
sylor_huang@126.com bf85203a25 Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:30:43 +08:00
sylor_huang@126.com 62ab4805a2 Merge branch 'dev_trustie' into dev_chain 2020-07-09 19:27:55 +08:00
sylor_huang@126.com 9e2181392b Merge branch 'dev_trustie' into dev_chain 2020-07-09 17:52:09 +08:00
sylor_huang@126.com bcd6ffdfda Merge branch 'dev_trustie' into dev_chain 2020-07-09 16:47:55 +08:00
sylor_huang@126.com b9a596bb2c Merge branch 'dev_trustie' into dev_chain 2020-07-07 13:55:17 +08:00
sylor_huang@126.com 8a1abaed8a change 2020-07-06 16:35:03 +08:00
sylor_huang@126.com b189d16f58 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-07-03 17:37:45 +08:00
sylor_huang@126.com 153496c089 Merge branch 'dev_trustie' into dev_chain 2020-07-03 17:37:33 +08:00
Jasder e35f8515ee Merge branch 'dev_trustie' into dev_chain 2020-07-03 17:36:36 +08:00
sylor_huang@126.com c96dcb14e7 Merge branch 'dev_trustie' into dev_chain 2020-07-03 17:15:15 +08:00
sylor_huang@126.com d812929152 Merge branch 'dev_trustie' into dev_chain 2020-07-03 17:01:16 +08:00
sylor_huang@126.com 943d14ebfe change errors 2020-07-03 16:23:04 +08:00
sylor_huang@126.com 73d3715cca change 2020-07-03 16:17:06 +08:00
sylor_huang@126.com 21417ad300 Merge branch 'dev_trustie' into dev_chain 2020-07-03 16:13:24 +08:00
sylor_huang@126.com 8eb3b149d7 Merge branch 'dev_trustie' into dev_chain 2020-07-03 15:26:46 +08:00
Jasder 1541cb4fc3 Merge branch 'dev_trustie' into dev_chain 2020-07-02 15:52:15 +08:00
sylor_huang@126.com 2e3438d75b Merge branch 'dev_trustie' into dev_chain 2020-07-02 15:00:43 +08:00
sylor_huang@126.com d5849976a3 Merge branch 'dev_trustie' into dev_chain 2020-07-02 10:13:17 +08:00
sylor_huang@126.com 2efb212751 Merge branch 'dev_trustie' into dev_chain 2020-07-01 10:07:16 +08:00
sylor_huang@126.com 964e015588 Merge branch 'dev_trustie' into dev_chain 2020-06-30 18:49:37 +08:00
sylor_huang@126.com 784ce1aea0 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-30 16:23:25 +08:00
sylor_huang@126.com 25efc96d0d Merge branch 'dev_trustie' into dev_chain 2020-06-30 16:23:09 +08:00
Jasder b6c51f7dcf Merge branch 'dev_trustie' into dev_chain 2020-06-30 15:54:30 +08:00
Jasder c00cb33799 Merge branch 'dev_trustie' into dev_chain 2020-06-30 15:02:01 +08:00
sylor_huang@126.com da81e7ae73 Merge branch 'dev_trustie' into dev_chain 2020-06-30 13:50:40 +08:00
sylor_huang@126.com ec6e962248 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:53:38 +08:00
sylor_huang@126.com 26dc737ee3 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:47:56 +08:00
sylor_huang@126.com b0afa38258 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:43:51 +08:00
sylor_huang@126.com d59b30e6e2 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:39:53 +08:00
sylor_huang@126.com 12019f554c Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:27:51 +08:00
sylor_huang@126.com 88d658dde4 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-30 11:22:43 +08:00
sylor_huang@126.com f6739a9502 Merge branch 'dev_trustie' into dev_chain 2020-06-30 11:22:30 +08:00
Jasder e0e09d90d8 FIX merge bug 2020-06-30 11:16:56 +08:00
Jasder c6f4d7157f ADD mirror_url to simpe project api 2020-06-30 11:15:03 +08:00
Jasder 0aa6521fae Merge branch 'dev_trustie' into dev_chain 2020-06-30 10:45:47 +08:00
sylor_huang@126.com e75b84544a Merge branch 'dev_trustie' into dev_chain 2020-06-30 10:44:42 +08:00
sylor_huang@126.com aa19747dd6 Merge branch 'dev_trustie' into dev_chain 2020-06-30 10:07:47 +08:00
sylor_huang@126.com 45eb65ce88 change pr 2020-06-30 09:45:26 +08:00
sylor_huang@126.com 1e7826a298 Merge branch 'dev_trustie' into dev_chain 2020-06-30 09:44:49 +08:00
Jasder d806c4cc09 Merge branch 'dev_trustie' into dev_chain 2020-06-29 18:29:07 +08:00
sylor_huang@126.com 94227b104c Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-29 17:07:53 +08:00
sylor_huang@126.com 86c6a7bbdd Merge branch 'dev_trustie' into dev_chain 2020-06-29 17:07:38 +08:00
Jasder 750094f68f Merge branch 'dev_trustie' into dev_chain 2020-06-29 16:06:48 +08:00
sylor_huang@126.com 6b9c424b07 Merge branch 'dev_trustie' into dev_chain 2020-06-24 16:16:33 +08:00
sylor_huang@126.com 40347aaa66 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-24 15:34:03 +08:00
sylor_huang@126.com cfae67c3c9 Merge branch 'dev_trustie' into dev_chain 2020-06-24 15:33:48 +08:00
Jasder 7f9af73fdd Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-23 15:10:24 +08:00
Jasder 0a7ab3469d Merge branch 'dev_trustie' into dev_chain 2020-06-23 15:10:04 +08:00
sylor_huang@126.com d09e7b3439 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-23 15:00:57 +08:00
sylor_huang@126.com b7c86fd83c Merge branch 'dev_trustie' into dev_chain 2020-06-23 15:00:33 +08:00
Jasder faaa165684 Merge branch 'dev_chain' of http://gitea.trustie.net/jasder/forgeplus into dev_chain 2020-06-23 11:59:51 +08:00
sylor_huang@126.com 8ffbfdd7e8 Merge branch 'dev_trustie' into dev_chain 2020-06-18 16:29:14 +08:00
sylor_huang@126.com e469629106 Merge branch 'dev_trustie' into dev_chain 2020-06-18 16:00:42 +08:00
sylor_huang@126.com 8af997bf9f change 2020-06-18 15:59:37 +08:00
sylor_huang@126.com b90bc0aed2 change bug 2020-06-18 15:47:43 +08:00
sylor_huang@126.com 7ffe33858b change 2020-06-12 18:48:32 +08:00
sylor_huang@126.com 9d7e7b2eb7 change 2020-06-12 18:28:20 +08:00
sylor_huang@126.com 459d836154 merge 2020-06-12 18:24:10 +08:00
sylor_huang@126.com 77b995e958 remove dump.mb 2020-06-11 11:46:58 +08:00
sylor_huang@126.com 851f0de0a7 change 2020-06-10 18:47:03 +08:00
sylor_huang@126.com 6b29621485 change token issue bug 2020-06-10 18:33:23 +08:00
sylor_huang@126.com 4b4bb0ab14 change check_token 2020-06-10 18:24:03 +08:00
sylor_huang@126.com 844699dd1b change 2020-06-10 16:34:34 +08:00
sylor_huang@126.com fc820238c4 修改chain相关的 2020-06-10 16:04:14 +08:00
sylor_huang@126.com 79641e859c change chain 2020-06-09 18:55:09 +08:00
jasder 0bd6952567 Update 'README.md' 2020-05-07 18:12:36 +08:00
Jasder b2274aae0c Merge branch 'master' of http://gitea.trustie.net/jasder/forgeplus 2020-04-26 10:15:08 +08:00
Jasder 3be16db2a8 FIX merge 2020-04-26 10:14:54 +08:00
jasder b1493bd081 Update 'README.md' 2020-04-26 09:55:00 +08:00
865 changed files with 53383 additions and 10383 deletions

5
.gitignore vendored
View File

@ -36,6 +36,8 @@ public/react/yarn.lock
/.idea/*
# Ignore react node_modules
public/system/*
public/react/*
/public/react/.cache
/public/react/node_modules/
/public/react/config/stats.json
@ -81,4 +83,5 @@ docker/
educoder.sql
redis_data/
Dockerfile
dump.rdb
dump.rdb
.tags*

22
.trustie-pipeline.yml Normal file
View File

@ -0,0 +1,22 @@
kind: pipeline
name: default
platform:
os: linux
arch: arm64
steps:
- name: install
image: ruby:2.4.5
commands:
- gem install bundler
- bundle -v
- bundle install --jobs=1 --retry=1
- name: test
image: ruby:2.4.5
volumes:
- name: bundle
path: /usr/local/bundle
commands:
- rake

98
CHANGELOG.md Normal file
View File

@ -0,0 +1,98 @@
# Changelog
## [v3.1.0](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-06-09
* ENHANCEMENTS
* ADD 用户活动统计图表功能
* ADD 用户精选项目功能
* ADD 用户贡献度统计图表功能
* ADD 用户开发能力数据统计工
* ADD 用户角色定位展示功能
* ADD 用户专业定位标签展示功能
* ADD 修改用户基本资料功能
* ADD 更改密码功能
* ADD 用户个人主页基本现在展示可配置功能
* BUGFIXES
* Fix 解决一些bug
* Fix 优化美化页面
* BUGFIXES
* Fix 在线修改文件,页面文件显不及时的问题(46049)
* Fix Fork项目接口多次调用问题(45052)
* FIX 页面置顶功能区域排版问题(45825)
* Fix 其他样式显示问题
* ENHANCEMENTS
* ADD 合并请求页面显示有冲突文件状态(46016)
* ADD 创建组织各属性添加规则匹配功能(45707)
* ADD 微信分享功能(45707)
## [v3.0.3](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-05-08
* BUGFIXES
* Fix 解决易修标题过长导致的排版问题(45469)
* Fix 解决合并请求详情页面排版错误的问题(45457)
* FIX 解决转移仓库界面专有名词描述错误的问题(45455)
* Fix 解决markdown格式文件自动生成数字排序的问题(45454)
* Fix 解决镜像项目源地址不显示的问题(45403)
* Fix 解决镜像项目导航显示错误问题(45398)
* Fix 解决其他相关bug
* ENHANCEMENTS
* UPDATE 用户注册时,账号和密码正则匹配调整(45336) (45318) (45290)
* ADD 创建组织各属性添加规则匹配功能(45313) (45289)
* ADD 创建团建各属性添加规则匹配功能(45334) (45325) (45287)
* ADD 仓库转移功能(45017) (45015)
## [v3.0.2](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-04-23
* BUGFIXES
* Fix 解决部分用户头像不显示问题
* Fix 解决代码库模块中最左侧目录中的文件定位加载不准确的问题
* FIX 解决团队管理页面中项目链接错误问题
* Fix 解决markdown格式文件显示问题
* Fix 解决组织名下创建项目报错的问题
* Fix 解决组织名下的项目创建issue报错的问题
* Fix 解决组织名下创建团队提示信息信息显示错误问题
* Fix 解决点击组织图片时,链接加载错误问题
* Fix 修复查询版本库信息安全漏洞
* Fix 解决修复团队成员操作访问组织仓库报403错误的问题
* Fix 解决owners团队成员对仓库添加成功失败的问题
* ENHANCEMENTS
* ADD 自动生产用户头像功能
* ADD 创建组织支持中文名称
* ADD 创建团建支持中文名称
* ADD 组织名称统一显示中文名
* ADD 团队名称统一显示中文名
* ADD 用户头像悬浮时展示相关信息
* ADD 项目详情页添加实践课程链接入口
* ADD README文件页面添加添加目录导航功能
* UPDATE 升级改版底部footer信息
* UPDATE 升级用户操作版本库权限
## [v3.0.1](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-03-19
* BUGFIXES
* Fix pull reqeust模块中用户头像显示问题
* Fix 解决issue模块中指派用户的问题
* Fix 解决合并请求失败的后显示message信息不正确
* Fix 代码目录页面readme文件提供单独的api
* ENHANCEMENTS
* 重构项目详情页面
## [v3.0.0](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2020-12-29
* BUGFIXES
* Fix pull reqeust的访问权限问题 (#14156) (#14171)
* Fix 部分页面访问403的问题
* Fix 合并请求失败的问题
* Fix 代码目录页面,文件夹和文件图片不显示的问题
* Fix Issue列表中按负责人过滤筛选时部分项目成员不在搜索范围没的问题
* Fix 项目更新时间不同步的问题, 添加了定时任务
* ENHANCEMENTS
* 提升获取版本库目录代码查询速度 (#43296)
* tag 列表慢查询速度问题 (#43332)
* API builder 模版中 render partial builder的性能问题

View File

@ -1,8 +1,6 @@
source 'https://gems.ruby-china.com'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.3.7'
gem 'rails', '~> 5.2.0'
gem 'mysql2', '>= 0.4.4', '< 0.6.0'
gem 'puma', '~> 3.11'
@ -19,8 +17,6 @@ gem 'kaminari', '~> 1.1', '>= 1.1.1'
gem 'bootsnap', '>= 1.1.0', require: false
gem 'gitlab', path: 'lib/gitlab-cli'
gem 'chinese_pinyin'
gem 'rack-cors'
@ -74,6 +70,7 @@ group :development do
gem 'listen', '>= 3.0.5', '< 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
gem "annotate", "~> 2.6.0"
end
group :test do
@ -103,6 +100,7 @@ gem 'rails-i18n', '~> 5.1'
# job
gem 'sidekiq'
gem 'sinatra'
gem "sidekiq-cron", "~> 1.1"
# batch insert
gem 'bulk_insert'
@ -128,3 +126,5 @@ gem 'request_store'
gem 'harmonious_dictionary', '~> 0.0.1'
gem 'parallel', '~> 1.19', '>= 1.19.1'
gem 'letter_avatar'

View File

@ -1,10 +1,3 @@
PATH
remote: lib/gitlab-cli
specs:
gitlab (3.2.0)
httparty
terminal-table
GEM
remote: https://gems.ruby-china.com/
specs:
@ -61,6 +54,9 @@ GEM
public_suffix (>= 2.0.2, < 5.0)
ancestry (3.0.7)
activerecord (>= 3.2.0)
annotate (2.6.5)
activerecord (>= 2.3.0)
rake (>= 0.8.7)
archive-zip (0.12.0)
io-like (~> 0.3.0)
arel (9.0.0)
@ -122,12 +118,17 @@ GEM
enumerize (2.3.1)
activesupport (>= 3.2)
erubi (1.9.0)
et-orbi (1.2.4)
tzinfo
execjs (2.7.0)
faraday (0.15.4)
multipart-post (>= 1.2, < 3)
ffi (1.12.2)
font-awesome-sass (4.7.0)
sass (>= 3.2)
fugit (1.4.1)
et-orbi (~> 1.1, >= 1.1.8)
raabro (~> 1.4)
globalid (0.4.2)
activesupport (>= 4.2.0)
grape-entity (0.7.1)
@ -138,9 +139,6 @@ GEM
harmonious_dictionary (0.0.1)
hashie (3.6.0)
htmlentities (4.3.4)
httparty (0.18.0)
mime-types (~> 3.0)
multi_xml (>= 0.5.2)
i18n (1.8.2)
concurrent-ruby (~> 1.0)
io-like (0.3.1)
@ -164,6 +162,7 @@ GEM
activerecord
kaminari-core (= 1.2.0)
kaminari-core (1.2.0)
letter_avatar (0.3.8)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
@ -177,10 +176,9 @@ GEM
mimemagic (~> 0.3.2)
maruku (0.7.3)
method_source (0.9.2)
mime-types (3.3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2019.1009)
mimemagic (0.3.4)
mimemagic (0.3.10)
nokogiri (~> 1)
rake
mini_mime (1.0.2)
mini_portile2 (2.4.0)
minitest (5.14.0)
@ -221,6 +219,7 @@ GEM
prettier (0.18.2)
public_suffix (4.0.3)
puma (3.12.2)
raabro (1.4.0)
rack (2.0.9)
rack-cors (1.1.1)
rack (>= 2.0.0)
@ -363,6 +362,9 @@ GEM
rack (< 2.1.0)
rack-protection (>= 1.5.0)
redis (>= 3.3.5, < 5)
sidekiq-cron (1.2.0)
fugit (~> 1.1)
sidekiq (>= 4.2.1)
simple_form (5.0.2)
actionpack (>= 5.0)
activemodel (>= 5.0)
@ -402,8 +404,6 @@ GEM
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
thor (1.0.1)
thread_safe (0.3.6)
tilt (2.0.10)
@ -437,6 +437,7 @@ DEPENDENCIES
acts-as-taggable-on (~> 6.0)
acts_as_list
ancestry
annotate (~> 2.6.0)
awesome_print
axlsx (~> 3.0.0.pre)
axlsx_rails (~> 0.5.2)
@ -452,13 +453,13 @@ DEPENDENCIES
enumerize
faraday (~> 0.15.4)
font-awesome-sass (= 4.7.0)
gitlab!
grape-entity (~> 0.7.1)
groupdate (~> 4.1.0)
harmonious_dictionary (~> 0.0.1)
jbuilder (~> 2.5)
jquery-rails
kaminari (~> 1.1, >= 1.1.1)
letter_avatar
listen (>= 3.0.5, < 3.2)
mysql2 (>= 0.4.4, < 0.6.0)
oauth2
@ -489,6 +490,7 @@ DEPENDENCIES
searchkick
selenium-webdriver
sidekiq
sidekiq-cron (~> 1.1)
simple_form
simple_xlsx_reader
sinatra
@ -502,8 +504,5 @@ DEPENDENCIES
web-console (>= 3.3.0)
wkhtmltopdf-binary
RUBY VERSION
ruby 2.3.7p456
BUNDLED WITH
2.1.4

137
LICENSE
View File

@ -1,21 +1,124 @@
MIT License
木兰宽松许可证, 第2版
Copyright (c) [year] [fullname]
2020年1月 http://license.coscl.org.cn/MulanPSL2
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
您对“软件”的复制、使用、修改及分发受木兰宽松许可证第2版“本许可证”的如下条款的约束
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
0. 定义
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
“软件” 是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。
“贡献” 是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。
“贡献者” 是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。
“法人实体” 是指提交贡献的机构及其“关联实体”。
“关联实体” 是指对“本许可证”下的行为方而言控制、受控制或与其共同受控制的机构此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。
1. 授予版权许可
每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。
2. 授予专利许可
每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。
3. 无商标许可
“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可但您为满足第4条规定的声明义务而必须使用除外。
4. 分发限制
您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。
5. 免责声明与责任限制
“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。
6. 语言
“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。
条款结束
如何将木兰宽松许可证第2版应用到您的软件
如果您希望将木兰宽松许可证第2版应用到您的新软件为了方便接收者查阅建议您完成如下三步
1 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字;
2 请您在软件包的一级目录下创建以“LICENSE”为名的文件将整个许可证文本放入该文件中
3 请将如下声明文本放入每个源文件的头部注释中。
Copyright (c) [Year] [name of copyright holder]
[Software Name] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
Mulan Permissive Software LicenseVersion 2
Mulan Permissive Software LicenseVersion 2 (Mulan PSL v2)
January 2020 http://license.coscl.org.cn/MulanPSL2
Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions:
0. Definition
Software means the program and related documents which are licensed under this License and comprise all Contribution(s).
Contribution means the copyrightable work licensed by a particular Contributor under this License.
Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License.
Legal Entity means the entity making a Contribution and all its Affiliates.
Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, control means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity.
1. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not.
2. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken.
3. No Trademark License
No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in section 4.
4. Distribution Restriction
You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software.
5. Disclaimer of Warranty and Limitation of Liability
THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW ITS CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
6. Language
THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL.
END OF THE TERMS AND CONDITIONS
How to Apply the Mulan Permissive Software LicenseVersion 2 (Mulan PSL v2) to Your Software
To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps:
Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner;
Create a file named "LICENSE" which contains the whole context of this License in the first directory of your software package;
Attach the statement to the appropriate annotated syntax at the beginning of each source file.
Copyright (c) [Year] [name of copyright holder]
[Software Name] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.

5169
README.md

File diff suppressed because it is too large Load Diff

5062
api_document.md Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

View File

@ -0,0 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

View File

@ -0,0 +1,3 @@
// Place all the styles related to the admins/faqs controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

View File

@ -0,0 +1,3 @@
// Place all the styles related to the helps/faqs controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

View File

@ -110,33 +110,33 @@ class AccountsController < ApplicationController
# params[:login] 邮箱或者手机号
# params[:code] 验证码
# code_type 1注册手机验证码 8邮箱注册验证码
# 本地forge注册入口
def register
begin
# 查询验证码是否正确;type只可能是1或者8
type = phone_mail_type(params[:login].strip)
code = params[:code].strip
# code = params[:code].strip
if type == 1
uid_logger("start register by phone: type is #{type}")
pre = 'p'
email = nil
phone = params[:login]
verifi_code = VerificationCode.where(phone: phone, code: code, code_type: 1).last
# verifi_code = VerificationCode.where(phone: phone, code: code, code_type: 1).last
# TODO: 暂时限定邮箱注册
return normal_status(-1, '只支持邮箱注册')
else
uid_logger("start register by email: type is #{type}")
pre = 'm'
email = params[:login]
phone = nil
verifi_code = VerificationCode.where(email: email, code: code, code_type: 8).last
return normal_status(-1, "该邮箱已注册") if User.exists?(mail: params[:login])
return normal_status(-1, "邮箱格式错误") unless params[:login] =~ CustomRegexp::EMAIL
# verifi_code = VerificationCode.where(email: email, code: code, code_type: 8).last
end
uid_logger("start register: verifi_code is #{verifi_code}, code is #{code}, time is #{Time.now.to_i - verifi_code.try(:created_at).to_i}")
# uid_logger("start register: verifi_code is #{verifi_code}, code is #{code}, time is #{Time.now.to_i - verifi_code.try(:created_at).to_i}")
# check_code = (verifi_code.try(:code) == code.strip && (Time.now.to_i - verifi_code.created_at.to_i) <= 10*60)
# todo 上线前请删除万能验证码"513231"
unless code == "513231" && request.subdomain == "test-newweb"
return normal_status(-2, "验证码不正确") if verifi_code.try(:code) != code.strip
return normal_status(-2, "验证码已失效") if !verifi_code&.effective?
end
return normal_status(-1, "8~16位密码支持字母数字和符号") unless params[:password] =~ CustomRegexp::PASSWORD
code = generate_identifier User, 8, pre
@ -146,23 +146,20 @@ class AccountsController < ApplicationController
# 现在因为是验证码,所以在注册的时候就可以激活
@user.activate
# 必须要用save操作密码的保存是在users中
if @user.save!
# todo user_extension
UserExtension.create!(user_id: @user.id)
# 注册完成手机号或邮箱想可以奖励500金币
# RewardGradeService.call(
# @user,
# container_id: @user.id,
# container_type: pre == 'p' ? 'Phone' : 'Mail',
# score: 500
# )
# 注册时,记录是否是引流用户
ip = request.remote_ip
ua = UserAgent.find_by_ip(ip)
ua.update_column(:agent_type, UserAgent::USER_REGISTER) if ua
successful_authentication(@user)
# session[:user_id] = @user.id
normal_status("注册成功")
interactor = Gitea::RegisterInteractor.call({username: login, email: email, password: params[:password]})
if interactor.success?
gitea_user = interactor.result
result = Gitea::User::GenerateTokenService.new(login, params[:password]).call
@user.gitea_token = result['sha1']
@user.gitea_uid = gitea_user[:body]['id']
if @user.save!
UserExtension.create!(user_id: @user.id)
successful_authentication(@user)
normal_status("注册成功")
end
else
tip_exception(-1, interactor.error)
end
rescue Exception => e
uid_logger_error(e.message)
@ -172,6 +169,7 @@ class AccountsController < ApplicationController
# 用户登录
def login
Users::LoginForm.new(account_params).validate!
@user = User.try_to_login(params[:login], params[:password])
return normal_status(-2, "错误的账号或密码") if @user.blank?
@ -198,6 +196,25 @@ class AccountsController < ApplicationController
# session[:user_id] = @user.id
end
def change_password
@user = User.find_by(login: params[:login])
return render_error("未找到相关用户!") if @user.blank?
return render_error("旧密码不正确") unless @user.check_password?(params[:old_password])
sync_params = {
password: params[:password].to_s,
email: @user.mail
}
interactor = Gitea::User::UpdateInteractor.call(@user.login, sync_params)
if interactor.success?
@user.update_attribute(:password, params[:password])
render_ok
else
render_error(interactor.error)
end
end
# 忘记密码
def reset_password
begin
@ -348,4 +365,7 @@ class AccountsController < ApplicationController
params.require(:user).permit(:login, :email, :phone)
end
def account_params
params.require(:account).permit(:login, :password)
end
end

View File

@ -32,7 +32,7 @@ class Admins::AuthSchoolsController < Admins::BaseController
def search_manager
school = School.find_by(id: params[:school_id])
user_ids = school&.ec_school_users&.pluck(:user_id)
@users = User.where.not(id: user_ids).where("concat(lastname, firstname) like ?", "%#{params[:name].strip.to_s}%").limit(10)
@users = User.where.not(id: user_ids).where("CONCAT(lastname, firstname) like ? OR nickname like ?", "%#{params[:name].strip.to_s}%", "%#{params[:name].strip.to_s}%").limit(10)
end
# 添加认证学校管理员

View File

@ -0,0 +1,58 @@
class Admins::FaqsController < Admins::BaseController
before_action :find_faq, only: [:edit,:update, :destroy]
def index
sort_by = Faq.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'updated_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
keyword = params[:keyword].to_s.strip
collection = Faq.search_question(keyword).order("#{sort_by} #{sort_direction}")
@faqs = paginate collection
end
def new
@faq = Faq.new
end
def edit
end
def update
begin
@faq.update!(faq_params)
flash[:success] = '修改成功'
rescue Exception
flash[:danger] = @faq.errors.full_messages.to_sentence
end
redirect_to admins_faqs_path
end
def destroy
@faq.destroy
redirect_to admins_faqs_path
flash[:success] = "删除成功"
end
def create
@faq = Faq.new(faq_params)
begin
@faq.save!
flash[:success] = '创建成功'
rescue Exception
flash[:danger] = @faq.errors.full_messages.to_sentence
end
redirect_to admins_faqs_path
end
private
def find_faq
@faq = Faq.find params[:id]
end
def faq_params
params.require(:faq).permit(:question, :url)
end
end

View File

@ -6,6 +6,12 @@ class Admins::LaboratoriesController < Admins::BaseController
@laboratories = paginate laboratories.preload(:laboratory_users)
end
def new
respond_to do |format|
format.js
end
end
def create
Admins::CreateLaboratoryService.call(create_params)
render_ok
@ -27,7 +33,7 @@ class Admins::LaboratoriesController < Admins::BaseController
keyword = params[:keyword].to_s.strip
if keyword.present?
like_sql = 'shixuns.name LIKE :keyword OR CONCAT(users.lastname, users.firstname) LIKE :keyword '\
'OR mirror_repositories.name LIKE :keyword'
'users.nickname LIKE :keyword OR mirror_repositories.name LIKE :keyword'
shixuns = shixuns.joins(:user, :mirror_repositories).where(like_sql, keyword: "%#{keyword}%")
end
@ -42,7 +48,7 @@ class Admins::LaboratoriesController < Admins::BaseController
keyword = params[:keyword].to_s.strip
if keyword.present?
like_sql = 'subjects.name LIKE :keyword OR CONCAT(users.lastname, users.firstname) LIKE :keyword'
like_sql = 'subjects.name LIKE :keyword OR CONCAT(users.lastname, users.firstname) LIKE :keyword OR users.nickname LIKE :keyword'
subjects = subjects.joins(:user).where(like_sql, keyword: "%#{keyword}%")
end

View File

@ -1,4 +1,11 @@
class Admins::LaboratorySettingsController < Admins::BaseController
def new
respond_to do |format|
format.js
end
end
def show
@laboratory = current_laboratory
end

View File

@ -3,8 +3,8 @@ class Admins::ProjectCategoriesController < Admins::BaseController
before_action :validate_names, only: [:create, :update]
def index
sort_by = params[:sort_by] ||= 'created_at'
sort_direction = params[:sort_direction] ||= 'desc'
sort_by = ProjectCategory.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
q = ProjectCategory.ransack(name_cont: params[:name])
project_categories = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
@project_categories = paginate(project_categories)

View File

@ -3,8 +3,8 @@ class Admins::ProjectIgnoresController < Admins::BaseController
before_action :validate_params, only: [:create, :update]
def index
sort_by = params[:sort_by] ||= 'created_at'
sort_direction = params[:sort_direction] ||= 'desc'
sort_by = Ignore.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
q = Ignore.ransack(name_cont: params[:search])
project_ignores = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
@project_ignores = paginate(project_ignores)

View File

@ -3,8 +3,8 @@ class Admins::ProjectLanguagesController < Admins::BaseController
before_action :validate_names, only: [:create, :update]
def index
sort_by = params[:sort_by] ||= 'created_at'
sort_direction = params[:sort_direction] ||= 'desc'
sort_by = ProjectLanguage.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
q = ProjectLanguage.ransack(name_cont: params[:search])
project_languages = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
@project_languages = paginate(project_languages)

View File

@ -3,8 +3,8 @@ class Admins::ProjectLicensesController < Admins::BaseController
before_action :validate_params, only: [:create, :update]
def index
sort_by = params[:sort_by] ||= 'created_at'
sort_direction = params[:sort_direction] ||= 'desc'
sort_by = License.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
q = License.ransack(name_cont: params[:search])
project_licenses = q.result(distinct: true).order("#{sort_by} #{sort_direction}")
@project_licenses = paginate(project_licenses)

View File

@ -1,9 +1,8 @@
class Admins::ProjectsController < Admins::BaseController
def index
sort_by = params[:sort_by] ||= 'created_on'
sort_direction = params[:sort_direction] ||= 'desc'
sort_by = Project.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_on'
sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
search = params[:search].to_s.strip
projects = Project.where("name like ?", "%#{search}%").order("#{sort_by} #{sort_direction}")
@projects = paginate projects.includes(:owner, :members, :issues, :versions, :attachments, :project_score)

View File

@ -28,7 +28,7 @@ class ApplicationController < ActionController::Base
DCODES = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z)
OPENKEY = "79e33abd4b6588941ab7622aed1e67e8"
helper_method :current_user
helper_method :current_user, :base_url
# 所有请求必须合法签名
def check_sign
@ -343,7 +343,8 @@ class ApplicationController < ActionController::Base
elsif params[:debug] == 'student'
User.current = User.find 8686
elsif params[:debug] == 'admin'
user = User.find 1
logger.info "@@@@@@@@@@@@@@@@@@@@@@ debug mode....."
user = User.find 36480
User.current = user
cookies.signed[:user_id] = user.id
end
@ -384,11 +385,7 @@ class ApplicationController < ActionController::Base
end
def current_user
if Rails.env.development?
User.current = User.find 1
else
User.current
end
User.current
end
## 默认输出json
@ -618,8 +615,8 @@ class ApplicationController < ActionController::Base
end
# 排序
rorder = option[:order] || "updated_at"
b_order = option[:b_order] || "desc"
rorder = UserExtension.column_names.include?(option[:order]) ? option[:order] : "updated_at"
b_order = %w(desc asc).include?(option[:b_order]) ? option[:b_order] : "desc"
if rorder == "created_at" || rorder == "work_score"
work_list = work_list.order("graduation_works.#{rorder} #{b_order}")
elsif rorder == "student_id"
@ -683,6 +680,14 @@ class ApplicationController < ActionController::Base
relation.page(page).per(limit)
end
def kaminari_array_paginate(relation)
limit = params[:limit] || params[:per_page]
limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i
page = params[:page].to_i.zero? ? 1 : params[:page].to_i
Kaminari.paginate_array(relation).page(page).per(limit)
end
def strf_time(time)
time.blank? ? '' : time.strftime("%Y-%m-%d %H:%M:%S")
end
@ -744,7 +749,7 @@ class ApplicationController < ActionController::Base
namespace = params[:owner]
id = params[:repo] || params[:id]
@project = Project.find_with_namespace(namespace, id)
@project, @owner = Project.find_with_namespace(namespace, id)
if @project and current_user.can_read_project?(@project)
logger.info "########### has project and can read project"
@ -762,9 +767,33 @@ class ApplicationController < ActionController::Base
end
def load_repository
@repository ||= load_project.repository
@repository ||= load_project&.repository
end
def base_url
request.base_url
end
def convert_image!
@image = params[:image] || user_params[:image]
return unless @image.present?
max_size = EduSetting.get('upload_avatar_max_size') || 2 * 1024 * 1024 # 2M
if @image.class == ActionDispatch::Http::UploadedFile
render_error('请上传文件') if @image.size.zero?
render_error('文件大小超过限制') if @image.size > max_size.to_i
else
image = @image.to_s.strip
return render_error('请上传正确的图片') if image.blank?
@image = Util.convert_base64_image(image, max_size: max_size.to_i)
end
rescue Base64ImageConverter::Error => ex
render_error(ex.message)
end
def avatar_path(object)
ApplicationController.helpers.disk_filename(object.class, object.id)
end
private
def object_not_found
uid_logger("Missing template or cant't find record, responding with 404")

View File

@ -0,0 +1,13 @@
class AppliedProjectsController < ApplicationController
before_action :require_login
def create
@applied_project = Projects::ApplyJoinService.call(current_user, applied_params)
rescue Projects::ApplyJoinService::Error => ex
render_error(ex.message)
end
private
def applied_params
params.require(:applied_project).permit(:code, :role)
end
end

View File

@ -28,8 +28,8 @@ class AttachmentsController < ApplicationController
update_downloads(@file)
end
def get_file
def get_file
normal_status(-1, "参数缺失") if params[:download_url].blank?
url = URI.encode(params[:download_url].to_s.gsub("http:", "https:"))
response = Faraday.get(url)
@ -45,7 +45,7 @@ class AttachmentsController < ApplicationController
uid_logger("#########################file_params####{params["#{params[:file_param_name]}"]}")
raise "未上传文件" unless upload_file
folder = edu_setting('attachment_folder')
folder = file_storage_directory
raise "存储目录未定义" unless folder.present?
month_folder = current_month_folder
@ -108,7 +108,7 @@ class AttachmentsController < ApplicationController
end
# 附件为视频时,点击播放
def preview_attachment
def preview_attachment
attachment = Attachment.find_by(id: params[:id])
dir_path = "#{Rails.root}/public/preview"
Dir.mkdir(dir_path) unless Dir.exist?(dir_path)
@ -118,10 +118,10 @@ class AttachmentsController < ApplicationController
else
normal_status(-1, "出现错误,请稍后重试")
end
else
else
if system("rm -rf #{dir_path}/#{attachment.disk_filename}")
normal_status(1, "操作成功")
else
else
normal_status(-1, "出现错误,请稍后重试")
end
end

View File

@ -0,0 +1,76 @@
class Ci::BaseController < ApplicationController
include Ci::DbConnectable
before_action :require_login
before_action :connect_to_ci_db
def load_repo
namespace = params[:owner]
id = params[:repo] || params[:id]
@ci_user, @repo = Ci::Repo.find_with_namespace(namespace, id)
end
def load_all_repo
namespace = current_user.login
@repos = Ci::Repo.find_all_with_namespace(namespace)
end
def load_repo_by_repo_slug(slug)
@repo_slug = Ci::Repo.load_repo_by_repo_slug(slug)
end
private
def authorize_access_project!
unless @project.manager?(current_user)
return render_forbidden
end
end
def authenticate_manager!
unless @project.manager?(current_user)
return render_forbidden
end
end
def authenticate_admin!
return render_forbidden unless current_user.admin?
end
def authorize_owner!
unless @project.owner?(current_user)
return render_forbidden
end
end
def find_cloud_account
@cloud_account ||= current_user.ci_cloud_account
@cloud_account.blank? ? nil : @cloud_account
end
def load_ci_user
@ci_user ||= Ci::User.find_by(user_login: params[:owner])
@ci_user.blank? ? raise("未找到相关的记录") : @ci_user
end
def connect_to_ci_db(options={})
current = current_user
owner = params[:owner]
if owner
current = User.find_by(login: owner)
end
if !(current && !current.is_a?(AnonymousUser) && !current.devops_uninit?)
return
end
if current.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
connect_to_trustie_ci_database(options)
else
options = options.merge(db_name: current.login)
connect_to_ci_database(options)
end
end
end

View File

@ -0,0 +1,53 @@
class Ci::BuildsController < Ci::BaseController
include RepositoriesHelper
before_action :load_project
before_action :authorize_owner!, only: [:restart, :stop]
before_action :load_repo
before_action :find_cloud_account, except: [:index, :show]
def index
@user = current_user
scope = Ci::Builds::ListQuery.call(@repo, params)
@total_count = scope.map(&:build_id).size
@builds = paginate scope
end
def show
@build = @repo.builds.includes(stages: [:steps]).find_by(build_number: params[:build])
end
def restart
result = Ci::Drone::API.new(@ci_user.user_hash, @cloud_account.drone_url, @repo.repo_namespace, @repo.repo_name, number: params[:build]).restart
render json: result
end
def stop
result = Ci::Drone::API.new(@ci_user.user_hash, @cloud_account.drone_url, @repo.repo_namespace, @repo.repo_name, number: params[:build]).stop
render json: result
end
def logs
# TODO **待优化**
# 因直接操作ci库如下查询待优化可直接根据log id查询即可
build = @repo.builds.find_by(build_number: params[:build])
return render_not_found("Couldn't found build with 'number'= #{params[:build]}") if build.blank?
stage = build.stages.includes(steps: [:log]).find_by(stage_number: params[:stage])
return render_not_found("Couldn't found build with 'number'= #{params[:stage]}") if stage.blank?
step = stage.steps.find_by(step_number: params[:step])
return render_not_found("Couldn't found build with 'number'= #{params[:step]}") if step.blank?
log = step.log
result = log.blank? ? nil : (log.log_data[0..5].include?('null') ? nil : JSON.parse(log.log_data))
# result = Ci::Drone::API.new(@user.user_hash, @cloud_account.drone_url, @repo.repo_namespace, @repo.repo_name, build: params[:build], stage: params[:stage], step: params[:step]).logs
render json: result
end
end

View File

@ -0,0 +1,129 @@
class Ci::CloudAccountsController < Ci::BaseController
include Ci::CloudAccountManageable
skip_before_action :connect_to_ci_db, only: %i[create bind trustie_bind]
before_action :load_project, only: %i[create activate]
before_action :authorize_owner!, only: %i[create activate]
before_action :load_repo, only: %i[activate]
before_action :load_all_repo, only: %i[unbind]
before_action :find_cloud_account, only: %i[show oauth_grant]
before_action :validate_params!, only: %i[create bind]
before_action only: %i[create bind] do
connect_to_ci_database(master_db: true)
end
def create
flag, msg = check_bind_cloud_account!
return render_error(msg) if flag === true
ActiveRecord::Base.transaction do
@cloud_account = bind_account!
if @cloud_account.blank?
render_error('激活失败, 请检查你的云服务器信息是否正确.')
raise ActiveRecord::Rollback
else
current_user.set_drone_step!(User::DEVOPS_UNVERIFIED)
render_ok(redirect_url: @cloud_account.authenticate_url)
end
end
rescue Exception => ex
render_error(ex.message)
end
def activate
return render_error('请先认证') unless current_user.ci_certification?
begin
@cloud_account = Ci::CloudAccount.find params[:id]
ActiveRecord::Base.transaction do
if @repo
return render_error('该项目已经激活') if @repo.repo_active?
@repo.activate!(@project)
else
@repo = Ci::Repo.auto_create!(@ci_user, @project)
@user.update_column(:user_syncing, false)
end
result = bind_hook!(current_user, @cloud_account, @repo)
@project.update_columns(open_devops: true, gitea_webhook_id: result['id'])
@cloud_account.update_column(:ci_user_id, @ci_user.user_id)
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
end
def show
end
def bind
flag, msg = check_bind_cloud_account!
return render_error(msg) if flag === true
ActiveRecord::Base.transaction do
@cloud_account = bind_account!
if @cloud_account.blank?
render_error('激活失败, 请检查你的云服务器信息是否正确.')
raise ActiveRecord::Rollback
else
current_user.set_drone_step!(User::DEVOPS_UNVERIFIED)
end
end
rescue Exception => ex
render_error(ex.message)
end
def trustie_bind
account = params[:account].to_s
return render_error("account不能为空.") if account.blank?
flag, msg = check_trustie_bind_cloud_account!
return render_error(msg) if flag === true
ActiveRecord::Base.transaction do
@cloud_account = trustie_bind_account!
if @cloud_account.blank?
render_error('激活失败, 请检查你的云服务器信息是否正确.')
raise ActiveRecord::Rollback
else
current_user.set_drone_step!(User::DEVOPS_UNVERIFIED)
end
end
rescue Exception => ex
render_error(ex.message)
end
def unbind
ActiveRecord::Base.transaction do
if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
if @repos
@repos.each do |repo|
repo.deactivate!
end
end
end
unbind_account!
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def oauth_grant
password = params[:password].to_s
return render_error('你输入的密码不正确.') unless current_user.check_password?(password)
oauth = current_user.oauths.last
return render_error("服务器出小差了.") if oauth.blank?
result = gitea_oauth_grant!(password, oauth)
return render_error('授权失败.') unless result === true
current_user.set_drone_step!(User::DEVOPS_CERTIFICATION)
end
private
def validate_params!
Ci::CreateCloudAccountForm.new(devops_params).validate!
end
end

View File

@ -0,0 +1,20 @@
class Ci::LanguagesController < Ci::BaseController
# TODO 需要开启权限认证只有该项目devops初始化成功后才能获取语言列表
before_action :find_langugae, only: :show
def index
@languages = Ci::Language.by_usage_amount_desc
end
def show
end
def common
@languages = Ci::Language.six_common
end
private
def find_langugae
@language = Ci::Language.find params[:id]
end
end

View File

@ -0,0 +1,294 @@
class Ci::PipelinesController < Ci::BaseController
before_action :require_login, only: %i[list create content]
skip_before_action :connect_to_ci_db, except: %i[list create destroy content]
before_action :load_project, only: %i[create content]
before_action :load_repo, only: %i[create content]
# ======流水线相关接口========== #
def list
@result = Array.new
list = Ci::Pipeline.where('identifier=? and owner=?', params[:identifier], params[:owner])
# 查询build状态
list.collect do |pipeline|
pipeline.last_build_time = nil
repo = load_repo_by_repo_slug("#{pipeline.owner}/#{pipeline.identifier}")
if repo
build = repo.builds.order("build_created desc").find_by(build_target: pipeline.branch)
if build
pipeline.pipeline_status = build.build_status
pipeline.last_build_time = Time.at(build.build_created)
end
end
@result.push(pipeline)
end
@total_count = @result.size
@pipelines = paginate @result
end
def create
ActiveRecord::Base.transaction do
size = Ci::Pipeline.where('branch=? and identifier=? and owner=?', params[:branch], params[:repo], params[:owner]).size
if size > 0
render_error("#{params[:branch]}分支已经存在流水线!")
return
end
pipeline = Ci::Pipeline.new(pipeline_name: params[:pipeline_name], file_name: params[:file_name],owner: params[:owner],
login: current_user.login, identifier: params[:repo], branch: params[:branch], event: params[:event])
pipeline.save!
# 默认创建四个初始阶段
init_stages = Ci::PipelineStage::INIT_STAGES
index = 1
init_stages.each do |type, name|
pipeline.pipeline_stages.build(
stage_name: name,
stage_type: type,
show_index: index
).save!
index += 1
end
create_pipeline_file(pipeline)
create_ci_repo(pipeline)
render_ok({id: pipeline.id})
end
rescue Exception => ex
render_error(ex.message)
end
# 在代码库创建文件
def create_pipeline_file(pipeline)
sha = get_pipeline_file_sha(pipeline.file_name, pipeline.branch)
if sha
logger.info "#{pipeline.file_name}已存在"
else
interactor = Gitea::CreateFileInteractor.call(current_user.gitea_token, @owner.login, content_params)
if interactor.success?
logger.info "#{pipeline.file_name}创建成功"
end
end
end
# 在drone数据库repo表新增一条repo记录
def create_ci_repo(pipeline)
if pipeline.branch != 'master'
create_params = {
repo_user_id: @ci_user.user_id,
repo_namespace: @project.owner.login,
repo_name: @project.identifier,
repo_slug: "#{@project.owner.login}/#{@project.identifier}-" + pipeline.id.to_s,
repo_clone_url: @project.repository.url,
repo_branch: pipeline.branch,
repo_config: pipeline.file_name
}
repo = Ci::Repo.create_repo(create_params)
repo
end
nil
end
def get_pipeline_file_sha(file_name, branch)
file_path_uri = URI.parse(file_name)
interactor = Repositories::EntriesInteractor.call(@project.owner, @project.identifier, file_path_uri, ref: branch || 'master')
if interactor.success?
file = interactor.result
file['sha']
end
end
def content_params
{
filepath: params[:file_name],
branch: params[:branch],
new_branch: params[:new_branch],
content: "#pipeline \n",
message: 'create pipeline',
committer: {
email: current_user.mail,
name: current_user.login
},
identifier: params[:repo]
}
end
def update
pipeline = Ci::Pipeline.find(params[:id])
if pipeline
pipeline.update!(pipeline_name: params[:pipeline_name],branch: params[:branch], event: params[:event])
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
def destroy
pipeline = Ci::Pipeline.find(params[:id])
if pipeline
repo = load_repo_by_repo_slug("#{pipeline.login}/#{pipeline.identifier}-" + pipeline.id.to_s)
if repo
repo.destroy!
end
pipeline.destroy!
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
def content
@yaml = "\n"
pipeline = Ci::Pipeline.find(params[:id])
stages = pipeline.pipeline_stages
if stages && !stages.empty?
init_step = stages.first.pipeline_stage_steps.first
@yaml += init_step.content + "\n" + "steps:\n"
stages = stages.slice(1, stages.size - 1)
unless stages.empty?
stages.each do |stage|
steps = stage.pipeline_stage_steps
next unless steps && !steps.empty?
steps.each do |step|
@yaml += step.content + "\n"
end
end
end
end
@sha = get_pipeline_file_sha(pipeline.file_name, pipeline.branch)
trigger = ''
trigger += " branch:\r\n - #{pipeline.branch}\r\n" unless pipeline.branch.blank?
unless pipeline.event.blank?
trigger += " event:\r\n"
pipeline.event.split(',').each { |event| trigger += " - #{event}\r\n"}
end
@yaml += "trigger:\r\n" + trigger unless trigger.blank?
@branch = pipeline.branch
end
# =========阶段相关接口========= #
def stages
pipeline_id = params[:id]
@pipeline_name = Ci::Pipeline.find(pipeline_id).pipeline_name
@pipeline_stages = Ci::PipelineStage.where('pipeline_id=?', pipeline_id).order('show_index asc')
end
def create_stage
ActiveRecord::Base.transaction do
# 修改stage排序
update_stage_index(params[:id], params[:show_index], 1)
pipeline_stage = Ci::PipelineStage.new(stage_name: params[:stage_name],
stage_type: params[:stage_type].blank? ? 'customize' : params[:stage_type],
pipeline_id: params[:id], show_index: params[:show_index])
pipeline_stage.save!
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def update_stage
pipeline_stage = Ci::PipelineStage.find(params[:stage_id])
if pipeline_stage
pipeline_stage.update!(stage_name: params[:stage_name])
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
def delete_stage
ActiveRecord::Base.transaction do
update_stage_index(params[:id], params[:show_index].to_i, -1)
pipeline_stage = Ci::PipelineStage.find(params[:stage_id])
if pipeline_stage
pipeline_stage.destroy!
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def update_stage_index(pipeline_id, show_index, diff)
stages = Ci::Pipeline.find(pipeline_id).pipeline_stages
stages.each do |stage|
if stage.show_index >= show_index
stage.update!(show_index: stage.show_index + diff)
end
end
end
# ========步骤相关接口========= #
def steps
@stage_type = Ci::PipelineStage.find(params[:stage_id]).stage_type
@pipeline_stage_steps = Ci::PipelineStageStep.where('stage_id=?', params[:stage_id]).order('show_index asc')
end
def stage_step
ActiveRecord::Base.transaction do
steps = params[:steps]
unless steps.empty?
steps.each do |step|
unless step[:template_id]
render_error('请选择模板!')
return
end
if !step[:id]
step = Ci::PipelineStageStep.new(step_name: step[:step_name], stage_id: params[:stage_id],
template_id: step[:template_id], content: step[:content], show_index: step[:show_index])
step.save!
else
pipeline_stage_step = Ci::PipelineStageStep.find(step[:id])
pipeline_stage_step.update(step_name: step[:step_name], content: step[:content],
show_index: step[:show_index], template_id: step[:template_id])
end
end
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def create_stage_step
ActiveRecord::Base.transaction do
steps = params[:steps]
unless steps.empty?
steps.each do |step|
step = Ci::PipelineStageStep.new(step_name: step[:step_name], stage_id: params[:stage_id],
template_id: step[:template_id], content: step[:content], show_index: step[:show_index])
step.save!
end
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def update_stage_step
ActiveRecord::Base.transaction do
steps = params[:steps]
unless steps.empty?
steps.each do |step|
pipeline_stage_step = Ci::PipelineStageStep.find(step[:id])
if pipeline_stage_step
pipeline_stage_step.update(step_name: step[:step_name], content: step[:content], template_id: step[:template_id])
end
end
end
render_ok
end
rescue Exception => ex
render_error(ex.message)
end
def delete_stage_step
pipeline_stage_step = Ci::PipelineStageStep.find(params[:step_id])
if pipeline_stage_step
pipeline_stage_step.destroy!
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
end

View File

@ -0,0 +1,70 @@
class Ci::ProjectsController < Ci::BaseController
include RepositoriesHelper
include Ci::CloudAccountManageable
before_action :load_project
before_action :load_repo, only: [:update_trustie_pipeline, :activate, :deactivate]
before_action :authorize_owner!, only: [:authorize]
before_action :find_cloud_account, only: [:authorize, :activate, :deactivate]
def authorize
@user = current_user
end
# get .trustie-pipeline.yml file
def get_trustie_pipeline
file_path_uri = URI.parse('.trustie-pipeline.yml')
interactor = Repositories::EntriesInteractor.call(@project.owner, @project.identifier, file_path_uri, ref: params[:ref] || "master")
if interactor.success?
file = interactor.result
return render json: {} if file[:status]
json = {name: file['name'], path: file['path'], sha: file['sha'], content: render_decode64_content(file['content'])}
render json: json
end
end
def update_trustie_pipeline
interactor = Gitea::UpdateFileInteractor.call(current_user.gitea_token, params[:owner], params.merge(identifier: @project.identifier))
if interactor.success?
@file = interactor.result
render_result(1, "更新成功")
else
render_error(interactor.error)
end
end
def activate
return render_error('你还未认证') unless current_user.ci_certification?
begin
ActiveRecord::Base.transaction do
if @repo
return render_error('该项目已经激活') if @repo.repo_active?
@repo.activate!(@project)
return render_ok
else
@repo = Ci::Repo.auto_create!(@ci_user, @project)
@ci_user.update_column(:user_syncing, false)
end
result = bind_hook!(current_user, @cloud_account, @repo)
@project.update_columns(open_devops: true, gitea_webhook_id: result['id'])
@project.increment!(:open_devops_count)
@cloud_account.update_column(:ci_user_id, @ci_user.user_id)
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
end
def deactivate
return render_error('该项目已经取消激活') if !@repo.repo_active?
@project.update_column(:open_devops, false)
@repo.deactivate_repos!
render_ok
end
end

View File

@ -0,0 +1,53 @@
class Ci::SecretsController < Ci::BaseController
before_action :load_repo
# 参数列表
def index
result = Ci::Drone::API.new(@ci_user.user_hash, ci_drone_url, params[:owner], params[:repo], nil).secrets
@secrets = result
end
#新增、更新参数
def create
options = {
name: params[:name],
data: params[:data]
}
id = params[:id]
if id
result = Ci::Drone::API.new(@ci_user.user_hash, ci_drone_url, params[:owner], params[:repo], options).update_secret
if result["id"]
render_ok
else
render_error(result["message"])
end
else
result = Ci::Drone::API.new(@ci_user.user_hash, ci_drone_url, params[:owner], params[:repo], options).create_secret
if result["id"]
render_ok
else
render_error(result["message"])
end
end
end
#删除参数
def destroy
name = params[:name]
if !name.blank?
Ci::Drone::API.new(@ci_user.user_hash, ci_drone_url, params[:owner], params[:repo], {name: name}).delete_secret
render_ok
else
render_error("参数名不能为空")
end
rescue Exception => ex
render_ok
end
def ci_drone_url
user = User.find_by(login: params[:owner])
user&.ci_cloud_account.drone_url
end
end

View File

@ -0,0 +1,104 @@
class Ci::TemplatesController < Ci::BaseController
before_action :require_login, only: %i[list create]
skip_before_action :connect_to_ci_db
#======模板管理======#
def list
stage_type = params[:stage_type]
template_name = params[:name]
templates = template_name.blank? ? Ci::Template.all : Ci::Template.where("template_name like ?", "%#{template_name}%")
templates = templates.select{ |template| template.login == current_user.login} unless current_user.admin?
if !stage_type.blank? && stage_type != 'all'
templates = templates.select{ |template| template.stage_type == stage_type}
end
@total_count = templates.map(&:id).count
@templates = paginate templates
end
def show
@template = Ci::Template.find(params[:id])
end
def create
stage_type = params[:stage_type]
category = params[:category]
if category.blank?
category = Ci::Template::STAGE_TYPES[:"#{stage_type}"]
end
if params[:id]
template = Ci::Template.find(params[:id])
if template
template.update!(template_name: params[:template_name],
stage_type: stage_type,
category: category,
parent_category: Ci::Template::STAGE_TYPES[:"#{stage_type}"],
content: params[:content],
login: current_user.admin? ? 'admin' : current_user.login
)
end
else
template = Ci::Template.new(template_name: params[:template_name],
stage_type: stage_type,
category: category,
parent_category: Ci::Template::STAGE_TYPES[:"#{stage_type}"],
content: params[:content],
login: current_user.admin? ? 'admin' : current_user.login
)
template.save!
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
def update
template = Ci::Template.find(params[:id])
template.update!(template_name: params[:template_name],
stage_type: params[:stage_type],
category: params[:category],
parent_category: params[:parent_category],
content: params[:content]
)
render_ok
rescue Exception => ex
render_error(ex.message)
end
def destroy
template = Ci::Template.find(params[:id])
if template
template.destroy!
end
render_ok
rescue Exception => ex
render_error(ex.message)
end
#======流水线模板查询=====#
def templates_by_stage
stage_type = params[:stage_type]
if stage_type != Ci::PipelineStage::CUSTOMIZE_STAGE_TYPE
@templates = Ci::Template.where("stage_type = ?", stage_type)
@templates = @templates.select{ |template| template.login == current_user.login || template.login == 'admin'} unless current_user.admin?
if stage_type == Ci::PipelineStage::INIT_STAGE_TYPE && !@templates.nil?
@templates.each do |template|
content = template.content
unless content.blank?
pipeline = Ci::Pipeline.find(params[:id])
template.content = content.gsub(/{name}/, pipeline.pipeline_name) unless pipeline.nil?
end
end
end
# 根据模板类别分组
@category_templates = @templates.group_by{ |template| template.category }
else
# 自定义阶段,按阶段分类分类返回模板列表
@templates = Ci::Template.where("stage_type != ?", Ci::PipelineStage::INIT_STAGE_TYPE)
@templates = @templates.select{ |template| template.login == current_user.login || template.login == 'admin'} unless current_user.admin?
@category_templates = @templates.group_by{ |template| template.parent_category }
end
end
end

View File

@ -0,0 +1,31 @@
class CompareController < ApplicationController
# skip_before_action :require_login
before_action :load_repository
def index
end
def show
compare
end
private
def compare
base, head = compare_params
# TODO: 处理fork的项目向源项目发送PR的base、head参数问题
@compare_result ||=
head.include?(":") ? gitea_compare(base, head) : gitea_compare(head, base)
end
def compare_params
base = Addressable::URI.unescape(params[:base])
head = params[:head].include?('json') ? params[:head]&.split('.json')[0] : params[:head]
[base, head]
end
def gitea_compare(base, head)
Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base, head)
end
end

View File

@ -3,13 +3,12 @@ class ComposesController < ApplicationController
before_action :find_compose, except: [:index, :new,:create]
def index
@order_type = params[:order] || "created_at"
@search_name = params[:search]
composes = Compose.compose_includes
if @search_name.present?
composes = composes.where("title like ?", "%#{@search_name}%")
end
composes = composes.order("#{@order_type} desc")
composes = composes.order("#{order_type} desc")
@page = params[:page] || 1
@limit = params[:limit] || 15
@composes_size = composes.size
@ -96,4 +95,8 @@ class ComposesController < ApplicationController
end
end
def order_type
Compose.column_names.include?(params[:order_type]) ? params[:order_type] : 'created_at'
end
end

View File

@ -0,0 +1,36 @@
module Acceleratorable
extend ActiveSupport::Concern
def enable_accelerator?(clone_addr)
is_foreign_url?(clone_addr) && config_accelerator?
end
def accelerator_url(repo_name)
[accelerator_domain, accelerator_username, "#{repo_name}.git"].join('/')
end
def github_domain
'github.com'
end
def gitlab_domain
'gitlab.com'
end
def accelerator_domain
Gitea.gitea_config[:accelerator]["domain"]
end
def accelerator_username
Gitea.gitea_config[:accelerator]["access_key_id"]
end
def config_accelerator?
Gitea.gitea_config[:accelerator].present?
end
def is_foreign_url?(clone_addr)
clone_addr.include?(github_domain) || clone_addr.include?(gitlab_domain)
end
end

View File

@ -0,0 +1,209 @@
module Ci::CloudAccountManageable
extend ActiveSupport::Concern
included do
end
# 自有服务器绑定流程
def bind_account!
# 1. 保存华为云服务器帐号
create_params = devops_params.merge(ip_num: IPAddr.new(devops_params[:ip_num].strip).to_i, secret: Ci::CloudAccount.encrypted_secret(devops_params[:secret]), server_type: Ci::CloudAccount::SERVER_TYPE_SELF)
cloud_account = Ci::CloudAccount.new(create_params)
cloud_account.user = current_user
cloud_account.save!
# 2. 生成oauth2应用程序的client_id和client_secrete
gitea_oauth = Gitea::Oauth2::CreateService.call(current_user.gitea_token, {name: "pipeline-#{SecureRandom.hex(8)}", redirect_uris: ["#{cloud_account.drone_url}/login"]})
logger.info "######### gitea_oauth: #{gitea_oauth}"
raise 'Gitea接口异常' if gitea_oauth['client_id'].blank?
oauth = Oauth.new(client_id: gitea_oauth['client_id'],
client_secret: gitea_oauth['client_secret'],
redirect_uri: gitea_oauth['redirect_uris'],
gitea_oauth_id: gitea_oauth['id'],
user_id: current_user.id)
oauth.save!
# 创建数据ci端数据库
database_result = auto_create_database!(@connection, "#{current_user.login}_drone")
logger.info "[CI::DbConnectable] auto_create_database's result: #{database_result}"
# 初始化表结构
sub_connection = connect_to_ci_database
auto_create_table_structure!(sub_connection)
rpc_secret = SecureRandom.hex 16
logger.info "######### rpc_secret: #{rpc_secret}"
# 3. 创建drone server
drone_server_cmd = Ci::Drone::Server.new(current_user.login, oauth.client_id, oauth.client_secret, cloud_account.drone_host, rpc_secret).generate_cmd
logger.info "######### drone_server_cmd: #{drone_server_cmd}"
# 4. 创建drone client
drone_client_cmd = Ci::Drone::Client.new(oauth.client_id, cloud_account.drone_ip, rpc_secret).generate_cmd
logger.info "######### drone_client_cmd: #{drone_client_cmd}"
# 5. 登录远程服务器启动drone服务
result = Ci::Drone::Start.new(cloud_account.account, cloud_account.visible_secret, cloud_account.drone_ip, drone_server_cmd, drone_client_cmd).run
logger.info "######### result: #{result}"
redirect_url = "#{cloud_account.drone_url}/login"
logger.info "######### redirect_url: #{redirect_url}"
return nil unless result.present?
result && !result.blank? ? cloud_account : nil
end
def trustie_drone_server_config
# 读取drone配置信息
config = Rails.application.config_for(:configuration).symbolize_keys!
trustie_drone_config = config[:trustie_drone].symbolize_keys!
return trustie_drone_config
end
# trustie提供服务器,绑定流程
def trustie_bind_account!
trustie_drone_config = trustie_drone_server_config
raise 'trustie_drone config missing' if trustie_drone_config.blank?
# 创建云账号
create_params = devops_params.merge(ip_num: IPAddr.new(trustie_drone_config[:ip_num].strip).to_i, secret: Ci::CloudAccount.encrypted_secret(trustie_drone_config[:secret]), server_type: Ci::CloudAccount::SERVER_TYPE_TRUSTIE)
cloud_account = Ci::CloudAccount.new(create_params)
cloud_account.user = current_user
cloud_account.save!
#生成oauth2应用程序的client_id和client_secrete
gitea_oauth = Gitea::Oauth2::CreateService.call(current_user.gitea_token, {name: "pipeline-#{SecureRandom.hex(8)}", redirect_uris: ["#{cloud_account.drone_url}/login"]})
logger.info "######### gitea_oauth: #{gitea_oauth}"
raise 'Gitea接口异常' if gitea_oauth['client_id'].blank?
oauth = Oauth.new(client_id: gitea_oauth['client_id'],
client_secret: gitea_oauth['client_secret'],
redirect_uri: gitea_oauth['redirect_uris'],
gitea_oauth_id: gitea_oauth['id'],
user_id: current_user.id)
result = oauth.save!
redirect_url = "#{cloud_account.drone_url}/login"
logger.info "######### redirect_url: #{redirect_url}"
return nil unless result.present?
result ? cloud_account : nil
end
def unbind_account!
cloud_account = current_user.ci_cloud_account
return render_error('你未绑定CI服务器') if current_user.devops_step == User::DEVOPS_UNINIT || cloud_account.blank?
if cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_SELF
@connection.execute("DROP DATABASE IF EXISTS #{current_user.login}_drone") # TOTO drop drone database
end
cloud_account.destroy! unless cloud_account.blank?
current_user.unbind_account!
end
def bind_hook!(user, cloud_account, repo)
hook_params = {
active: true,
config: {
content_type: "json",
url: cloud_account.drone_url + "/hook?secret=#{repo.repo_signer}"
},
type: "gitea"
}
result = Gitea::Hooks::CreateService.call(user.gitea_token, user.login, repo.repo_name, hook_params)
result[:status].present? ? nil : result
end
def check_bind_cloud_account!
return [true, "你已经绑定了云帐号."] unless current_user.ci_cloud_account.blank?
ip_num = IPAddr.new(devops_params[:ip_num]).to_i
#自有服务器进行判断
cloud_account = current_user.ci_cloud_account
if cloud_account && cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_SELF
Ci::CloudAccount.exists?(ip_num: ip_num) ? [true, "#{devops_params[:ip_num]}服务器已被使用."] : [false, nil]
end
end
def check_trustie_bind_cloud_account!
return [true, "你已经绑定了云帐号."] unless current_user.ci_cloud_account.blank?
end
def gitea_auto_create_auth_grant!(gitea_oauth_id)
connection = Gitea::Database.set_connection.connection
unix_time = Time.now.to_i
# 目前直接操作db可以建立对应的model进行操作
sql = "REPLACE INTO oauth2_grant ( user_id, application_id, counter, created_unix, updated_unix ) VALUES ( #{current_user.gitea_uid}, #{gitea_oauth_id}, 0, #{unix_time}, #{unix_time} );"
connection.execute(sql)
#如果使用trustie提供的服务器需要多增加一条授权信息
if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
trustie_drone_config = trustie_drone_server_config
admin_application_id = trustie_drone_config[:admin_application_id]
sql = "REPLACE INTO oauth2_grant ( user_id, application_id, counter, created_unix, updated_unix ) VALUES ( #{current_user.gitea_uid}, #{admin_application_id}, 0, #{unix_time}, #{unix_time} );"
connection.execute(sql)
end
end
def gitea_oauth_grant!(password, oauth)
gitea_auto_create_auth_grant!(oauth&.gitea_oauth_id)
state = SecureRandom.hex(8)
# redirect_uri eg:
# https://localhost:3000/login/oauth/authorize?client_id=94976481-ad0e-4ed4-9247-7eef106007a2&redirect_uri=http%3A%2F%2F121.69.81.11%3A80%2Flogin&response_type=code&state=9cab990b9cfb1805
redirect_uri = CGI.escape("#{@cloud_account.drone_url}/login")
clientId = client_id(oauth)
grant_url = "#{Gitea.gitea_config[:domain]}/login/oauth/authorize?client_id=#{clientId}&redirect_uri=#{redirect_uri}&response_type=code&state=#{state}"
logger.info "[gitea] grant_url: #{grant_url}"
conn = Faraday.new(url: grant_url) do |req|
req.request :url_encoded
req.adapter Faraday.default_adapter
req.basic_auth(current_user.login, password)
end
response = conn.get
logger.info "[gitea] response headers: #{response.headers}"
drone_oauth_user!(response.headers.to_h['location'], state)
end
def drone_oauth_user!(url, state)
logger.info "[drone] drone_oauth_user url: #{url}"
conn = Faraday.new(url: url) do |req|
req.request :url_encoded
req.adapter Faraday.default_adapter
req.headers["cookie"] = "_session_=#{SecureRandom.hex(28)}; _oauth_state_=#{state}"
end
response = conn.get
logger.info "[drone] response headers: #{response.headers}"
response.headers['location'].include?('error') ? false : true
end
private
def devops_params
params.permit(:account, :secret, :ip_num)
end
def client_id(oauth)
#如果是使用trustie服务器使用管理员用户的clientId
if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
trustie_drone_config = trustie_drone_server_config
return trustie_drone_config[:client_id]
else
return oauth&.client_id
end
end
end

View File

@ -0,0 +1,59 @@
module Ci::DbConnectable
extend ActiveSupport::Concern
included do
end
# Dynamically sets the database connection.
def connect_to_ci_database(options={})
master_db = options[:master_db] || false
config = Rails.application.config_for(:configuration).symbolize_keys!
db_config = config[:ci_db_server].symbolize_keys!
raise 'ci database config missing' if db_config.blank?
req_params = {
host: db_config[:host],
username: db_config[:username],
password: db_config[:password],
port: db_config[:port]
}
db_name = options[:db_name].blank? ? current_user.login : options[:db_name]
req_params = req_params.merge(database: "#{db_name}_#{db_config[:database]}") unless master_db === true
db_params = Ci::Database.get_connection_params(req_params)
@connection = Ci::Database.set_connection(db_params).connection
end
def connect_to_trustie_ci_database(options={})
master_db = options[:master_db] || false
config = Rails.application.config_for(:configuration).symbolize_keys!
db_config = config[:ci_db_server_trustie].symbolize_keys!
raise 'ci database config missing' if db_config.blank?
req_params = {
host: db_config[:host],
username: db_config[:username],
password: db_config[:password],
port: db_config[:port]
}
req_params = req_params.merge(database: "#{db_config[:database]}") unless master_db === true
db_params = Ci::Database.get_connection_params(req_params)
@trustie_db_connection = Ci::Database.set_connection(db_params).connection
end
def auto_create_database!(connection, database)
Rails.logger.info "[CI::DbConnectable] auto_create_database's connection: #{connection}"
connection.execute("CREATE DATABASE IF NOT EXISTS #{database}")
end
def auto_create_table_structure!(connection)
Rails.logger.info "[CI::DbConnectable] auto_create_table_structure's connection: #{connection}"
sqls = Ci::Schema.statement.split(';').map(&:strip).reject { |e| e.to_s.empty? }
sqls.each do |sql|
con_result = connection.execute(sql)
Rails.logger.info "=============> ci create tabels result: #{con_result}"
end
end
end

View File

@ -127,6 +127,8 @@ module LoginHelper
token = config[:sync_token]
api_host = config[:sync_url]
return if api_host.blank?
url = "#{api_host}/api/v1/users/sync_user_token"
sync_json = {
"token": token,

View File

@ -1,12 +1,14 @@
module PaginateHelper
def paginate(objs, **opts)
page = params[:page].to_i <= 0 ? 1 : params[:page].to_i
per_page = params[:per_page].to_i > 0 && params[:per_page].to_i < 50 ? params[:per_page].to_i : opts[:per_page] || 20
if objs.is_a?(Array)
Kaminari.paginate_array(objs).page(page).per(per_page)
def paginate(relation)
limit = params[:limit] || params[:per_page]
limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i
page = params[:page].to_i.zero? ? 1 : params[:page].to_i
if relation.is_a?(Array)
Kaminari.paginate_array(relation).page(page).per(limit)
else
objs.page(page).per(per_page)
relation.page(page).per(limit)
end
end
end

View File

@ -1,20 +1,22 @@
module RegisterHelper
extend ActiveSupport::Concern
def autologin_register(username, email, password, platform= '')
def autologin_register(username, email, password, platform= 'forge')
result = {message: nil, user: nil}
user = User.new(admin: false, login: username, mail: email, type: "User")
user.password = password
user.platform = platform
user.activate
return unless user.valid?
interactor = Gitea::RegisterInteractor.call({username: username, email: email, password: password})
if interactor.success?
gitea_user = interactor.result
result = Gitea::User::GenerateTokenService.new(username, password).call
result = Gitea::User::GenerateTokenService.call(username, password)
user.gitea_token = result['sha1']
user.gitea_uid = gitea_user['id']
user.gitea_uid = gitea_user[:body]['id']
if user.save!
UserExtension.create!(user_id: user.id)
result[:user] = {id: user.id, token: user.gitea_token}

View File

@ -0,0 +1,19 @@
module Repository::LanguagesPercentagable
extend ActiveSupport::Concern
def languages_precentagable
result = Gitea::Repository::Languages::ListService.call(@owner.login,
@repository.identifier, current_user&.gitea_token)
result[:status] === :success ? hash_transform_precentagable(result[:body]) : nil
end
# hash eq:{"JavaScript": 301681522,"Ruby": 1444004,"Roff": 578781}
def hash_transform_precentagable(hash)
total_byte_size = hash.values.sum
hash.transform_values { |v|
ActionController::Base.helpers
.number_to_percentage((v * 100.0 / total_byte_size), precision: 1)
}.select{|k,v| v != "0.0%"}
end
end

View File

@ -0,0 +1,8 @@
class Helps::FaqsController < ApplicationController
skip_before_action :check_sign, :user_setup
def index
faqs = Faq.select_without_id.order(updated_at: :desc)
render json: faqs.as_json(:except => [:id])
end
end

View File

@ -4,18 +4,18 @@ class HooksController < ApplicationController
before_action :check_user
before_action :set_repository
def index
hooks_response = Gitea::Hooks::ListService.new(@user, @repository.try(:identifier)).call
if hooks_response.status == 200
def index
hooks_response = Gitea::Hooks::ListService.new(@user.gitea_token, @user.login, @repository.try(:identifier)).call
if hooks_response.status == 200
lists = JSON.parse(hooks_response.body)
@hooks_size = lists.size
@hooks = paginate(lists)
else
else
normal_status(-1, "出现错误")
end
end
def create
def create
#根据gitea的api
# hook_params = {
# active: true,
@ -36,17 +36,17 @@ class HooksController < ApplicationController
# content_type: params[:content_type].to_i,
# secret: params[:secret],
# events: {
# push_only: params[:push_only] || false, # 是否为推送事件
# send_everything: params[:send_everything] || false, #是否为所有事件
# push_only: params[:push_only] || false, # 是否为推送事件
# send_everything: params[:send_everything] || false, #是否为所有事件
# choose_events: params[:choose_events] || false, #是否为自定义事件
# branch_filter: params[:branch_filter] || "*",
# events: {
# create: params[:create] || false, #创建分支/标签
# delete: params[:delete] || false, #删除分支/标签
# fork: params[:fork] || false, #仓库被派生
# delete: params[:delete] || false, #删除分支/标签
# fork: params[:fork] || false, #仓库被派生
# issues: params[:issues] || false, #工单
# issue_comment: params[:issue_comment] || false, #评论
# push: params[:push] || false # 推送
# issue_comment: params[:issue_comment] || false, #评论
# push: params[:push] || false # 推送
# pull_request: params[:pull_request] || false #合并请求
# repository: params[:repository] || false #仓库
# release: params[:release] || false #版本发布
@ -58,28 +58,28 @@ class HooksController < ApplicationController
Gitea::Hooks::CreateService.new(@user, @repository.try(:identifier), hook_params).call #创建gitea的hook功能
Gitea::Hooks::CreateService.new(user, p.try(:identifier), hook_params).call #创建gitea的hook功能
end
end
def update
def update
hook_params = params[:hook_params]
response = Gitea::Hooks::UpdateService.new(@user, @repository.try(:identifier), hook_params, params[:id]).call
if response.status == 200
if response.status == 200
normal_status(1, "更新成功")
else
else
normal_status(-1, "更新失败")
end
end
end
def destroy
def destroy
response = Gitea::Hooks::DestroyService.new(@user, @repository.try(:identifier), params[:id]).call
if response.status == 204
normal_status(1, "删除成功")
else
else
normal_status(-1, "删除失败")
end
end
end
private
private
def set_repository
@repository = @project.repository
@ -88,9 +88,9 @@ class HooksController < ApplicationController
normal_status(-1, "用户不存在") unless @user.present?
end
def check_user
unless @project.user_id == current_user.id
tip_exception(403, "您没有权限进入")
def check_user
unless @project.user_id == current_user.id
tip_exception(403, "您没有权限进入")
end
end
end

View File

@ -7,9 +7,6 @@ class IssueTagsController < ApplicationController
def index
order_name = params[:order_name] || "created_at"
order_type = params[:order_type] || "desc"
issue_tags = @project.issue_tags.order("#{order_name} #{order_type}")
@user_admin_or_member = current_user.present? && (current_user.admin || @project.member?(current_user))
@page = params[:page] || 1
@ -138,4 +135,14 @@ class IssueTagsController < ApplicationController
end
end
private
def order_name
IssueTag.column_names.include?(params[:order_name]) ? params[:order_name] : 'created_at'
end
def order_type
%w(desc asc).include?(params[:order_type]) ? params[:order_type] : 'desc'
end
end

View File

@ -6,21 +6,26 @@ class IssuesController < ApplicationController
before_action :check_project_public, only: [:index ,:show, :copy, :index_chosen, :close_issue]
before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :close_issue, :lock_issue]
before_action :get_branches, only: [:new, :edit]
before_action :check_token_enough, only: [:create, :update]
include ApplicationHelper
include TagChosenHelper
def index
return render_not_found unless @project.has_menu_permission("issues")
@user_admin_or_member = current_user.present? && current_user.logged? && (current_user.admin || @project.member?(current_user))
issues = @project.issues.issue_issue.issue_index_includes
issues = issues.where(is_private: false) unless @user_admin_or_member
@all_issues_size = issues.size
@open_issues_size = issues.where.not(status_id: 5).size
@close_issues_size = issues.where(status_id: 5).size
@assign_to_me_size = issues.where(assigned_to_id: current_user&.id).size
@my_published_size = issues.where(author_id: current_user&.id).size
@all_issues = issues
@filter_issues = @all_issues
@filter_issues = @filter_issues.where.not(status_id: IssueStatus::CLOSED) if params[:status_type].to_i == IssueStatus::ADD
@filter_issues = @filter_issues.where(status_id: IssueStatus::CLOSED) if params[:status_type].to_i == IssueStatus::SOLVING
@filter_issues = @filter_issues.where("subject LIKE ? OR description LIKE ? ", "%#{params[:search]}%", "%#{params[:search]}%") if params[:search].present?
@open_issues = @all_issues.where.not(status_id: IssueStatus::CLOSED)
@close_issues = @all_issues.where(status_id: IssueStatus::CLOSED)
@assign_to_me = @filter_issues.where(assigned_to_id: current_user&.id)
@my_published = @filter_issues.where(author_id: current_user&.id)
scopes = Issues::ListQueryService.call(issues,params.delete_if{|k,v| v.blank?}, "Issue")
@issues_size = scopes.size
@issues = paginate(scopes)
@ -96,80 +101,16 @@ class IssuesController < ApplicationController
end
def new
@all_branches = get_branches
@issue_chosen = issue_left_chosen(@project, nil)
@issue_chosen = get_associated_data(@project)
end
def create
if params[:subject].blank?
normal_status(-1, "标题不能为空")
elsif params[:subject].to_s.size > 255
normal_status(-1, "标题不能超过255个字符")
elsif (params[:issue_type].to_s == "2")
return normal_status(-1, "悬赏的奖金必须大于0") if params[:token].to_i == 0
else
issue_params = issue_send_params(params)
@issue = Issue.new(issue_params)
if @issue.save!
if params[:attachment_ids].present?
params[:attachment_ids].each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = @issue
attachment.author_id = current_user.id
attachment.description = ""
attachment.save
end
end
end
if params[:issue_tag_ids].present?
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create!(issue_id: @issue.id, issue_tag_id: tag)
end
end
if params[:assigned_to_id].present?
Tiding.create!(user_id: params[:assigned_to_id], trigger_user_id: current_user.id,
container_id: @issue.id, container_type: 'Issue',
parent_container_id: @project.id, parent_container_type: "Project",
tiding_type: 'issue', status: 0)
end
@issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
# normal_status(0, "创建成功",)
render :json => { status: 0, message: "创建成功", id: @issue.id}
else
normal_status(-1, "创建失败")
end
end
end
def edit
# @all_branches = get_branches
# @issue_chosen = issue_left_chosen(@project, @issue.id)
@issue_attachments = @issue.attachments
end
def update
issue_params = issue_send_params(params).except(:issue_classify, :author_id, :project_id)
return normal_status(-1, "您没有权限修改token") if @issue.will_save_change_to_token? && @issue.user_id != current_user&.id
if params[:issue_tag_ids].present? && !@issue&.issue_tags_relates.where(issue_tag_id: params[:issue_tag_ids]).exists?
@issue&.issue_tags_relates&.destroy_all
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create(issue_id: @issue.id, issue_tag_id: tag)
end
end
if @issue.update_attributes(issue_params)
issue_files = params[:attachment_ids]
change_files = false
issue_file_ids = []
if issue_files.present?
change_files = true
issue_files.each do |id|
issue_params = issue_send_params(params)
Issues::CreateForm.new({subject:issue_params[:subject]}).validate!
@issue = Issue.new(issue_params)
if @issue.save!
if params[:attachment_ids].present?
params[:attachment_ids].each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = @issue
@ -179,6 +120,65 @@ class IssuesController < ApplicationController
end
end
end
if params[:issue_tag_ids].present?
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create!(issue_id: @issue.id, issue_tag_id: tag)
end
end
if params[:assigned_to_id].present?
Tiding.create!(user_id: params[:assigned_to_id], trigger_user_id: current_user.id,
container_id: @issue.id, container_type: 'Issue',
parent_container_id: @project.id, parent_container_type: "Project",
tiding_type: 'issue', status: 0)
end
#为悬赏任务时, 扣除当前用户的积分
if params[:issue_type].to_s == "2"
post_to_chain("minus", params[:token].to_i, current_user.try(:login))
end
@issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
render json: {status: 0, message: "创建成", id: @issue.id}
else
normal_status(-1, "创建失败")
end
rescue Exception => exception
puts exception.message
normal_status(-1, exception.message)
end
def edit
# @issue_chosen = issue_left_chosen(@project, @issue.id)
@cannot_edit_tags = @issue.issue_type=="2" && @issue.status_id == 5 #悬赏任务已解决且关闭的状态下,不能修改
@issue_attachments = @issue.attachments
end
def update
last_token = @issue.token
last_status_id = @issue.status_id
if params[:issue_tag_ids].present? && !@issue&.issue_tags_relates.where(issue_tag_id: params[:issue_tag_ids]).exists?
@issue&.issue_tags_relates&.destroy_all
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create(issue_id: @issue.id, issue_tag_id: tag)
end
end
issue_files = params[:attachment_ids]
change_files = false
issue_file_ids = []
if issue_files.present?
change_files = true
issue_files.each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = @issue
attachment.author_id = current_user.id
attachment.description = ""
attachment.save
end
end
end
# if params[:issue_tag_ids].present?
# issue_current_tags = @issue&.issue_tags&.select(:id)&.pluck(:id)
@ -194,17 +194,39 @@ class IssuesController < ApplicationController
# end
# end
if params[:status_id].to_i == 5
@issue.issue_times.update_all(end_time: Time.now)
# @issue.update_closed_issues_count_in_project! #已经有after_update方法了这里就不需要了
end
@issue.create_journal_detail(change_files, issue_files, issue_file_ids, current_user&.id)
normal_status(0, "更新成功")
if @issue.issue_type.to_s == "2" && params[:status_id].to_i == 5 && @issue.author_id != current_user.try(:id)
normal_status(-1, "不允许修改为关闭状态")
else
normal_status(-1, "更新失败")
end
issue_params = issue_send_params(params).except(:issue_classify, :author_id, :project_id)
Issues::UpdateForm.new({subject:issue_params[:subject]}).validate!
if @issue.update_attributes(issue_params)
if params[:status_id].to_i == 5 #任务由非关闭状态到关闭状态时
@issue.issue_times.update_all(end_time: Time.now)
@issue.update_closed_issues_count_in_project!
if @issue.issue_type.to_s == "2" && last_status_id != 5
if @issue.assigned_to_id.present? && last_status_id == 3 #只有当用户完成100%时才给token
post_to_chain("add", @issue.token, @issue.get_assign_user.try(:login))
else
post_to_chain("add", @issue.token, @issue.user.try(:login))
end
end
end
if @issue.issue_type.to_s == "2" && @issue.status_id != 5 && @issue.saved_change_to_attribute("token")
#表示修改token值
change_token = last_token - @issue.token
change_type = change_token > 0 ? "add" : "minus"
post_to_chain(change_type, change_token.abs, current_user.try(:login))
end
@issue.create_journal_detail(change_files, issue_files, issue_file_ids, current_user&.id)
normal_status(0, "更新成功")
else
normal_status(-1, "更新失败")
end
end
rescue Exception => exception
puts exception.message
normal_status(-1, exception.message)
end
def show
@ -224,17 +246,32 @@ class IssuesController < ApplicationController
end
def destroy
if @issue.destroy
normal_status(0, "删除成功")
else
begin
issue_type = @issue.issue_type
status_id = @issue.status_id
token = @issue.token
login = @issue.user.try(:login)
if @issue.destroy
if issue_type == "2" && status_id != 5
post_to_chain("add", token, login)
end
normal_status(0, "删除成功")
else
normal_status(-1, "删除失败")
end
rescue => exception
Rails.logger.info("#########_______exception.message_________##########{exception.message}")
normal_status(-1, "删除失败")
else
end
end
def clean
#批量删除,暂时只能删除未悬赏的
issue_ids = params[:ids]
if issue_ids.present?
if Issue.where(id: issue_ids).destroy_all
if Issue.where(id: issue_ids, issue_type: "1").destroy_all
normal_status(0, "删除成功")
else
normal_status(-1, "删除失败")
@ -306,6 +343,9 @@ class IssuesController < ApplicationController
if type == 5
@issue&.project_trends&.update_all(action_type: "close")
@issue.issue_times.update_all(end_time: Time.now)
if @issue.issue_type.to_s == "2"
post_to_chain("add", @issue.token, @issue.get_assign_user.try(:login))
end
if @issue.issue_classify.to_s == "pull_request"
@issue&.pull_request&.update_attribute(:status, 2)
end
@ -399,17 +439,6 @@ class IssuesController < ApplicationController
tracker_array
end
def get_branches
all_branches = []
get_all_branches = Gitea::Repository::Branches::ListService.new(@user, @project&.repository.try(:identifier)).call
if get_all_branches && get_all_branches.size > 0
get_all_branches.each do |b|
all_branches.push(b["name"])
end
end
all_branches
end
def issue_send_params(params)
{
subject: params[:subject],
@ -434,4 +463,32 @@ class IssuesController < ApplicationController
project_id: @project.id
}
end
def post_to_chain(type, amount,login)
change_params = {
type: type,
chain_params: {
amount: amount,
reponame: @project.try(:identifier),
username: login
}
}
PostChainJob.perform_later(change_params)
end
def check_token_enough
if params[:issue_type].to_s == "2" && (@issue.blank? || (@issue.present? && @issue.author_id == current_user.try(:id)))
return normal_status(-1, "悬赏的奖金必须大于0") if params[:token].to_i == 0
query_params = {
type: "query",
chain_params: {
reponame: @project.try(:identifier),
username: current_user.try(:login)
}
}
response = Gitea::Chain::ChainGetService.new(query_params).call
return normal_status(-1, "获取token失败请稍后重试") if response.status != 200
return normal_status(-1, "您的token值不足") if JSON.parse(response.body)["balance"].to_i < params[:token].to_i
end
end
end

View File

@ -2,7 +2,7 @@ class MainController < ApplicationController
protect_from_forgery except: :index
skip_before_action :check_sign
skip_before_action :user_setup
# skip_before_action :setup_laboratory
skip_before_action :setup_laboratory
def first_stamp
render :json => { status: 0, message: Time.now.to_i }

View File

@ -18,7 +18,7 @@ class MembersController < ApplicationController
scope = @project.members.includes(:roles, user: :user_extension)
search = params[:search].to_s.downcase
role = params[:role].to_s
scope = scope.joins(:user).where("LOWER(concat(users.lastname, users.firstname, users.login, users.mail)) LIKE ?", "%#{search.split(" ").join('|')}%") if search.present?
scope = scope.joins(:user).merge(User.like(search))
scope = scope.joins(:roles).where("roles.name LIKE ?", "%#{role}%") if role.present?
@total_count = scope.size
@ -47,7 +47,7 @@ class MembersController < ApplicationController
end
def member_exists?
@project.member?(params[:user_id])
@project.members.exists?(params[:user_id])
end
def operate!
@ -59,6 +59,6 @@ class MembersController < ApplicationController
end
def check_member_not_exists!
return render_result(1, "user_id为#{params[:user_id]}的用户还不是项目成员") unless member_exists?
return render_result(1, "user_id为#{params[:user_id]}的用户还不是项目成员") unless @project.member?(params[:user_id])
end
end

View File

@ -0,0 +1,35 @@
class Organizations::BaseController < ApplicationController
include ApplicationHelper
include PaginateHelper
protected
def can_edit_org?
current_user.admin? || @organization.is_owner?(current_user.id)
end
def check_user_can_edit_org
tip_exception("您没有权限进行该操作") unless can_edit_org?
end
def org_limited_condition
@organization.organization_extension.limited? && !current_user.logged?
end
def org_privacy_condition
return false if current_user.admin?
@organization.organization_extension.privacy? && @organization.organization_users.where(user_id: current_user.id).blank?
end
def team_not_found_condition
!current_user&.admin? && @team.team_users.where(user_id: current_user.id).blank? && !@organization.is_owner?(current_user.id)
end
def user_mark
params[:username] || params[:id]
end
def project_mark
params[:repo_name] || params[:id]
end
end

View File

@ -0,0 +1,57 @@
class Organizations::OrganizationUsersController < Organizations::BaseController
before_action :load_organization
before_action :load_operate_user, :load_organization_user, :check_user_can_edit_org, only: [:destroy]
def index
@organization_users = @organization.organization_users.includes(:user)
search = params[:search].to_s.downcase
@organization_users = @organization_users.joins(:user).merge(User.like(search))
@organization_users = kaminari_paginate(@organization_users)
end
def destroy
tip_exception("您不能从所有者团队中删除最后一个用户") if @organization.is_owner_team_last_one?(@operate_user.id)
ActiveRecord::Base.transaction do
@organization_user.destroy!
TeamUser.where(organization_id: @organization.id, user_id: @operate_user.id).map{|u| u.destroy!}
Gitea::Organization::OrganizationUser::DeleteService.call(@organization.gitea_token, @organization.login, @operate_user.login)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def quit
@organization_user = @organization.organization_users.find_by(user_id: current_user.id)
tip_exception("您不在该组织中") if @organization_user.nil?
tip_exception("您不能从所有者团队中删除最后一个用户") if @organization.is_owner_team_last_one?(current_user.id)
ActiveRecord::Base.transaction do
@organization_user.destroy!
TeamUser.where(organization_id: @organization.id, user_id: current_user.id).map{|u| u.destroy!}
Gitea::Organization::OrganizationUser::DeleteService.call(@organization.gitea_token, @organization.login, current_user.login)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def load_operate_user
@operate_user = User.find_by(login: user_mark) if user_mark.present?
tip_exception("平台用户不存在") if @operate_user.nil?
end
def load_organization_user
@organization_user = OrganizationUser.find_by(organization_id: @organization.id, user_id: @operate_user.id)
tip_exception("组织成员不存在") if @organization_user.nil?
end
end

View File

@ -0,0 +1,98 @@
class Organizations::OrganizationsController < Organizations::BaseController
before_action :require_login, except: [:index, :show, :recommend]
before_action :convert_image!, only: [:create, :update]
before_action :load_organization, only: [:show, :update, :destroy]
before_action :check_user_can_edit_org, only: [:update, :destroy]
def index
if current_user.logged?
logged_organizations_sql = Organization.with_visibility(%w(common limited)).to_sql
privacy_organizations_sql = Organization.with_visibility("privacy").joins(:organization_users).where(organization_users: {user_id: current_user.id}).to_sql
@organizations = Organization.from("( #{ logged_organizations_sql } UNION #{ privacy_organizations_sql } ) AS users")
else
@organizations = Organization.with_visibility("common")
end
@organizations = @organizations.ransack(login_cont: params[:search]).result if params[:search].present?
@organizations = @organizations.includes(:organization_extension).order("organization_extensions.#{sort_by} #{sort_direction}")
@organizations = kaminari_paginate(@organizations)
end
def show
@can_create_project = @organization.can_create_project?(current_user.id)
@is_admin = can_edit_org?
@is_member = @organization.is_member?(current_user.id)
end
def create
ActiveRecord::Base.transaction do
Organizations::CreateForm.new(organization_params).validate!
@organization = Organizations::CreateService.call(current_user, organization_params)
Util.write_file(@image, avatar_path(@organization)) if params[:image].present?
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def update
ActiveRecord::Base.transaction do
Organizations::CreateForm.new(organization_params).validate!
login = @organization.login
@organization.login = organization_params[:name] if organization_params[:name].present?
@organization.nickname = organization_params[:nickname] if organization_params[:nickname].present?
@organization.save!
@organization.organization_extension.update_attributes!(organization_params.except(:name, :nickname))
Gitea::Organization::UpdateService.call(@organization.gitea_token, login, @organization.reload)
Util.write_file(@image, avatar_path(@organization)) if params[:image].present?
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
tip_exception("密码不正确") unless current_user.check_password?(password)
ActiveRecord::Base.transaction do
Gitea::Organization::DeleteService.call(@organization.gitea_token, @organization.login)
@organization.destroy!
end
render_ok
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def recommend
recommend = %W(xuos Huawei_Technology openatom_foundation pkecosystem TensorLayer)
@organizations = Organization.with_visibility(%w(common))
.where(login: recommend).select(:id, :login, :firstname, :lastname, :nickname)
end
private
def organization_params
params.permit(:name, :description, :website, :location,
:repo_admin_change_team_access, :visibility,
:max_repo_creation, :nickname)
end
def password
params.fetch(:password, "")
end
def load_organization
@organization = Organization.find_by(login: params[:id]) || Organization.find_by(id: params[:id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def sort_by
OrganizationExtension.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
end
def sort_direction
%w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
end
end

View File

@ -0,0 +1,45 @@
class Organizations::ProjectsController < Organizations::BaseController
before_action :load_organization
def index
public_projects_sql = @organization.projects.where(is_public: true).to_sql
private_projects_sql = @organization.projects
.where(is_public: false)
.joins(team_projects: {team: :team_users})
.where(team_users: {user_id: current_user.id}).to_sql
@projects = Project.from("( #{ public_projects_sql} UNION #{ private_projects_sql } ) AS projects")
@projects = @projects.ransack(name_or_identifier_cont: params[:search]).result if params[:search].present?
@projects = @projects.includes(:owner).order("projects.#{sort} #{sort_direction}")
@projects = paginate(@projects)
end
def search
tip_exception("请输入搜索关键词") if params[:search].nil?
public_projects_sql = @organization.projects.where(is_public: true).to_sql
private_projects_sql = @organization.projects
.where(is_public: false)
.joins(team_projects: {team: :team_users})
.where(team_users: {user_id: current_user.id}).to_sql
@projects = Project.from("( #{ public_projects_sql} UNION #{ private_projects_sql } ) AS projects")
@projects = @projects.ransack(name_or_identifier_cont: params[:search]).result
@projects = @projects.includes(:owner).order("projects.#{sort} #{sort_direction}")
end
private
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def sort
Project.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'updated_on'
end
def sort_direction
%w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
end
end

View File

@ -0,0 +1,58 @@
class Organizations::TeamProjectsController < Organizations::BaseController
before_action :load_organization
before_action :load_team
before_action :load_operate_project, :check_user_can_edit_org, only: [:create, :destroy]
before_action :load_team_project, only: [:destroy]
def index
@team_projects = @team.team_projects
@team_projects = paginate(@team_projects)
end
def create
tip_exception("该组织团队项目包括组织所有项目,不允许更改") if @team.includes_all_project
ActiveRecord::Base.transaction do
@team_project = TeamProject.build(@organization.id, @team.id, @operate_project.id)
Gitea::Organization::TeamProject::CreateService.call(@organization.gitea_token, @team.gtid, @organization.login, @operate_project.identifier)
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
tip_exception("该组织团队项目包括组织所有项目,不允许更改") if @team.includes_all_project
ActiveRecord::Base.transaction do
@team_project.destroy!
Gitea::Organization::TeamProject::DeleteService.call(@organization.gitea_token, @team.gtid, @organization.login, @operate_project.identifier)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def load_team
@team = Team.find_by_id(params[:team_id])
return render_not_found("组织团队不存在") if @team.nil?
return render_forbidden("没有查看组织团队的权限") if team_not_found_condition
end
def load_operate_project
@operate_project = Project.find_by(id: project_mark) || Project.find_by(identifier: project_mark)
tip_exception("项目不存在") if @operate_project.nil?
end
def load_team_project
@team_project = TeamProject.find_by(organization_id: @organization.id, team_id: @team.id, project_id: @operate_project.id)
tip_exception("组织团队项目不存在") if @team_project.nil?
end
end

View File

@ -0,0 +1,76 @@
class Organizations::TeamUsersController < Organizations::BaseController
before_action :load_organization, :load_team
before_action :load_operate_user, only: [:create, :destroy]
before_action :load_team_user, only: [:destroy]
before_action :check_user_can_edit_org, only: [:create, :destroy]
def index
@team_users = @team.team_users.includes(:user)
search = params[:search].to_s.downcase
@team_users = @team_users.joins(:user).merge(User.like(search))
@team_users = kaminari_paginate(@team_users)
end
def create
ActiveRecord::Base.transaction do
@team_user = TeamUser.build(@organization.id, @operate_user.id, @team.id)
@organization_user = OrganizationUser.build(@organization.id, @operate_user.id)
Gitea::Organization::TeamUser::CreateService.call(@organization.gitea_token, @team.gtid, @operate_user.login)
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
tip_exception("您不能从所有者团队中删除最后一个用户") if @team.owner? && @organization.is_owner_team_last_one?(@operate_user.id)
ActiveRecord::Base.transaction do
@team_user.destroy!
Gitea::Organization::TeamUser::DeleteService.call(@organization.gitea_token, @team.gtid, @operate_user.login)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def quit
@team_user = @team.team_users.find_by(user_id: current_user.id)
tip_exception("您不在该组织团队中") if @team_user.nil?
tip_exception("您不能从所有者团队中删除最后一个用户") if @team.owner? && @organization.is_owner_team_last_one?(current_user.id)
ActiveRecord::Base.transaction do
@team_user.destroy!
Gitea::Organization::TeamUser::DeleteService.call(@organization.gitea_token, @team.gtid, current_user.login)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def load_team
@team = Team.find_by_id(params[:team_id])
return render_not_found("组织团队不存在") if @team.nil?
return render_forbidden("没有查看组织团队的权限") if team_not_found_condition
end
def load_operate_user
@operate_user = User.find_by(login: user_mark) if user_mark.present?
tip_exception("平台用户不存在") if @operate_user.nil?
end
def load_team_user
@team_user = TeamUser.find_by(team_id: @team.id, user_id: @operate_user.id)
tip_exception("组织团队成员不存在") if @team_user.nil?
end
end

View File

@ -0,0 +1,81 @@
class Organizations::TeamsController < Organizations::BaseController
before_action :load_organization
before_action :load_team, only: [:show, :update, :destroy]
before_action :check_user_can_edit_org, only: [:create, :update, :destroy]
def index
#if @organization.is_owner?(current_user) || current_user.admin?
@teams = @organization.teams
#else
# @teams = @organization.teams.joins(:team_users).where(team_users: {user_id: current_user.id})
#end
@is_admin = can_edit_org?
@teams = @teams.includes(:team_units, :team_users)
@teams = kaminari_paginate(@teams)
end
def search
tip_exception("请输入搜索关键词") if params[:search].nil?
if @organization.is_owner?(current_user) || current_user.admin?
@teams = @organization.teams
else
@teams = @organization.teams.joins(:team_users).where(team_users: {user_id: current_user.id})
end
@is_admin = can_edit_org?
@teams = @teams.ransack(name_cont: params[:search]).result if params[:search].present?
@teams = @teams.includes(:team_units, :team_users)
end
def show
@is_admin = can_edit_org?
@is_member = @team.is_member?(current_user.id)
end
def create
ActiveRecord::Base.transaction do
Organizations::CreateTeamForm.new(team_params).validate!
@team = Organizations::Teams::CreateService.call(current_user, @organization, team_params)
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def update
Organizations::CreateTeamForm.new(team_params).validate!
@team = Organizations::Teams::UpdateService.call(current_user, @team, team_params)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
tip_exception("组织团队不允许被删除") if @team.owner?
ActiveRecord::Base.transaction do
Gitea::Organization::Team::DeleteService.call(@organization.gitea_token, @team.gtid)
@team.destroy!
end
render_ok
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def team_params
params.permit(:name, :nickname, :description, :authorize, :includes_all_project, :can_create_org_project, :unit_types => [])
end
def load_organization
@organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id])
return render_not_found("组织不存在") if @organization.nil?
return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition
end
def load_team
@team = Team.find_by_id(params[:id])
return render_not_found("组织团队不存在") if @team.nil?
return render_forbidden("没有查看组织团队的权限") if team_not_found_condition
end
end

View File

@ -0,0 +1,12 @@
class OwnersController < ApplicationController
before_action :require_login
def index
@owners = []
@owners += [current_user]
@owners += Organization.joins(team_users: :team)
.where(team_users: {user_id: current_user.id},
teams: {can_create_org_project: true})
.distinct
end
end

View File

@ -40,8 +40,5 @@ class PraiseTreadController < ApplicationController
end
private
def render_result
end
end

View File

@ -6,12 +6,8 @@ class ProjectCategoriesController < ApplicationController
end
def group_list
# if current_user&.logged?
# projects = Project.list_user_projects(current_user.id)
# else
# projects = Project.visible
# end
projects = Project.no_anomory_projects.visible
@category_group_list = projects.joins(:project_category).group("project_categories.id", "project_categories.name").size
@project_categories = ProjectCategory.where('projects_count > 0').order(projects_count: :desc)
# projects = Project.no_anomory_projects.visible
# @category_group_list = projects.joins(:project_category).group("project_categories.id", "project_categories.name").size
end
end

View File

@ -0,0 +1,26 @@
class Projects::AppliedTransferProjectsController < Projects::BaseController
before_action :check_auth
def organizations
@organizations = Organization.includes(:organization_extension).joins(team_users: :team).where(team_users: {user_id: current_user.id}, teams: {authorize: %w(admin owner)})
end
def create
@applied_transfer_project = Projects::ApplyTransferService.call(current_user, @project, params)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def cancel
@applied_transfer_project = Projects::CancelTransferService.call(current_user, @project)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def check_auth
return render_forbidden unless current_user.admin? ||@project.owner?(current_user)
end
end

View File

@ -0,0 +1,24 @@
class Projects::ProjectUnitsController < Projects::BaseController
def index
@project_units = @project.project_units
end
def create
if current_user.admin? || @project.manager?(current_user)
ActiveRecord::Base.transaction do
ProjectUnit.update_by_unit_types!(@project, unit_types)
render_ok
end
else
render_forbidden('你没有权限操作')
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def unit_types
params.fetch(:unit_types, [])
end
end

View File

@ -0,0 +1,47 @@
class Projects::TeamsController < Projects::BaseController
before_action :load_operate_team, only: [:create, :destroy]
before_action :load_team_project, only: :destroy
def index
if @project.owner.is_a?(Organization)
@teams = Team.joins(:team_projects).where(team_projects: {project_id: @project.id})
else
@teams = Team.none
end
@teams = paginate(@teams)
end
def create
ActiveRecord::Base.transaction do
@team_project = TeamProject.build(@owner.id, @operate_team.id, @project.id)
Gitea::Organization::TeamProject::CreateService.call(@owner.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def destroy
ActiveRecord::Base.transaction do
@team_project.destroy!
Gitea::Organization::TeamProject::DeleteService.call(@owner.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
render_ok
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def load_operate_team
@operate_team = Team.find_by(id: params[:team_id]) || Team.find_by(id: params[:id])
tip_exception("项目不存在") if @operate_team.nil?
tip_exception("该组织团队拥有组织所有项目,无法进行操作") if @operate_team.includes_all_project
end
def load_team_project
@team_project = TeamProject.find_by(organization_id: @owner.id, team_id: @operate_team.id, project_id: @project.id)
tip_exception("组织团队项目不存在") if @team_project.nil?
end
end

View File

@ -2,16 +2,44 @@ class ProjectsController < ApplicationController
include ApplicationHelper
include OperateProjectAbilityAble
include ProjectsHelper
before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about]
include Acceleratorable
before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about menu_list]
before_action :load_project, except: %i[index group_type_list migrate create recommend]
before_action :authorizate_user_can_edit_project!, only: %i[update]
before_action :project_public?, only: %i[fork_users praise_users watch_users]
def menu_list
menu = []
menu.append(menu_hash_by_name("home"))
menu.append(menu_hash_by_name("code")) if @project.has_menu_permission("code")
menu.append(menu_hash_by_name("issues")) if @project.has_menu_permission("issues")
menu.append(menu_hash_by_name("pulls")) if @project.has_menu_permission("pulls")
menu.append(menu_hash_by_name("devops")) if @project.has_menu_permission("devops")
menu.append(menu_hash_by_name("versions")) if @project.has_menu_permission("versions")
menu.append(menu_hash_by_name("resources")) if @project.has_menu_permission("resources")
menu.append(menu_hash_by_name("activity"))
menu.append(menu_hash_by_name("setting")) if current_user.admin? || @project.manager?(current_user)
render json: menu
end
def index
scope = Projects::ListQuery.call(params)
@projects = kaminari_paginate(scope)
@total_count = @projects.total_count
# @projects = kaminari_paginate(scope)
@projects = paginate scope.includes(:project_category, :project_language, :repository, :project_educoder, :owner, :project_units)
category_id = params[:category_id]
@total_count =
if category_id.blank?
ps = ProjectStatistic.first
ps.common_projects_count + ps.mirror_projects_count unless ps.blank?
else
cate = ProjectCategory.find_by(id: category_id)
cate&.projects_count || 0
end
end
def create
@ -27,36 +55,81 @@ class ProjectsController < ApplicationController
def migrate
Projects::MigrateForm.new(mirror_params).validate!
@project = Projects::MigrateService.new(current_user, mirror_params).call
@project =
if enable_accelerator?(mirror_params[:clone_addr])
source_clone_url = mirror_params[:clone_addr]
uid_logger("########## 已动加速器 ##########")
result = Gitea::Accelerator::MigrateService.call(mirror_params)
if result[:status] == :success
Rails.logger.info "########## 加速镜像成功 ########## "
Projects::MigrateService.call(current_user,
mirror_params.merge(source_clone_url: source_clone_url,
clone_addr: accelerator_url(mirror_params[:repository_name])))
else
Projects::MigrateService.call(current_user, mirror_params)
end
else
Projects::MigrateService.call(current_user, mirror_params)
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def branches
@branches = Gitea::Repository::Branches::ListService.new(@project.owner, @project.identifier).call
return @branches = [] unless @project.forge?
result = Gitea::Repository::Branches::ListService.call(@owner, @project.identifier)
@branches = result.is_a?(Hash) && result.key?(:status) ? [] : result
end
def group_type_list
# if current_user&.logged?
# projects = Project.list_user_projects(current_user.id)
# else
# projects = Project.visible
# end
projects = Project.no_anomory_projects.visible
@project_group_list = projects.group(:project_type).size
project_statics = ProjectStatistic.first
@project_statics_list = [
{
project_type: 'common',
name: '开源托管项目',
projects_count: project_statics&.common_projects_count || 0
},
{
project_type: 'mirror',
name: '开源镜像项目',
projects_count: project_statics&.mirror_projects_count || 0
}
]
# projects = Project.no_anomory_projects.visible
# @project_group_list = projects.group(:project_type).size
end
def update
ActiveRecord::Base.transaction do
# Projects::CreateForm.new(project_params).validate!
private = params[:private]
if [true, false].include? private
new_project_params = project_params.merge(is_public: !private)
Gitea::Repository::UpdateService.new(@project.owner, @project.repository.identifier, {private: private}).call
@project.repository.update_column(:hidden, private)
# TODO:
# 临时特殊处理修改website、lesson_url操作方法
if project_params.has_key?("website")
@project.update(project_params)
else
validate_params = project_params.slice(:name, :description,
:project_category_id, :project_language_id, :private)
Projects::UpdateForm.new(validate_params).validate!
private = params[:private] || false
new_project_params = project_params.except(:private).merge(is_public: !private)
@project.update_attributes!(new_project_params)
gitea_params = {
private: private,
default_branch: @project.default_branch,
website: @project.website
}
if [true, false].include? private
Gitea::Repository::UpdateService.call(@owner, @project.identifier, gitea_params)
@project.repository.update_column(:hidden, private)
end
end
@project.update_attributes!(new_project_params)
end
rescue Exception => e
uid_logger_error(e.message)
@ -67,7 +140,7 @@ class ProjectsController < ApplicationController
end
def destroy
if current_user.admin? || @project.owner?(current_user)
if current_user.admin? || @project.manager?(current_user)
ActiveRecord::Base.transaction do
Gitea::Repository::DeleteService.new(@project.owner, @project.identifier).call
@project.destroy!
@ -100,11 +173,11 @@ class ProjectsController < ApplicationController
end
def simple
json_response(@project)
json_response(@project, current_user)
end
def recommend
@projects = Project.recommend.includes(:repository, :project_category, owner: :user_extension).limit(5)
@projects = Project.recommend.includes(:repository, :project_category, :owner).order(visits: :desc)
end
def about
@ -138,8 +211,8 @@ class ProjectsController < ApplicationController
private
def project_params
params.permit(:user_id, :name, :description, :repository_name,
:project_category_id, :project_language_id, :license_id, :ignore_id)
params.permit(:user_id, :name, :description, :repository_name, :website, :lesson_url,
:project_category_id, :project_language_id, :license_id, :ignore_id, :private)
end
def mirror_params

View File

@ -0,0 +1,43 @@
class ProtectedBranchesController < ApplicationController
include OperateProjectAbilityAble
before_action :require_login
before_action :load_repository
before_action :authorizate_user_can_edit_project!
def index
scope = @repository.protected_branches
@total_count = scope.size
@protected_branches = paginate(scope)
end
def create
@protected_branch = ProtectedBranches::CreateService.call(@repository, @owner, params)
render_protected_branch_json
end
def update
@protected_branch = ProtectedBranches::UpdateService.call(@repository, @owner, params)
end
def destroy
ProtectedBranches::DestroyService.call(@repository, @owner, params[:branch_name])
render_ok
end
def show
@protected_branch = ProtectedBranches::GetService.call(@repository, @owner, params)
end
def edit
@branch, @protected_branch = ProtectedBranches::EditService.call(@repository, @owner, params[:branch_name])
end
private
def render_protected_branch_json
@protected_branch.persisted? ? @protected_branch : render_error('创建失败!')
end
end

View File

@ -1,21 +1,23 @@
class PullRequestsController < ApplicationController
before_action :require_login, except: [:index, :show]
before_action :require_login, except: [:index, :show, :files, :commits]
before_action :load_repository
before_action :set_user, only: [:new, :get_branches]
before_action :find_pull_request, except: [:index, :new, :create, :check_can_merge,:get_branches,:create_merge_infos]
# before_action :get_relatived, only: [:edit]
before_action :find_pull_request, except: [:index, :new, :create, :check_can_merge,:get_branches,:create_merge_infos, :files, :commits]
before_action :load_pull_request, only: [:files, :commits]
include TagChosenHelper
include ApplicationHelper
def index
return render_not_found unless @project.has_menu_permission("pulls")
# @issues = Gitea::PullRequest::ListService.new(@user,@repository.try(:identifier)).call #通过gitea获取
issues = @project.issues.issue_pull_request.issue_index_includes.includes(pull_request: :user)
issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user))
@all_issues_size = issues.size
@open_issues_size = issues.joins(:pull_request).where(pull_requests: {status: 0}).size
@close_issues_size = issues.joins(:pull_request).where(pull_requests: {status: 2}).size
@merged_issues_size = issues.joins(:pull_request).where(pull_requests: {status: 1}).size
@all_issues = issues.distinct
@filter_issues = @all_issues
@filter_issues = @filter_issues.where("subject LIKE ? OR description LIKE ? ", "%#{params[:search]}%", "%#{params[:search]}%") if params[:search].present?
@open_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::OPEN})
@close_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::CLOSED})
@merged_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::MERGED})
@user_admin_or_member = current_user.present? && (current_user.admin || @project.member?(current_user))
scopes = Issues::ListQueryService.call(issues,params.delete_if{|k,v| v.blank?}, "PullRequest")
@ -24,11 +26,11 @@ class PullRequestsController < ApplicationController
end
def new
@all_branches = PullRequests::BranchesService.new(@user, @project).call
@all_branches = Branches::ListService.call(@owner, @project)
@is_fork = @project.forked_from_project_id.present?
@projects_names = [{
project_user_login: @user.try(:login),
project_name: "#{@user.try(:show_real_name)}/#{@repository.try(:identifier)}",
project_user_login: @owner.try(:login),
project_name: "#{@owner.try(:show_real_name)}/#{@repository.try(:identifier)}",
project_id: @project.identifier,
id: @project.id
}]
@ -45,64 +47,20 @@ class PullRequestsController < ApplicationController
end
def get_branches
branch_result = PullRequests::BranchesService.new(@user, @project).call
branch_result = Branches::ListService.call(@owner, @project)
render json: branch_result
# return json: branch_result
end
def create
if params[:title].nil?
normal_status(-1, "名称不能为空")
elsif params[:issue_tag_ids].nil?
normal_status(-1, "标签不能为空")
else
ActiveRecord::Base.transaction do
begin
merge_params
pull_issue = Issue.new(@issue_params)
if pull_issue.save!
pr_params = {
user_id: current_user.try(:id),
project_id: @project.id,
issue_id: pull_issue.id,
fork_project_id: params[:fork_project_id],
is_original: params[:is_original]
}
local_requests = PullRequest.new(@local_params.merge(pr_params))
if local_requests.save
remote_pr_params = @local_params
remote_pr_params = remote_pr_params.merge(head: "#{params[:merge_user_login]}:#{params[:head]}").compact if local_requests.is_original && params[:merge_user_login]
gitea_request = Gitea::PullRequest::CreateService.call(current_user.try(:gitea_token), @project.owner, @repository.try(:identifier), remote_pr_params.except(:milestone))
if gitea_request && local_requests.update_attributes(gpid: gitea_request["number"])
if params[:issue_tag_ids].present?
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create!(issue_id: pull_issue.id, issue_tag_id: tag)
end
end
if params[:assigned_to_id].present?
Tiding.create!(user_id: params[:assigned_to_id], trigger_user_id: current_user.id,
container_id: local_requests.id, container_type: 'PullRequest',
parent_container_id: @project.id, parent_container_type: "Project",
tiding_type: 'pull_request', status: 0)
end
local_requests.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
if params[:title].to_s.include?("WIP:")
pull_issue.custom_journal_detail("WIP", "", "这个合并请求被标记为尚未完成的工作。完成后请从标题中移除WIP:前缀。", current_user&.id)
end
# render :json => { status: 0, message: "PullRequest创建成功", id: pull_issue.id}
normal_status(0, "PullRequest创建成功")
else
normal_status(-1, "PullRequest创建失败")
end
else
normal_status(-1, "PullRequest创建失败")
end
end
rescue => e
normal_status(-1, e.message)
raise ActiveRecord::Rollback
end
ActiveRecord::Base.transaction do
@pull_request, @gitea_pull_request = PullRequests::CreateService.call(current_user, @owner, @project, params)
if @gitea_pull_request[:status] == :success
@pull_request.bind_gitea_pull_request!(@gitea_pull_request[:body]["number"])
render_ok
else
render_error("create pull request error: #{@gitea_pull_request[:status]}")
raise ActiveRecord::Rollback
end
end
end
@ -132,8 +90,10 @@ class PullRequestsController < ApplicationController
if @issue.update_attributes(@issue_params)
if @pull_request.update_attributes(@local_params.compact)
gitea_request = Gitea::PullRequest::UpdateService.new(@project.owner, @repository.try(:identifier), @requests_params, @pull_request.try(:gpid)).call
if gitea_request
gitea_pull = Gitea::PullRequest::UpdateService.call(@owner.login, @repository.identifier,
@pull_request.gpid, @requests_params, current_user.gitea_token)
if gitea_pull[:status] === :success
if params[:issue_tag_ids].present?
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create(issue_id: @issue.id, issue_tag_id: tag)
@ -162,9 +122,8 @@ class PullRequestsController < ApplicationController
def refuse_merge
ActiveRecord::Base.transaction do
begin
@pull_request.update(status: 2)
@pull_request.issue.update(status_id: 5)
normal_status(1, "已拒绝")
colsed = PullRequests::CloseService.call(@owner, @repository, @pull_request, current_user)
colsed === true ? normal_status(1, "已拒绝") : normal_status(-1, '合并失败')
rescue => e
normal_status(-1, e.message)
raise ActiveRecord::Rollback
@ -179,30 +138,26 @@ class PullRequestsController < ApplicationController
def show
@issue_user = @issue.user
@issue_assign_to = @issue.get_assign_user
@gitea_pull = Gitea::PullRequest::GetService.call(@owner.login,
@repository.identifier, @pull_request.gpid, current_user&.gitea_token)
end
def pr_merge
return render_forbidden("你没有权限操作.") if @project.reporter?(current_user)
return render_forbidden("你没有权限操作.") unless @project.operator?(current_user)
if params[:do].blank?
normal_status(-1, "请选择合并方式")
else
ActiveRecord::Base.transaction do
begin
requests_params = {
Do: params[:do],
MergeMessageField: params[:body],
MergeTitleField: params[:title]
}
merge_pr = Gitea::PullRequest::MergeService.call(current_user.gitea_token, @project.owner.login,
@repository.try(:identifier), @pull_request.try(:gpid), requests_params)
if @pull_request.update_attribute(:status, 1) && merge_pr[:status].to_i == 200
@pull_request&.project_trends&.update_all(action_type: "close")
result = PullRequests::MergeService.call(@owner, @repository, @pull_request, current_user, params)
if result.status == 200 && @pull_request.merge!
@pull_request.project_trend_status!
@issue&.custom_journal_detail("merge", "", "该合并请求已被合并", current_user&.id)
normal_status(1, "合并成功")
else
normal_status(-1, "合并失败")
normal_status(-1, result.message)
end
rescue => e
normal_status(-1, e.message)
@ -222,11 +177,11 @@ class PullRequestsController < ApplicationController
elsif target_head === target_base && !is_original
normal_status(-2, "分支内容相同,无需创建合并请求")
else
can_merge = @project&.pull_requests.where(user_id: current_user&.id, head: target_head, base: target_base, status: 0, is_original: is_original, fork_project_id: params[:fork_project_id])
can_merge = @project&.pull_requests.where(head: target_head, base: target_base, status: 0, is_original: is_original, fork_project_id: params[:fork_project_id])
if can_merge.present?
render json: {
status: -2,
message: "在这些分支之间的合并请求已存在:<a href='/projects/#{@project.id}/merge/#{can_merge.first.id}/Messagecount''>#{can_merge.first.try(:title)}</a>",
message: "在这些分支之间的合并请求已存在:<a href='/projects/#{@owner.login}/#{@project.identifier}/pulls/#{can_merge.first.id}/Messagecount''>#{can_merge.first.try(:title)}</a>",
}
else
normal_status(0, "可以合并")
@ -235,9 +190,19 @@ class PullRequestsController < ApplicationController
end
def files
@files_result = Gitea::PullRequest::FilesService.call(@owner.login, @project.identifier, @pull_request.gpid, current_user&.gitea_token)
# render json: @files_result
end
def commits
@commits_result = Gitea::PullRequest::CommitsService.call(@owner.login, @project.identifier, @pull_request.gpid, current_user&.gitea_token)
# render json: @commits_result
end
private
def set_user
@user = @project.owner
def load_pull_request
@pull_request = PullRequest.find params[:id]
end
def find_pull_request
@ -253,7 +218,7 @@ class PullRequestsController < ApplicationController
def get_relatived
@project_tags = @project.issue_tags&.select(:id,:name, :color).as_json
@project_versions = @project.versions&.select(:id,:name, :status).as_json
@project_members = @project.members_user_infos
@project_members = @project.all_developers
@project_priories = IssuePriority&.select(:id,:name, :position).as_json
end
@ -267,7 +232,8 @@ class PullRequestsController < ApplicationController
}
@requests_params = @local_params.merge({
assignee: current_user.try(:login),
assignees: ["#{params[:assigned_login].to_s}"],
# assignees: ["#{params[:assigned_login].to_s}"],
assignees: ["#{current_user.try(:login).to_s}"],
labels: params[:issue_tag_ids],
due_date: Time.now
})

View File

@ -1,19 +1,39 @@
class RepositoriesController < ApplicationController
include ApplicationHelper
include OperateProjectAbilityAble
include Repository::LanguagesPercentagable
before_action :require_login, only: %i[edit update create_file update_file delete_file sync_mirror]
before_action :load_repository
before_action :authorizate!, except: [:sync_mirror, :tags, :commit]
before_action :authorizate_user_can_edit_repo!, only: %i[sync_mirror]
before_action :get_ref, only: %i[entries sub_entries top_counts]
before_action :get_ref, only: %i[entries sub_entries top_counts file]
before_action :get_latest_commit, only: %i[entries sub_entries top_counts]
before_action :get_statistics, only: %i[top_counts]
def files
result = @project.educoder? ? nil : Gitea::Repository::Files::GetService.call(@owner, @project.identifier, @ref, params[:search], @owner.gitea_token)
render json: result
end
# 新版项目详情
def detail
@user = current_user
@result = Repositories::DetailService.call(@owner, @repository, @user)
@project_fork_id = @project.try(:forked_from_project_id)
if @project_fork_id.present?
@fork_project = Project.find_by(id: @project_fork_id)
@fork_project_user = @fork_project.owner
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def show
@user = current_user
@repo = @project.repository
@result = Gitea::Repository::GetService.new(@project.owner, @project.identifier).call
@result = @project.forge? ? Gitea::Repository::GetService.new(@owner, @project.identifier).call : nil
@project_fork_id = @project.try(:forked_from_project_id)
if @project_fork_id.present?
@fork_project = Project.find_by(id: @project_fork_id)
@ -26,62 +46,113 @@ class RepositoriesController < ApplicationController
def entries
@project.increment!(:visits)
@project_owner = @project.owner
@entries = Gitea::Repository::Entries::ListService.new(@project_owner, @project.identifier, ref: @ref).call
@entries = @entries.present? ? @entries.sort_by{ |hash| hash['type'] } : []
@path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/"
if @project.educoder?
@entries = Educoder::Repository::Entries::ListService.call(@project&.project_educoder.repo_name)
else
@entries = Gitea::Repository::Entries::ListService.new(@owner, @project.identifier, ref: @ref).call
@entries = @entries.present? ? @entries.sort_by{ |hash| hash['type'] } : []
@path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/"
# TODO
# 临时处理readme文件问题
result = Gitea::Repository::Readme::GetService.call(@owner.login, @project.identifier, @ref, @owner&.gitea_token)
@readme =
if result[:status] == :success
result[:body]
else
{}
end
end
end
def top_counts
@result = Gitea::Repository::GetService.new(@project.owner, @project.identifier).call
@result = @project.educoder? ? nil : Gitea::Repository::GetService.new(@project.owner, @project.identifier).call
end
def sub_entries
file_path_uri = URI.parse(URI.encode(params[:filepath].to_s.strip))
interactor = Repositories::EntriesInteractor.call(@project.owner, @project.identifier, file_path_uri, ref: @ref)
if interactor.success?
result = interactor.result
return @sub_entries = [] if result.is_a?(Hash) && result[:status] == -1
@sub_entries = result.is_a?(Array) ? result : [result]
@sub_entries = @sub_entries.sort_by{ |hash| hash['type'] }
if @project.educoder?
if params[:type] === 'file'
@sub_entries = Educoder::Repository::Entries::GetService.call(@project&.project_educoder&.repo_name, file_path_uri)
logger.info "######### sub_entries: #{@sub_entries}"
return render_error('该文件暂未开放,敬请期待.') if @sub_entries['status'].to_i === -1
tmp_entries = [{
"content" => @sub_entries['data']['content'],
"type" => "blob"
}]
@sub_entries = {
"trees"=>tmp_entries,
"commits" => [{}]
}
else
@sub_entries = Educoder::Repository::Entries::ListService.call(@project&.project_educoder&.repo_name, {path: file_path_uri})
end
else
render_error(interactor.error)
interactor = Repositories::EntriesInteractor.call(@owner, @project.identifier, file_path_uri, ref: @ref)
if interactor.success?
result = interactor.result
@sub_entries = result.is_a?(Array) ? result.sort_by{ |hash| hash['type'] } : result
else
render_error(interactor.error)
end
end
end
def commits
@project_owner = @project.owner
@hash_commit = Gitea::Repository::Commits::ListService.new(@project_owner.login, @project.identifier,
@hash_commit = Gitea::Repository::Commits::ListService.new(@owner.login, @project.identifier,
sha: params[:sha], page: params[:page], limit: params[:limit], token: current_user&.gitea_token).call
end
def commit
@commit = Gitea::Repository::Commits::GetService.new(@repository.user.login, @repository.identifier, params[:sha], current_user.gitea_token).call
@sha = params[:sha]
@commit = Gitea::Repository::Commits::GetService.call(@owner.login, @repository.identifier, @sha, current_user&.gitea_token)
@commit_diff = Gitea::Repository::Commits::GetService.call(@owner.login, @repository.identifier, @sha, current_user&.gitea_token, {diff: true})
end
def tags
@tags = Gitea::Repository::Tags::ListService.new(current_user&.gitea_token, @project.owner.login, @project.identifier, {page: params[:page], limit: params[:limit]}).call
result = Gitea::Repository::Tags::ListService.call(current_user&.gitea_token, @owner.login, @project.identifier, {page: params[:page], limit: params[:limit]})
@tags = result.is_a?(Hash) && result.key?(:status) ? [] : result
end
def contributors
@contributors = Gitea::Repository::Contributors::GetService.call(@owner, @repository.identifier)
end
def edit
return render_forbidden if !@project.manager?(current_user) && !current_user.admin?
end
def create_file
interactor = Gitea::CreateFileInteractor.call(current_user.gitea_token, @project.owner.login, content_params)
interactor = Gitea::CreateFileInteractor.call(current_user.gitea_token, @owner.login, content_params)
if interactor.success?
@file = interactor.result
create_new_pr(params)
# create_new_pr(params)
#如果是更新流水线文件
if params[:pipeline_id]
update_pipeline(params[:pipeline_id])
end
else
render_error(interactor.error)
end
end
def update_pipeline(pipeline_id)
pipeline = Ci::Pipeline.find(pipeline_id)
if pipeline
pipeline.update!(sync: 1)
end
end
def update_file
interactor = Gitea::UpdateFileInteractor.call(current_user.gitea_token, @project.owner.login, params.merge(identifier: @project.identifier))
interactor = Gitea::UpdateFileInteractor.call(current_user.gitea_token, @owner.login, params.merge(identifier: @project.identifier))
if interactor.success?
@file = interactor.result
create_new_pr(params)
# TODO: 是否创建pr
# create_new_pr(params)
render_result(1, "更新成功")
else
render_error(interactor.error)
@ -89,7 +160,7 @@ class RepositoriesController < ApplicationController
end
def delete_file
interactor = Gitea::DeleteFileInteractor.call(current_user.gitea_token, @project.owner.login, params.merge(identifier: @project.identifier))
interactor = Gitea::DeleteFileInteractor.call(current_user.gitea_token, @owner.login, params.merge(identifier: @project.identifier))
if interactor.success?
@file = interactor.result
render_result(1, "文件删除成功")
@ -110,6 +181,17 @@ class RepositoriesController < ApplicationController
render_ok
end
def readme
result = Gitea::Repository::Readme::GetService.call(@owner.login, @repository.identifier, params[:ref], current_user&.gitea_token)
@readme = result[:status] === :success ? result[:body] : nil
render json: @readme
end
def languages
render json: languages_precentagable
end
private
def find_project
@ -135,18 +217,18 @@ class RepositoriesController < ApplicationController
end
def get_statistics
@branches_count = Gitea::Repository::Branches::ListService.new(@project.owner, @project.identifier).call&.size
@tags_count = Gitea::Repository::Tags::ListService.new(current_user&.gitea_token, @project.owner.login, @project.identifier).call&.size
@branches_count = @project.educoder? ? 0 : Gitea::Repository::Branches::ListService.new(@project.owner, @project.identifier).call&.size
@tags_count = @project.educoder? ? 0 : Gitea::Repository::Tags::ListService.new(current_user&.gitea_token, @project.owner.login, @project.identifier).call&.size
end
def get_ref
@ref = params[:ref] || "master"
@ref = params[:ref] || @project&.default_branch
end
def get_latest_commit
latest_commit = project_commits
@latest_commit = latest_commit[:body][0] if latest_commit.present?
@commits_count = latest_commit[:total_count] if latest_commit.present?
latest_commit = @project.educoder? ? nil : project_commits
@latest_commit = latest_commit.present? ? latest_commit[:body][0] : nil
@commits_count = latest_commit.present? ? latest_commit[:total_count] : 0
end
def content_params
@ -214,14 +296,14 @@ class RepositoriesController < ApplicationController
issue_type: "1",
tracker_id: 2,
status_id: 1,
priority_id: 1
priority_id: params[:priority_id] || "2"
}
@pull_issue = Issue.new(issue_params)
if @pull_issue.save!
local_requests = PullRequest.new(local_params.merge(user_id: current_user.try(:id), project_id: @project.id, issue_id: @pull_issue.id))
if local_requests.save
gitea_request = Gitea::PullRequest::CreateService.new(current_user.try(:gitea_token), @project.owner, @project.try(:identifier), requests_params).call
if gitea_request && local_requests.update_attributes(gpid: gitea_request["number"])
gitea_request = Gitea::PullRequest::CreateService.new(current_user.try(:gitea_token), @owner.login, @project.try(:identifier), requests_params).call
if gitea_request[:status] == :success && local_requests.update_attributes(gpid: gitea_request["body"]["number"])
local_requests.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
end
end

View File

@ -1,6 +1,57 @@
class SettingsController < ApplicationController
def show
@old_projects_url = nil
@old_projects_url = "https://www.trustie.net/users/#{current_user.try(:login)}/projects" if User.current.logged?
@old_projects_url = nil
get_add_menu
get_common_menu
get_personal_menu
end
private
def get_add_menu
@add = []
Site.add.select(:id, :name, :url, :key).to_a.map(&:serializable_hash).each do |site|
hash = {}
site.each {|k, v|
hash.merge!("#{k}": get_site_url(k, v))
}
@add << hash
end
end
def get_common_menu
@common = {}
Site.common.select(:url, :key).each do |site|
next if site["url"].to_s.include?("current_user") && !User.current.logged?
@common.merge!("#{site["key"]}": append_http(reset_site_url(site["url"])))
end
end
def get_personal_menu
@personal = []
if User.current.logged?
Site.personal.select(:id, :name, :url, :key).to_a.map(&:serializable_hash).each do |site|
hash = {}
site.each {|k, v|
hash.merge!("#{k}": get_site_url(k, v))
}
@personal << hash
end
end
end
def get_site_url(key, value)
key.to_s === "url" ? append_http(reset_site_url(value)) : reset_site_url(value)
end
def reset_site_url(url)
return url unless url.to_s.include?("current_user")
split_arr = url.split('current_user')
split_arr.length > 1 ? split_arr.join(current_user&.login) : (split_arr << current_user&.login).join('')
end
def append_http(url)
url.to_s.start_with?("http") ? url : [request.protocol, request.host_with_port, url].join('')
end
end

View File

@ -0,0 +1,25 @@
class StatisticController < ApplicationController
# 平台概况
def platform_profile
@platform_user_query = Statistic::PlatformUserQuery.new(params).call
@platform_project_query = Statistic::PlatformProjectQuery.new(params).call
@platform_course_query = Statistic::PlatformCourseQuery.new(params).call
end
# 平台代码提交数据
def platform_code
@platform_pull_request_query = Statistic::PlatformPullRequestQuery.new(params).call
@platform_commit_query = Statistic::PlatformCommitQuery.new(params,current_user).call
end
# 项目案例活跃度排行榜
def active_project_rank
@active_project_rank_query = Statistic::ActiveProjectRankQuery.new(params, current_user).call
end
# 开发者活跃度排行榜
def active_developer_rank
@active_developer_rank_query = Statistic::ActiveDeveloperRankQuery.new(params, current_user).call
end
end

View File

@ -12,11 +12,11 @@ class SyncForgeController < ApplicationController
end
end
# def create
# def create
# ActiveRecord::Base.transaction do
# params.permit!
# sync_params = params[:sync_params]
# project_user = User.where(login: sync_params[:owner_login])&.first
# project_user = User.where(login: sync_params[:owner_login])&.first
# #以前已同步的项目,那么肯定存在仓库
# SyncLog.sync_log("=================begin_to_sync_forge: project_identifier: #{sync_params[:identifier]}========")
# user_projects = Project.where(user_id: project_user.id)
@ -38,7 +38,7 @@ class SyncForgeController < ApplicationController
# check_sync_project(project, sync_params)
# else #新建项目
# SyncLog.sync_log("=================begin_to_create_new_project========")
# project_params = {
# repository_name: sync_params[:identifier],
# user_id: project_user.id,
@ -53,7 +53,7 @@ class SyncForgeController < ApplicationController
# new_project_score = ProjectScore.create(score_params)
# SyncLog.sync_log("=================new_project_score:#{new_project_score.try(:id)}========")
# end
# SyncRepositoryJob.perform_later(sync_params[:owner_login], sync_params[:identifier], sync_params[:repository], get_sudomain) if sync_params[:repository].present?
# check_new_project(project, sync_params)
# else
@ -115,7 +115,7 @@ class SyncForgeController < ApplicationController
# SyncLog.sync_log("=================sync_user_failed====#{e}")
# end
# private
# private
# def check_sync_project(project,sync_params)
# begin
@ -125,8 +125,8 @@ class SyncForgeController < ApplicationController
# # end
# SyncLog.sync_log("----begin_to_check_sync_project----project_id:#{project.id}---------------")
# change_project_score(project, sync_params[:project_score], sync_params[:repository]) if sync_params[:repository].present? #更新project_score
# change_project_issues(project, sync_params[:issues],project.id, gitea_main)
# change_project_score(project, sync_params[:project_score], sync_params[:repository]) if sync_params[:repository].present? #更新project_score
# change_project_issues(project, sync_params[:issues],project.id, gitea_main)
# change_project_members(project, sync_params[:members],gitea_main)
# change_project_versions(project, sync_params[:project_versions],gitea_main)
# change_project_watchers(project, sync_params[:project_watchers],gitea_main)
@ -134,7 +134,7 @@ class SyncForgeController < ApplicationController
# rescue => e
# SyncLog.sync_log("=========check_sync_project_errors:#{e}===================")
# end
# end
# def check_new_project(project,sync_params)
@ -167,7 +167,7 @@ class SyncForgeController < ApplicationController
# parent_id: project.id
# }
# SyncProjectsJob.perform_later(sync_projects_params,gitea_main)
# SyncLog.sync_log("***6. end_to_sync_parises---------------")
# end
# end
@ -189,7 +189,7 @@ class SyncForgeController < ApplicationController
# end
# end
# pre_project_score.save! if change_num > 0 #如果 project_score有变化则更新
# else
# else
# ProjectScore.create!(project_scores.merge(project_id: project.id))
# end
# SyncLog.sync_log("***1. end_to_sync_project_score---------------")
@ -206,7 +206,7 @@ class SyncForgeController < ApplicationController
# SyncLog.sync_log("***2--01. forge_issue_ids-#{forge_issue_ids.size.to_i}--------------")
# if forge_issue_ids.size.to_i <= old_issues_params[:count].to_i
# diff_issue_ids = old_issues_params[:ids] - forge_issue_ids
# if diff_issue_ids.size == 0 #issue数量一样判断评论是否有增减
# forge_journal_ids = Journal.select([:id, :journalized_id, :journalized_type]).where(journalized_id: forge_issue_ids).pluck(:id)
# diff_journal_ids = old_issues_params[:journals][:ids] - forge_journal_ids
@ -241,10 +241,10 @@ class SyncForgeController < ApplicationController
# # }
# # SyncLog.sync_log("***2--03. sync_projects_params_groups-#{sync_projects_params}--------------")
# # SyncProjectsJob.perform_later(sync_projects_params, gitea_main)
# end
# end
# # SyncProjectsJob.perform_later(sync_projects_params, gitea_main) if sync_projects_params.present?
# SyncLog.sync_log("***2. end_to_syncissues---------------")
# rescue Exception => e
@ -265,7 +265,7 @@ class SyncForgeController < ApplicationController
# parent_id: project.id
# }
# SyncProjectsJob.perform_later(sync_projects_params,gitea_main)
# end
# end
# SyncLog.sync_log("***5. begin_to_sync_watchers---------------")
@ -285,7 +285,7 @@ class SyncForgeController < ApplicationController
# }
# SyncProjectsJob.perform_later(sync_projects_params,gitea_main)
# end
# SyncLog.sync_log("***4. end_to_sync_versions---------------")
# end
# end
@ -304,12 +304,12 @@ class SyncForgeController < ApplicationController
# }
# SyncProjectsJob.perform_later(sync_projects_params,gitea_main)
# end
# SyncLog.sync_log("***3. end_to_sync_members---------------")
# end
# end
# def check_token
# def check_token
# sync_params = params[:sync_params]
# unless sync_params[:token] && sync_params[:token] == get_token
# render json: {message: "token_errors"}
@ -331,4 +331,4 @@ class SyncForgeController < ApplicationController
# return gitea_main
# end
end
end

View File

@ -0,0 +1,18 @@
class Users::AppliedMessagesController < Users::BaseController
before_action :check_auth
after_action :view_messages, only: [:index]
def index
@applied_messages = @_observed_user.applied_messages.order(viewed: :asc, created_at: :desc)
@applied_messages = paginate @applied_messages
end
private
def check_auth
return render_forbidden unless current_user.admin? || observed_logged_user?
end
def view_messages
@applied_messages.update_all(viewed: 'viewed')
end
end

View File

@ -0,0 +1,39 @@
class Users::AppliedProjectsController < Users::BaseController
before_action :check_auth
before_action :find_applied_project, except: [:index]
before_action :find_project, except: [:index]
def index
@applied_projects = AppliedProject.where(project_id: observed_user.full_admin_projects)
@applied_projects = paginate @applied_projects.order("created_at desc")
end
# 接受申请
def accept
@applied_project = Projects::AcceptJoinService.call(current_user, @applied_project)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
# 拒绝申请
def refuse
@applied_project = Projects::RefuseJoinService.call(current_user, @applied_project)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def check_auth
return render_forbidden unless current_user.admin? || observed_logged_user?
end
def find_applied_project
@applied_project = AppliedProject.find_by_id params[:id]
end
def find_project
@project = @applied_project.project
end
end

View File

@ -0,0 +1,41 @@
class Users::AppliedTransferProjectsController < Users::BaseController
before_action :check_auth
before_action :find_applied_transfer_project, except: [:index]
before_action :find_project, except: [:index]
def index
user_collection_sql = AppliedTransferProject.where(owner_id: @_observed_user.id).to_sql
org_collection_sql = AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @_observed_user.id}, teams: {authorize: %w(admin owner)} )).to_sql
@applied_transfer_projects = AppliedTransferProject.from("( #{ user_collection_sql } UNION #{ org_collection_sql } ) AS applied_transfer_projects")
@applied_transfer_projects = paginate @applied_transfer_projects.order("created_at desc")
end
# 接受迁移
def accept
@applied_transfer_project = Projects::AcceptTransferService.call(current_user, @project)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
# 拒绝迁移
def refuse
@applied_transfer_project = Projects::RefuseTransferService.call(current_user, @project)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def check_auth
return render_forbidden unless current_user.admin? || observed_logged_user?
end
def find_applied_transfer_project
@applied_transfer_project = AppliedTransferProject.find_by_id params[:id]
end
def find_project
@project = @applied_transfer_project.project
end
end

View File

@ -1,8 +1,8 @@
class Users::BanksController < Users::BaseController
before_action :params_filter
def index
order = params[:order] || "updated_at"
sort = params[:sort] || "desc"
order = CourseList.column_names.include?(params[:order]) ? params[:order] : "updated_at"
sort = %w(desc asc).includes?(params[:sort]) ? params[:sort] : "desc"
@banks = @object_type.classify.constantize.where(@object_filter)
@course_lists = CourseList.where(id: @banks.pluck(:course_list_id))
@banks = @banks.where(course_list_id: params[:tag_id]) unless params[:tag_id].blank?

View File

@ -0,0 +1,26 @@
class Users::HeadmapsController < Users::BaseController
def index
result = Gitea::User::HeadmapService.call(observed_user.login, start_stamp, end_stamp)
@headmaps = result[2]
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def start_stamp
if params[:year].present?
Date.new(params[:year], 1).to_time.to_i
else
Date.today.to_time.to_i - 365*24*60*60
end
end
def end_stamp
if params[:year].present?
Date.new(params[:year], 1).to_time.to_i + 365*24*60*60
else
Date.today.to_time.to_i
end
end
end

View File

@ -0,0 +1,45 @@
class Users::IsPinnedProjectsController < Users::BaseController
before_action :private_user_resources!, only: [:pin]
def index
@is_pinned_projects = observed_user.pinned_projects.order(position: :desc, created_at: :asc).includes(project: [:project_category, :project_language, :repository]).order(position: :desc)
@is_pinned_projects = kaminari_paginate(@is_pinned_projects)
end
def pin
observed_user.is_pinned_project_ids = is_pinned_project_ids
render_ok
rescue ActiveRecord::RecordNotFound => e
render_not_found
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def update
@pinned_project = PinnedProject.find_by_id(params[:id])
@pinned_project.attributes = pinned_project_params
if @pinned_project.save
render_ok
else
render_error
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
private
def is_pinned_project_ids
if params[:is_pinned_project_ids].present?
return params[:is_pinned_project_ids].select{|id| observed_user.full_member_projects.visible.pluck(:id).include?(id.to_i) }
end
if params[:is_pinned_project_id].present?
return observed_user.is_pinned_project_ids unless observed_user.full_member_projects.visible.pluck(:id).include?(params[:is_pinned_project_id].to_i)
return observed_user.is_pinned_project_ids.include?(params[:is_pinned_project_id].to_i) ? observed_user.is_pinned_project_ids : observed_user.is_pinned_project_ids.push(params[:is_pinned_project_id].to_i)
end
end
def pinned_project_params
params.require(:pinned_project).permit(:position)
end
end

View File

@ -0,0 +1,25 @@
class Users::OrganizationsController < Users::BaseController
def index
if current_user.logged?
logged_organizations_sql = observed_user.organizations.with_visibility(%w(common limited)).to_sql
privacy_organizations_sql = observed_user.organizations.with_visibility("privacy").joins(:organization_users).where(organization_users: {user_id: current_user.id}).to_sql
@organizations = Organization.from("( #{ logged_organizations_sql } UNION #{ privacy_organizations_sql } ) AS users")
else
@organizations = observed_user.organizations.with_visibility("common")
end
@organizations = @organizations.ransack(login_cont: params[:search]).result if params[:search].present?
@organizations = @organizations.includes(:organization_extension).order("organization_extensions.#{sort_by} #{sort_direction}")
@organizations = kaminari_paginate(@organizations)
end
private
def sort_by
OrganizationExtension.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at'
end
def sort_direction
%w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc'
end
end

View File

@ -0,0 +1,11 @@
class Users::ProjectTrendsController < Users::BaseController
def index
if params[:date].present?
@project_trends = observed_user.project_trends.where("DATE(created_at) = ?", params[:date])
else
@project_trends = observed_user.project_trends
end
@project_trends = kaminari_paginate(@project_trends.includes(:trend, :project).order(created_at: :desc))
end
end

View File

@ -0,0 +1,217 @@
class Users::StatisticsController < Users::BaseController
before_action :preload_develop_data, only: [:develop]
# 近期活动统计
def activity
date_range = (1.week.ago.to_date..Date.today).to_a
commit_request = Gitea::User::HeadmapService.call(observed_user.login, 1.week.ago.to_date.to_time.to_i, Date.today.to_time.to_i)
commit_data = commit_request[2]
@date_data = []
@issue_data = []
@pull_request_data = []
@commit_data = []
date_range.each do |date|
@date_data << date.strftime("%Y.%m.%d")
@issue_data << observed_user.issues.where("DATE(created_on) = ?", date).size
@pull_request_data << observed_user.pull_requests.where("DATE(created_at) = ?", date).size
date_commit_data = commit_data.select{|item| item["timestamp"] == date.to_time.to_i}
@commit_data << (date_commit_data.blank? ? 0 : date_commit_data[0]["contributions"].to_i)
end
render :json => {dates: @date_data, issues_count: @issue_data, pull_requests_count: @pull_request_data, commits_count: @commit_data}
end
# 开发能力
def develop
if params[:start_time].present? && params[:end_time].present?
# 影响力
@influence = (60.0 + @follow_count / (@follow_count + 10.0) * 40.0).to_i
@platform_influence = (60.0 + @platform_follow_count / (@platform_follow_count + 10.0) * 40.0).to_i
# 贡献度
@contribution = (60.0 + @pullrequest_count / (@pullrequest_count + 10.0) * 40.0).to_i
@platform_contribution = (60.0 + @platform_pullrequest_count / (@platform_pullrequest_count + 10.0) * 40.0).to_i
# 活跃度
@activity = (60.0 + @issues_count / (@issues_count + 10.0) * 40.0).to_i
@platform_activity = (60.0 + @platform_issues_count / (@platform_issues_count + 10.0) * 40.0).to_i
# 项目经验
@experience = 10 * @project_count + 5 * @fork_count + @project_watchers_count + @project_praises_count
@experience = (60.0 + @experience / (@experience + 100.0) * 40.0).to_i
@platform_experience = 10 * @platform_project_count + 5 * @platform_fork_count + @platform_project_watchers_count + @platform_project_praises_count
@platform_experience = (60.0 + @platform_experience / (@platform_experience + 100.0) * 40.0).to_i
# 语言能力
@language = (60.0 + @project_languages_count.length / (@project_languages_count.length + 5.0) * 40.0).to_i
@platform_language = (60.0 + @platform_project_languages_count.length / (@platform_project_languages_count.length + 5.0) * 40.0).to_i
# 语言百分比
@languages_percent = Hash.new
for key in @project_languages_count.keys do
@languages_percent[key] = (@project_languages_count[key].to_f / @project_languages_count.values.sum).round(2)
end
@platform_languages_percent = Hash.new
for key in @platform_project_languages_count.keys do
@platform_languages_percent[key] = (@platform_project_languages_count[key].to_f / @platform_project_languages_count.values.sum).round(2)
end
# 各门语言分数
@each_language_score = Hash.new
for key in @project_languages_count.keys do
@each_language_score[key] = (60.0 + @project_languages_count[key] / (@project_languages_count[key] + 5.0) * 40.0).to_i
end
@platform_each_language_score = Hash.new
for key in @platform_project_languages_count.keys do
@platform_each_language_score[key] = (60.0 + @platform_project_languages_count[key] / (@platform_project_languages_count[key] + 5.0) * 40.0).to_i
end
else
# 影响力
@influence = (60.0 + @follow_count / (@follow_count + 20.0) * 40.0).to_i
@platform_influence = (60.0 + @platform_follow_count / (@platform_follow_count + 20.0) * 40.0).to_i
# 贡献度
@contribution = (60.0 + @pullrequest_count / (@pullrequest_count + 20.0) * 40.0).to_i
@platform_contribution = (60.0 + @platform_pullrequest_count / (@platform_pullrequest_count + 20.0) * 40.0).to_i
# 活跃度
@activity = (60.0 + @issues_count / (@issues_count + 80.0) * 40.0).to_i
@platform_activity = (60.0 + @platform_issues_count / (@platform_issues_count + 80.0) * 40.0).to_i
# 项目经验
@experience = 10 * @project_count + 5 * @fork_count + @project_watchers_count + @project_praises_count
@experience = (60.0 + @experience / (@experience + 100.0) * 40.0).to_i
@platform_experience = 10 * @platform_project_count + 5 * @platform_fork_count + @platform_project_watchers_count + @platform_project_praises_count
@platform_experience = (60.0 + @platform_experience / (@platform_experience + 100.0) * 40.0).to_i
# 语言能力
@language = (60.0 + @project_languages_count.length / (@project_languages_count.length + 5.0) * 40.0).to_i
@platform_language = (60.0 + @platform_project_languages_count.length / (@platform_project_languages_count.length + 5.0) * 40.0).to_i
# 语言百分比
@languages_percent = Hash.new
for key in @project_languages_count.keys do
@languages_percent[key] = (@project_languages_count[key].to_f / @project_languages_count.values.sum).round(2)
end
# @platform_languages_percent = Hash.new
# for key in @platform_project_languages_count.keys do
# @platform_languages_percent[key] = (@platform_project_languages_count[key].to_f / @platform_project_languages_count.values.sum).round(2)
# end
# 各门语言分数
@each_language_score = Hash.new
for key in @project_languages_count.keys do
@each_language_score[key] = (60.0 + @project_languages_count[key] / (@project_languages_count[key] + 5.0) * 40.0).to_i
end
# @platform_each_language_score = Hash.new
# for key in @platform_project_languages_count.keys do
# @platform_each_language_score[key] = (60.0 + @platform_project_languages_count[key] / (@platform_project_languages_count[key] + 5.0) * 40.0).to_i
# end
end
end
# 角色定位
def role
full_member_projects = observed_user.full_member_projects
owner_projects = filter_member_projects_by_role("Owner")
manager_projects = filter_member_projects_by_role("Manager").where.not(id: owner_projects.ids)
developer_projects = filter_member_projects_by_role("Developer").where.not(id: owner_projects.ids + manager_projects.ids)
reporter_projects = filter_member_projects_by_role("Reporter").where.not(id: owner_projects.ids + manager_projects.ids + developer_projects.ids)
@full_member_projects_count = full_member_projects.size
@owner_projects_count = owner_projects.size
@manager_projects_count = manager_projects.size
@developer_projects_count = developer_projects.size
@reporter_projects_count = reporter_projects.size
end
# 专业定位
def major
# 参与项目
join_normal_projects_sql = Project.members_projects(observed_user.id).to_sql
join_org_projects_sql = Project.joins(team_projects: [team: :team_users]).where(team_users: {user_id: observed_user.id}).to_sql
# 关注项目
star_projects_sql = Project.joins(:watchers).where(watchers: {watchable_type: "Project", user_id: observed_user.id}).to_sql
# fork项目
fork_projects_sql = Project.where(id: observed_user.fork_users.select(:id, :fork_project_id).pluck(:fork_project_id)).to_sql
major_projects = Project.from("( #{ join_normal_projects_sql} UNION #{ join_org_projects_sql } UNION #{ star_projects_sql } UNION #{fork_projects_sql}) AS projects").distinct
categories = ProjectCategory.joins(:projects).merge(Project.where(id: time_filter(major_projects, 'created_on'))).distinct.pluck(:name)
render :json => {categories: categories}
end
private
def time_filter(collection, time_field)
if params[:start_time].present? && params[:end_time].present?
return collection.where("#{time_field} > ? AND #{time_field} < ?", Time.at(params[:start_time].to_i).beginning_of_day, Time.at(params[:end_time].to_i).end_of_day)
else
return collection
end
rescue
return collection
end
def filter_member_projects_by_role(role)
case role
when 'Owner'
normal_projects_sql = Project.joins(members: :roles).where(user_id: observed_user.id).where(members: {user_id: observed_user.id}, roles: {name: 'Manager'}).to_sql
org_projects_sql = Project.joins(:owner, teams: :team_users).where(users: {type: 'Organization'}, teams: {authorize: "owner"}, team_users: {user_id: observed_user.id}).to_sql
when "Manager"
normal_projects_sql = Project.joins(members: :roles).where.not(user_id: observed_user.id).where(members: {user_id: observed_user.id}, roles: {name: 'Manager'}).to_sql
org_projects_sql = Project.joins(:owner, teams: :team_users).where(users: {type: 'Organization'}, teams: {authorize: "admin"}, team_users: {user_id: observed_user.id}).to_sql
when "Developer"
normal_projects_sql = Project.joins(members: :roles).where.not(user_id: observed_user.id).where(members: {user_id: observed_user.id}, roles: {name: 'Developer'}).to_sql
org_projects_sql = Project.joins(:owner, teams: :team_users).where(users: {type: 'Organization'}, teams: {authorize: "write"}, team_users: {user_id: observed_user.id}).to_sql
when "Reporter"
normal_projects_sql = Project.joins(members: :roles).where.not(user_id: observed_user.id).where(members: {user_id: observed_user.id}, roles: {name: 'Reporter'}).to_sql
org_projects_sql = Project.joins(:owner, teams: :team_users).where(users: {type: 'Organization'}, teams: {authorize: "read"}, team_users: {user_id: observed_user.id}).to_sql
end
return time_filter(Project.from("( #{normal_projects_sql} UNION #{org_projects_sql} ) AS projects").distinct, 'created_on')
end
def preload_develop_data
if params[:start_time].present? && params[:end_time].present?
# 用户被follow数量
@follow_count = time_filter(Watcher.where(watchable: observed_user), 'created_at').count
@platform_follow_count = time_filter(Watcher.where(watchable_type: 'User'), 'created_at').count
# 用户pr数量
@pullrequest_count = time_filter(PullRequest.where(user_id: observed_user.id), 'created_at').count
@platform_pullrequest_count = time_filter(PullRequest, 'created_at').count
# 用户issue数量
@issues_count = time_filter(Issue.where(author_id: observed_user.id), 'created_on').count
@platform_issues_count = time_filter(Issue, 'created_on').count
# 用户总项目数
@project_count = time_filter(Project.where(user_id:observed_user.id), 'created_on').count
@platform_project_count = time_filter(Project, 'created_on').count
# 用户项目被fork数量
@fork_count = time_filter(Project.where(user_id:observed_user.id), 'created_on').sum("forked_count")
@platform_fork_count = time_filter(Project, 'created_on').sum("forked_count")
# 用户项目关注数
@project_watchers_count = time_filter(Project.where(user_id: observed_user.id), 'created_on').sum("watchers_count")
@platform_project_watchers_count = time_filter(Project, 'created_on').sum("watchers_count")
# 用户项目点赞数
@project_praises_count = time_filter(Project.where(user_id: observed_user.id), 'created_on').sum("praises_count")
@platform_project_praises_count = time_filter(Project, 'created_on').sum("praises_count")
# 用户不同语言项目数量
@project_languages_count = time_filter(Project.where(user_id: observed_user.id), 'created_on').joins(:project_language).group("project_languages.name").count
@platform_project_languages_count = time_filter(Project, 'created_on').joins(:project_language).group("project_languages.name").count
else
# 用户被follow数量
@follow_count = Cache::UserFollowCountService.call(observed_user)
@platform_follow_count = Cache::PlatformFollowCountService.call
# 用户pr数量
@pullrequest_count = Cache::UserPullrequestCountService.call(observed_user)
@platform_pullrequest_count = Cache::PlatformPullrequestCountService.call
# 用户issue数量
@issues_count = Cache::UserIssueCountService.call(observed_user)
@platform_issues_count = Cache::PlatformIssueCountService.call
# 用户总项目数
@project_count = Cache::UserProjectCountService.call(observed_user)
@platform_project_count = Cache::PlatformProjectCountService.call
# 用户项目被fork数量
@fork_count = Cache::UserProjectForkCountService.call(observed_user)
@platform_fork_count = Cache::PlatformProjectForkCountService.call
# 用户项目关注数
@project_watchers_count = Cache::UserProjectWatchersCountService.call(observed_user)
@platform_project_watchers_count = Cache::PlatformProjectWatchersCountService.call
# 用户项目点赞数
@project_praises_count = Cache::UserProjectPraisesCountService.call(observed_user)
@platform_project_praises_count = Cache::PlatformProjectPraisesCountService.call
# 用户不同语言项目数量
@project_languages_count = Cache::UserProjectLanguagesCountService.call(observed_user)
@platform_project_languages_count = Cache::PlatformProjectLanguagesCountService.call
end
end
end

View File

@ -1,10 +1,25 @@
class UsersController < ApplicationController
include ApplicationHelper
include Ci::DbConnectable
before_action :load_user, only: [:show, :homepage_info, :sync_token, :sync_gitea_pwd, :projects, :watch_users, :fan_users]
before_action :check_user_exist, only: [:show, :homepage_info,:projects, :watch_users, :fan_users]
before_action :require_login, only: %i[me list]
before_action :load_user, only: [:show, :homepage_info, :sync_token, :sync_gitea_pwd, :projects, :watch_users, :fan_users, :hovercard]
before_action :check_user_exist, only: [:show, :homepage_info,:projects, :watch_users, :fan_users, :hovercard]
before_action :require_login, only: %i[me list sync_user_info]
before_action :connect_to_ci_db, only: [:get_user_info]
before_action :convert_image!, only: [:update]
skip_before_action :check_sign, only: [:attachment_show]
def connect_to_ci_db(options={})
if !(current_user && !current_user.is_a?(AnonymousUser) && current_user.devops_certification?)
return
end
if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE
connect_to_trustie_ci_database(options)
else
connect_to_ci_database(options)
end
end
def list
scope = User.active.recent.like(params[:search]).includes(:user_extension)
@total_count = scope.size
@ -13,11 +28,26 @@ class UsersController < ApplicationController
def show
#待办事项,现在未做
@undo_events = 0
if User.current.admin? || User.current.login == @user.login
@waiting_applied_messages = @user.applied_messages.waiting
@common_applied_transfer_projects = AppliedTransferProject.where(owner_id: @user.id).common + AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @user.id}, teams: {authorize: %w(admin owner)} )).common
@common_applied_projects = AppliedProject.where(project_id: @user.full_admin_projects).common
@undo_events = @waiting_applied_messages.size + @common_applied_transfer_projects.size + @common_applied_projects.size
else
@waiting_applied_messages = AppliedMessage.none
@common_applied_transfer_projects = AppliedTransferProject.none
@common_applied_projects = AppliedProject.none
@undo_events = 0
end
#用户的组织数量
# @user_composes_count = @user.composes.size
@user_composes_count = 0
user_projects = User.current.logged? && (User.current.admin? || User.current.login == @user.login) ? @user.projects : @user.projects.visible
user_organizations = User.current.logged? ? @user.organizations.with_visibility(%w(common limited)) + @user.organizations.with_visibility("privacy").joins(:team_users).where(team_users: {user_id: current_user.id}) : @user.organizations.with_visibility("common")
@user_org_count = user_organizations.size
normal_projects = Project.members_projects(@user.id).to_sql
org_projects = Project.joins(team_projects: [team: :team_users]).where(team_users: {user_id: @user.id}).to_sql
projects = Project.from("( #{ normal_projects} UNION #{ org_projects } ) AS projects").distinct
user_projects = User.current.logged? && (User.current.admin? || User.current.login == @user.login) ? projects : projects.visible
@projects_common_count = user_projects.common.size
@projects_mirrior_count = user_projects.mirror.size
@projects_sync_mirrior_count = user_projects.sync_mirror.size
@ -35,16 +65,22 @@ class UsersController < ApplicationController
def fan_users
watchers = @user.watchers.includes(:user).order("watchers.created_at desc")
watchers = watchers.joins(:user).where("LOWER(concat(users.lastname, users.firstname, users.login)) LIKE ?", "%#{params[:search].split(" ").join('|')}%") if params[:search].present?
watchers = watchers.joins(:user).merge(User.like(params[:search]))
@watchers_count = watchers.size
@watchers = paginate(watchers)
end
def hovercard
end
def update
@user = User.find params[:id]
@user.update!(user_params)
render_ok
return render_not_found unless @user = User.find_by_id(params[:id]) || User.find_by(login: params[:id])
return render_forbidden unless User.current.logged? && (current_user&.admin? || current_user.id == @user.id)
Util.write_file(@image, avatar_path(@user)) if user_params[:image].present?
@user.attributes = user_params.except(:image)
unless @user.save
render_error(@user.errors.full_messages.join(", "))
end
end
def me
@ -66,7 +102,7 @@ class UsersController < ApplicationController
def attachment_show
file_name = params[:file_name]
path = params[:path] || edu_setting('attachment_folder')
path = params[:path] || file_storage_directory
send_file "#{path}/#{file_name}", :filename => "#{file_name}",
:type => 'game',
:disposition => 'attachment' #inline can open in browser
@ -218,17 +254,39 @@ class UsersController < ApplicationController
render_ok
end
def sync_user_info
user = User.find_by_login params[:login]
return render_forbidden unless user === current_user
sync_params = {
email: params[:email],
password: params[:password]
}
Users::UpdateInfoForm.new(sync_params.merge(login: params[:login])).validate!
interactor = Gitea::User::UpdateInteractor.call(user.login, sync_params)
if interactor.success?
user.update!(password: params[:password], mail: params[:email], status: User::STATUS_EDIT_INFO)
render_ok
else
render_error(interactor.error)
end
end
private
def load_user
@user = User.find_by_login(params[:id]) || User.find_by(id: params[:id])
end
def user_params
params.require(:user).permit(:nickname, :lastname, :show_realname,:login,:mail,
params.require(:user).permit(:nickname, :image,
user_extension_attributes: [
:gender, :location, :location_city,
:occupation, :technical_title,
:school_id, :department_id,:identity, :student_id, :description]
:school_id, :department_id, :province, :city,
:custom_department, :identity, :student_id, :description,
:show_email, :show_location, :show_department]
)
end

View File

@ -11,7 +11,7 @@ class UsersForPrivateMessagesController < ApplicationController
return
end
users = users.where('LOWER(concat(lastname, firstname, nickname)) LIKE ?', "%#{keyword}%")
users = users.like(keyword)
@users = users.limit(10).includes(:user_extension)
end

View File

@ -8,7 +8,7 @@ class VersionReleasesController < ApplicationController
version_releases = Gitea::Versions::ListService.new(@user.gitea_token, @user.try(:login), @repository.try(:identifier)).call
@version_releases = version_releases
@user_permission = current_user.present? && (current_user == @user || current_user.admin?)
@forge_releases = @repository.version_releases.select(:id,:version_gid).includes(:attachments)
@forge_releases = @repository.version_releases.select(:id,:version_gid, :created_at).includes(:attachments)
end
def new
@ -124,7 +124,7 @@ class VersionReleasesController < ApplicationController
private
def set_user
@user = @repository.user
@user = @repository.owner
end
def find_version

View File

@ -5,9 +5,8 @@ class VersionsController < ApplicationController
before_action :set_version, only: [:edit, :update, :destroy, :show,:update_status]
def index
return render_not_found unless @project.has_menu_permission("versions")
@user_admin_or_member = current_user.present? && (current_user.admin || @project.member?(current_user))
order_name = params[:order_name] || "created_on"
order_type = params[:order_type] || "desc"
status = params[:status]
versions = @project.versions.version_includes
@open_versions_size = versions.where(status: "open")&.size
@ -26,9 +25,6 @@ class VersionsController < ApplicationController
end
def show
order_name = params[:order_name] || "created_on"
order_type = params[:order_type] || "desc"
version_issues = @version.issues.issue_includes
status_type = params[:status_type] || "1"
@ -166,4 +162,12 @@ class VersionsController < ApplicationController
end
end
def order_name
Version.column_names.include?(params[:order_name]) ? params[:order_name] : 'created_on'
end
def order_type
%w(desc asc).include?(params[:order_type]) ? params[:order_type] : 'desc'
end
end

View File

@ -86,7 +86,7 @@ class Weapps::CoursesController < Weapps::BaseController
end
if search.present?
@teacher_list = @teacher_list.joins(:user).where("LOWER(CONCAT(users.lastname, users.firstname)) like ?", "%#{search}%")
@teacher_list = @teacher_list.joins(:user).where("LOWER(CONCAT(users.lastname, users.firstname)) like ? OR users.nickname like ?", "%#{search}%", "%#{search}%")
end
@teacher_list_size = @teacher_list.size
@ -127,8 +127,8 @@ class Weapps::CoursesController < Weapps::BaseController
@students = CourseMember.students(@course)
if search.present?
@students = @students.joins(user: :user_extension).where("LOWER(CONCAT(users.lastname, users.firstname)) like ? or
user_extensions.student_id like ?", "%#{search}%", "%#{search}%")
@students = @students.joins(user: :user_extension).where("LOWER(CONCAT(users.lastname, users.firstname)) like ? or users.nickname like ? or
user_extensions.student_id like ?", "%#{search}%", "%#{search}%", "%#{search}%")
end
if course_group_id.present?

View File

@ -86,7 +86,7 @@ class ZipsController < ApplicationController
#搜索
if params[:search].present?
@ex_users = @ex_users.joins(user: :user_extension).where("CONCAT(lastname, firstname) like ? OR student_id like ?", "%#{params[:search]}%", "%#{params[:search]}%")
@ex_users = @ex_users.joins(user: :user_extension).where("CONCAT(lastname, firstname) like ? OR nickname like ? OR student_id like ?", "%#{params[:search]}%", "%#{params[:search]}%", "%#{params[:search]}%")
end
default_ex_users_size = @ex_users&.size
@ -130,8 +130,8 @@ class ZipsController < ApplicationController
end
unless params[:search].blank?
@all_student_works = @all_student_works.joins(user: :user_extension).where("concat(lastname, firstname) like ?
or student_id like ?", "%#{params[:search]}%", "%#{params[:search]}%")
@all_student_works = @all_student_works.joins(user: :user_extension).where("CONCAT(lastname, firstname) like ? or nickname like ?
or student_id like ?", "%#{params[:search]}%", "%#{params[:search]}%", "%#{params[:search]}%")
end
student_work_sizes = @all_student_works&.size

View File

@ -0,0 +1,2 @@
build/
.github/

View File

@ -0,0 +1,18 @@
# EditorConfig is awesome: https://EditorConfig.org
# Top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
[*.rb]
charset = utf-8
[*.md]
trim_trailing_whitespace = false

1
app/docs/slate/.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
source/javascripts/lib/* linguist-vendored

View File

@ -0,0 +1,22 @@
---
name: Report a Bug
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Bug Description**
A clear and concise description of what the bug is and how to reproduce it.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Browser (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Last upstream Slate commit (run `git log --author="Robert Lord" | head -n 1`):**
Put the commit hash here

View File

@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Questions, Ideas, Discussions
url: https://github.com/slatedocs/slate/discussions
about: Ask and answer questions, and propose new features.

View File

@ -0,0 +1,5 @@
<!--
⚠️ 🚨 ⚠️ STOP AND READ THIS ⚠️ 🚨 ⚠️
👆👆 see that 'base fork' dropdown above? You should change it! The default value of "slatedocs/slate" submits your change to ALL USERS OF SLATE, not just your company. This is PROBABLY NOT WHAT YOU WANT.
-->

View File

@ -0,0 +1,42 @@
name: Build
on:
push:
branches: [ '*' ]
pull_request:
branches: [ '*' ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
ruby-version: [2.3, 2.4, 2.5, 2.6, 2.7]
steps:
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby-version }}
- uses: actions/cache@v2
with:
path: vendor/bundle
key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
gems-${{ runner.os }}-${{ matrix.ruby-version }}-
gems-${{ runner.os }}-
# necessary to get ruby 2.3 to work nicely with bundler vendor/bundle cache
# can remove once ruby 2.3 is no longer supported
- run: gem update --system
- run: bundle config set deployment 'true'
- name: bundle install
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- run: bundle exec middleman build

View File

@ -0,0 +1,41 @@
name: Deploy
on:
push:
branches: [ 'main' ]
jobs:
deploy:
runs-on: ubuntu-latest
env:
ruby-version: 2.5
steps:
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ env.ruby-version }}
- uses: actions/cache@v2
with:
path: vendor/bundle
key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
gems-${{ runner.os }}-${{ matrix.ruby-version }}-
gems-${{ runner.os }}-
- run: bundle config set deployment 'true'
- name: bundle install
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- run: bundle exec middleman build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./build
keep_files: true

View File

@ -0,0 +1,50 @@
name: Dev Deploy
on:
push:
branches: [ 'dev' ]
jobs:
deploy:
runs-on: ubuntu-latest
env:
ruby-version: 2.5
steps:
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ env.ruby-version }}
- uses: actions/cache@v2
with:
path: vendor/bundle
key: gems-${{ runner.os }}-${{ matrix.ruby-version }}-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
gems-${{ runner.os }}-${{ matrix.ruby-version }}-
gems-${{ runner.os }}-
- run: bundle config set deployment 'true'
- name: bundle install
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- run: bundle exec middleman build
- name: Push to Docker Hub
uses: docker/build-push-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_ACCESS_KEY }}
repository: slatedocs/slate
tag_with_ref: true
- name: Deploy
uses: peaceiris/actions-gh-pages@v3.7.0-8
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
destination_dir: dev
publish_dir: ./build
keep_files: true

View File

@ -0,0 +1,22 @@
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Push to Docker Hub
uses: docker/build-push-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_ACCESS_KEY }}
repository: slatedocs/slate
tag_with_ref: true
tags: latest

27
app/docs/slate/.gitignore vendored Normal file
View File

@ -0,0 +1,27 @@
*.gem
*.rbc
.bundle
.config
coverage
InstalledFiles
lib/bundler/man
pkg
rdoc
spec/reports
test/tmp
test/version_tmp
tmp
*.DS_STORE
build/
.cache
.vagrant
.sass-cache
# YARD artifacts
.yardoc
_yardoc
doc/
.idea/
# Vagrant artifacts
ubuntu-*-console.log

254
app/docs/slate/CHANGELOG.md Normal file
View File

@ -0,0 +1,254 @@
# Changelog
## Version 2.8.0
*October 27, 2020*
* Remove last trailing newline when using the copy code button
* Rework docker image and make available at slatedocs/slate
* Improve Dockerfile layout to improve caching (thanks @micvbang)
* Bump rouge from 3.20 to 3.24
* Bump nokogiri from 1.10.9 to 1.10.10
* Bump middleman from 4.3.8 to 4.3.11
* Bump lunr.js from 2.3.8 to 2.3.9
## Version 2.7.1
*August 13, 2020*
* __[security]__ Bumped middleman from 4.3.7 to 4.3.8
_Note_: Slate uses redcarpet, not kramdown, for rendering markdown to HTML, and so was unaffected by the security vulnerability in middleman.
If you have changed slate to use kramdown, and with GFM, you may need to install the `kramdown-parser-gfm` gem.
## Version 2.7.0
*June 21, 2020*
* __[security]__ Bumped rack in Gemfile.lock from 2.2.2 to 2.2.3
* Bumped bundled jQuery from 3.2.1 to 3.5.1
* Bumped bundled lunr from 0.5.7 to 2.3.8
* Bumped imagesloaded from 3.1.8 to 4.1.4
* Bumped rouge from 3.17.0 to 3.20.0
* Bumped redcarpet from 3.4.0 to 3.5.0
* Fix color of highlighted code being unreadable when printing page
* Add clipboard icon for "Copy to Clipboard" functionality to code boxes (see note below)
* Fix handling of ToC selectors that contain punctutation (thanks @gruis)
* Fix language bar truncating languages that overflow screen width
* Strip HTML tags from ToC title before displaying it in title bar in JS (backup to stripping done in Ruby code) (thanks @atic)
To enable the new clipboard icon, you need to add `code_clipboard: true` to the frontmatter of source/index.html.md.
See [this line](https://github.com/slatedocs/slate/blame/main/source/index.html.md#L19) for an example of usage.
## Version 2.6.1
*May 30, 2020*
* __[security]__ update child dependency activesupport in Gemfile.lock to 5.4.2.3
* Update Middleman in Gemfile.lock to 4.3.7
* Replace Travis-CI with GitHub actions for continuous integration
* Replace Spectrum with GitHub discussions
## Version 2.6.0
*May 18, 2020*
__Note__: 2.5.0 was "pulled" due to a breaking bug discovered after release. It is recommended to skip it, and move straight to 2.6.0.
* Fix large whitespace gap in middle column for sections with codeblocks
* Fix highlighted code elements having a different background than rest of code block
* Change JSON keys to have a different font color than their values
* Disable asset hashing for woff and woff2 elements due to middleman bug breaking woff2 asset hashing in general
* Move Dockerfile to Debian from Alpine
* Converted repo to a [GitHub template](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-template-repository)
* Update sassc to 2.3.0 in Gemfile.lock
## Version 2.5.0
*May 8, 2020*
* __[security]__ update nokogiri to ~> 1.10.8
* Update links in example docs to https://github.com/slatedocs/slate from https://github.com/lord/slate
* Update LICENSE to include full Apache 2.0 text
* Test slate against Ruby 2.5 and 2.6 on Travis-CI
* Update Vagrantfile to use Ubuntu 18.04 (thanks @bradthurber)
* Parse arguments and flags for deploy.sh on script start, instead of potentially after building source files
* Install nodejs inside Vagrantfile (thanks @fernandoaguilar)
* Add Dockerfile for running slate (thanks @redhatxl)
* update middleman-syntax and rouge to ~>3.2
* update middleman to 4.3.6
## Version 2.4.0
*October 19, 2019*
- Move repository from lord/slate to slatedocs/slate
- Fix documentation to point at new repo link, thanks to [Arun](https://github.com/slash-arun), [Gustavo Gawryszewski](https://github.com/gawry), and [Daniel Korbit](https://github.com/danielkorbit)
- Update `nokogiri` to 1.10.4
- Update `ffi` in `Gemfile.lock` to fix security warnings, thanks to [Grey Baker](https://github.com/greysteil) and [jakemack](https://github.com/jakemack)
- Update `rack` to 2.0.7 in `Gemfile.lock` to fix security warnings, thanks to [Grey Baker](https://github.com/greysteil) and [jakemack](https://github.com/jakemack)
- Update middleman to `4.3` and relax constraints on middleman related gems, thanks to [jakemack](https://github.com/jakemack)
- Add sass gem, thanks to [jakemack](https://github.com/jakemack)
- Activate `asset_cache` in middleman to improve cacheability of static files, thanks to [Sam Gilman](https://github.com/thenengah)
- Update to using bundler 2 for `Gemfile.lock`, thanks to [jakemack](https://github.com/jakemack)
## Version 2.3.1
*July 5, 2018*
- Update `sprockets` in `Gemfile.lock` to fix security warnings
## Version 2.3
*July 5, 2018*
- Allows strikethrough in markdown by default.
- Upgrades jQuery to 3.2.1, thanks to [Tomi Takussaari](https://github.com/TomiTakussaari)
- Fixes invalid HTML in `layout.erb`, thanks to [Eric Scouten](https://github.com/scouten) for pointing out
- Hopefully fixes Vagrant memory issues, thanks to [Petter Blomberg](https://github.com/p-blomberg) for the suggestion
- Cleans HTML in headers before setting `document.title`, thanks to [Dan Levy](https://github.com/justsml)
- Allows trailing whitespace in markdown files, thanks to [Samuel Cousin](https://github.com/kuzyn)
- Fixes pushState/replaceState problems with scrolling not changing the document hash, thanks to [Andrey Fedorov](https://github.com/anfedorov)
- Removes some outdated examples, thanks [@al-tr](https://github.com/al-tr), [Jerome Dahdah](https://github.com/jdahdah), and [Ricardo Castro](https://github.com/mccricardo)
- Fixes `nav-padding` bug, thanks [Jerome Dahdah](https://github.com/jdahdah)
- Code style fixes thanks to [Sebastian Zaremba](https://github.com/vassyz)
- Nokogiri version bump thanks to [Grey Baker](https://github.com/greysteil)
- Fix to default `index.md` text thanks to [Nick Busey](https://github.com/NickBusey)
Thanks to everyone who contributed to this release!
## Version 2.2
*January 19, 2018*
- Fixes bugs with some non-roman languages not generating unique headers
- Adds editorconfig, thanks to [Jay Thomas](https://github.com/jaythomas)
- Adds optional `NestingUniqueHeadCounter`, thanks to [Vladimir Morozov](https://github.com/greenhost87)
- Small fixes to typos and language, thx [Emir Ribić](https://github.com/ribice), [Gregor Martynus](https://github.com/gr2m), and [Martius](https://github.com/martiuslim)!
- Adds links to Spectrum chat for questions in README and ISSUE_TEMPLATE
## Version 2.1
*October 30, 2017*
- Right-to-left text stylesheet option, thanks to [Mohammad Hossein Rabiee](https://github.com/mhrabiee)
- Fix for HTML5 history state bug, thanks to [Zach Toolson](https://github.com/ztoolson)
- Small styling changes, typo fixes, small bug fixes from [Marian Friedmann](https://github.com/rnarian), [Ben Wilhelm](https://github.com/benwilhelm), [Fouad Matin](https://github.com/fouad), [Nicolas Bonduel](https://github.com/NicolasBonduel), [Christian Oliff](https://github.com/coliff)
Thanks to everyone who submitted PRs for this version!
## Version 2.0
*July 17, 2017*
- All-new statically generated table of contents
- Should be much faster loading and scrolling for large pages
- Smaller Javascript file sizes
- Avoids the problem with the last link in the ToC not ever highlighting if the section was shorter than the page
- Fixes control-click not opening in a new page
- Automatically updates the HTML title as you scroll
- Updated design
- New default colors!
- New spacings and sizes!
- System-default typefaces, just like GitHub
- Added search input delay on large corpuses to reduce lag
- We even bumped the major version cause hey, why not?
- Various small bug fixes
Thanks to everyone who helped debug or wrote code for this version! It was a serious community effort, and I couldn't have done it alone.
## Version 1.5
*February 23, 2017*
- Add [multiple tabs per programming language](https://github.com/lord/slate/wiki/Multiple-language-tabs-per-programming-language) feature
- Upgrade Middleman to add Ruby 1.4.0 compatibility
- Switch default code highlighting color scheme to better highlight JSON
- Various small typo and bug fixes
## Version 1.4
*November 24, 2016*
- Upgrade Middleman and Rouge gems, should hopefully solve a number of bugs
- Update some links in README
- Fix broken Vagrant startup script
- Fix some problems with deploy.sh help message
- Fix bug with language tabs not hiding properly if no error
- Add `!default` to SASS variables
- Fix bug with logo margin
- Bump tested Ruby versions in .travis.yml
## Version 1.3.3
*June 11, 2016*
Documentation and example changes.
## Version 1.3.2
*February 3, 2016*
A small bugfix for slightly incorrect background colors on code samples in some cases.
## Version 1.3.1
*January 31, 2016*
A small bugfix for incorrect whitespace in code blocks.
## Version 1.3
*January 27, 2016*
We've upgraded Middleman and a number of other dependencies, which should fix quite a few bugs.
Instead of `rake build` and `rake deploy`, you should now run `bundle exec middleman build --clean` to build your server, and `./deploy.sh` to deploy it to Github Pages.
## Version 1.2
*June 20, 2015*
**Fixes:**
- Remove crash on invalid languages
- Update Tocify to scroll to the highlighted header in the Table of Contents
- Fix variable leak and update search algorithms
- Update Python examples to be valid Python
- Update gems
- More misc. bugfixes of Javascript errors
- Add Dockerfile
- Remove unused gems
- Optimize images, fonts, and generated asset files
- Add chinese font support
- Remove RedCarpet header ID patch
- Update language tabs to not disturb existing query strings
## Version 1.1
*July 27, 2014*
**Fixes:**
- Finally, a fix for the redcarpet upgrade bug
## Version 1.0
*July 2, 2014*
[View Issues](https://github.com/tripit/slate/issues?milestone=1&state=closed)
**Features:**
- Responsive designs for phones and tablets
- Started tagging versions
**Fixes:**
- Fixed 'unrecognized expression' error
- Fixed #undefined hash bug
- Fixed bug where the current language tab would be unselected
- Fixed bug where tocify wouldn't highlight the current section while searching
- Fixed bug where ids of header tags would have special characters that caused problems
- Updated layout so that pages with disabled search wouldn't load search.js
- Cleaned up Javascript

View File

@ -0,0 +1,46 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hello@lord.io. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

12
app/docs/slate/Gemfile Normal file
View File

@ -0,0 +1,12 @@
ruby '>=2.3.1'
source 'https://gems.ruby-china.com'
# Middleman
gem 'middleman', '~>4.3'
gem 'middleman-syntax', '~> 3.2'
gem 'middleman-autoprefixer', '~> 2.7'
gem 'middleman-sprockets', '~> 4.1'
gem 'rouge', '~> 3.21'
gem 'redcarpet', '~> 3.5.0'
gem 'nokogiri', '~> 1.10.8'
gem 'sass'

136
app/docs/slate/Gemfile.lock Normal file
View File

@ -0,0 +1,136 @@
GEM
remote: https://gems.ruby-china.com/
specs:
activesupport (5.2.4.4)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
autoprefixer-rails (9.5.1.1)
execjs
backports (3.18.2)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.12.2)
concurrent-ruby (1.1.7)
contracts (0.13.0)
dotenv (2.7.6)
erubis (2.7.0)
execjs (2.7.0)
fast_blank (1.0.0)
fastimage (2.2.0)
ffi (1.13.1)
haml (5.1.2)
temple (>= 0.8.0)
tilt
hamster (3.0.0)
concurrent-ruby (~> 1.0)
hashie (3.6.0)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
kramdown (2.3.0)
rexml
listen (3.0.8)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
memoist (0.16.2)
middleman (4.3.11)
coffee-script (~> 2.2)
haml (>= 4.0.5)
kramdown (>= 2.3.0)
middleman-cli (= 4.3.11)
middleman-core (= 4.3.11)
middleman-autoprefixer (2.10.1)
autoprefixer-rails (~> 9.1)
middleman-core (>= 3.3.3)
middleman-cli (4.3.11)
thor (>= 0.17.0, < 2.0)
middleman-core (4.3.11)
activesupport (>= 4.2, < 6.0)
addressable (~> 2.3)
backports (~> 3.6)
bundler
contracts (~> 0.13.0)
dotenv
erubis
execjs (~> 2.0)
fast_blank
fastimage (~> 2.0)
hamster (~> 3.0)
hashie (~> 3.4)
i18n (~> 0.9.0)
listen (~> 3.0.0)
memoist (~> 0.14)
padrino-helpers (~> 0.13.0)
parallel
rack (>= 1.4.5, < 3)
sassc (~> 2.0)
servolux
tilt (~> 2.0.9)
uglifier (~> 3.0)
middleman-sprockets (4.1.1)
middleman-core (~> 4.0)
sprockets (>= 3.0)
middleman-syntax (3.2.0)
middleman-core (>= 3.2)
rouge (~> 3.2)
mini_portile2 (2.4.0)
minitest (5.14.2)
nokogiri (1.10.10)
mini_portile2 (~> 2.4.0)
padrino-helpers (0.13.3.4)
i18n (~> 0.6, >= 0.6.7)
padrino-support (= 0.13.3.4)
tilt (>= 1.4.1, < 3)
padrino-support (0.13.3.4)
activesupport (>= 3.1)
parallel (1.19.2)
public_suffix (4.0.6)
rack (2.2.3)
rb-fsevent (0.10.4)
rb-inotify (0.10.1)
ffi (~> 1.0)
redcarpet (3.5.0)
rexml (3.2.4)
rouge (3.24.0)
sass (3.7.4)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
sassc (2.4.0)
ffi (~> 1.9)
servolux (0.13.0)
sprockets (3.7.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
temple (0.8.2)
thor (1.0.1)
thread_safe (0.3.6)
tilt (2.0.10)
tzinfo (1.2.7)
thread_safe (~> 0.1)
uglifier (3.2.0)
execjs (>= 0.3.0, < 3)
PLATFORMS
ruby
DEPENDENCIES
middleman (~> 4.3)
middleman-autoprefixer (~> 2.7)
middleman-sprockets (~> 4.1)
middleman-syntax (~> 3.2)
nokogiri (~> 1.10.8)
redcarpet (~> 3.5.0)
rouge (~> 3.21)
sass
RUBY VERSION
ruby 2.3.3p222
BUNDLED WITH
2.1.4

201
app/docs/slate/LICENSE Normal file
View File

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

81
app/docs/slate/README.md Normal file
View File

@ -0,0 +1,81 @@
<p align="center">
<img src="https://raw.githubusercontent.com/slatedocs/img/main/logo-slate.png" alt="Slate: API Documentation Generator" width="226">
<br>
<a href="https://github.com/slatedocs/slate/actions?query=workflow%3ABuild+branch%3Amain"><img src="https://github.com/slatedocs/slate/workflows/Build/badge.svg?branch=main" alt="Build Status"></a>
</p>
<p align="center">Slate helps you create beautiful, intelligent, responsive API documentation.</p>
<p align="center"><img src="https://raw.githubusercontent.com/slatedocs/img/main/screenshot-slate.png" width=700 alt="Screenshot of Example Documentation created with Slate"></p>
<p align="center"><em>The example above was created with Slate. Check it out at <a href="https://slatedocs.github.io/slate">slatedocs.github.io/slate</a>.</em></p>
Features
------------
* **Clean, intuitive design** — With Slate, the description of your API is on the left side of your documentation, and all the code examples are on the right side. Inspired by [Stripe's](https://stripe.com/docs/api) and [PayPal's](https://developer.paypal.com/webapps/developer/docs/api/) API docs. Slate is responsive, so it looks great on tablets, phones, and even in print.
* **Everything on a single page** — Gone are the days when your users had to search through a million pages to find what they wanted. Slate puts the entire documentation on a single page. We haven't sacrificed linkability, though. As you scroll, your browser's hash will update to the nearest header, so linking to a particular point in the documentation is still natural and easy.
* **Slate is just Markdown** — When you write docs with Slate, you're just writing Markdown, which makes it simple to edit and understand. Everything is written in Markdown — even the code samples are just Markdown code blocks.
* **Write code samples in multiple languages** — If your API has bindings in multiple programming languages, you can easily put in tabs to switch between them. In your document, you'll distinguish different languages by specifying the language name at the top of each code block, just like with GitHub Flavored Markdown.
* **Out-of-the-box syntax highlighting** for [over 100 languages](https://github.com/jneen/rouge/wiki/List-of-supported-languages-and-lexers), no configuration required.
* **Automatic, smoothly scrolling table of contents** on the far left of the page. As you scroll, it displays your current position in the document. It's fast, too. We're using Slate at TripIt to build documentation for our new API, where our table of contents has over 180 entries. We've made sure that the performance remains excellent, even for larger documents.
* **Let your users update your documentation for you** — By default, your Slate-generated documentation is hosted in a public GitHub repository. Not only does this mean you get free hosting for your docs with GitHub Pages, but it also makes it simple for other developers to make pull requests to your docs if they find typos or other problems. Of course, if you don't want to use GitHub, you're also welcome to host your docs elsewhere.
* **RTL Support** Full right-to-left layout for RTL languages such as Arabic, Persian (Farsi), Hebrew etc.
Getting started with Slate is super easy! Simply press the green "use this template" button above and follow the instructions below. Or, if you'd like to check out what Slate is capable of, take a look at the [sample docs](https://slatedocs.github.io/slate/).
Getting Started with Slate
------------------------------
To get started with Slate, please check out the [Getting Started](https://github.com/slatedocs/slate/wiki#getting-started)
section in our [wiki](https://github.com/slatedocs/slate/wiki).
We support running Slate in three different ways:
* [Natively](https://github.com/slatedocs/slate/wiki/Using-Slate-Natively)
* [Using Vagrant](https://github.com/slatedocs/slate/wiki/Using-Slate-in-Vagrant)
* [Using Docker](https://github.com/slatedocs/slate/wiki/Using-Slate-in-Docker)
Companies Using Slate
---------------------------------
* [NASA](https://api.nasa.gov)
* [Sony](http://developers.cimediacloud.com)
* [Best Buy](https://bestbuyapis.github.io/api-documentation/)
* [Travis-CI](https://docs.travis-ci.com/api/)
* [Greenhouse](https://developers.greenhouse.io/harvest.html)
* [WooCommerce](http://woocommerce.github.io/woocommerce-rest-api-docs/)
* [Dwolla](https://docs.dwolla.com/)
* [Clearbit](https://clearbit.com/docs)
* [Coinbase](https://developers.coinbase.com/api)
* [Parrot Drones](http://developer.parrot.com/docs/bebop/)
* [Scale](https://docs.scaleapi.com/)
You can view more in [the list on the wiki](https://github.com/slatedocs/slate/wiki/Slate-in-the-Wild).
Questions? Need Help? Found a bug?
--------------------
If you've got questions about setup, deploying, special feature implementation in your fork, or just want to chat with the developer, please feel free to [start a thread in our Discussions tab](https://github.com/slatedocs/slate/discussions)!
Found a bug with upstream Slate? Go ahead and [submit an issue](https://github.com/slatedocs/slate/issues). And, of course, feel free to submit pull requests with bug fixes or changes to the `dev` branch.
Contributors
--------------------
Slate was built by [Robert Lord](https://lord.io) while at [TripIt](https://www.tripit.com/). The project is now maintained by [Matthew Peveler](https://github.com/MasterOdin) and [Mike Ralphson](https://github.com/MikeRalphson).
Thanks to the following people who have submitted major pull requests:
- [@chrissrogers](https://github.com/chrissrogers)
- [@bootstraponline](https://github.com/bootstraponline)
- [@realityking](https://github.com/realityking)
- [@cvkef](https://github.com/cvkef)
Also, thanks to [Sauce Labs](http://saucelabs.com) for sponsoring the development of the responsive styles.

Some files were not shown because too many files have changed in this diff Show More