Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
T
tagManager
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lanmw
tagManager
Commits
59088d96
Commit
59088d96
authored
Apr 28, 2022
by
xieshaohua
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
标签ngdb联调修改
parent
eb067099
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
84 additions
and
34 deletions
+84
-34
TagSVC.java
.../java/com/keymobile/tagmanager/facade/service/TagSVC.java
+2
-2
TagRequestBody.java
...n/java/com/keymobile/tagmanager/model/TagRequestBody.java
+41
-0
TagService.java
...ain/java/com/keymobile/tagmanager/service/TagService.java
+22
-16
TagCtrlService.java
...com/keymobile/tagmanager/service/busi/TagCtrlService.java
+3
-3
ExcelParserSVCImpl.java
...bile/tagmanager/service/ngdb/impl/ExcelParserSVCImpl.java
+4
-3
TagFileSVCImpl.java
...eymobile/tagmanager/service/ngdb/impl/TagFileSVCImpl.java
+6
-5
TagRelSVCImpl.java
...keymobile/tagmanager/service/ngdb/impl/TagRelSVCImpl.java
+6
-5
TagSVCImpl.java
...om/keymobile/tagmanager/service/ngdb/impl/TagSVCImpl.java
+0
-0
No files found.
tag-facade/src/main/java/com/keymobile/tagmanager/facade/service/TagSVC.java
View file @
59088d96
...
...
@@ -32,9 +32,9 @@ public interface TagSVC {
* @return
*/
@POST
@Path
(
"delete
Tag
"
)
@Path
(
"delete"
)
@Produces
(
"application/json"
)
Map
<
String
,
Object
>
delete
Tag
(
Map
<
String
,
Object
>
requestMap
);
Map
<
String
,
Object
>
delete
(
Map
<
String
,
Object
>
requestMap
);
/**
* 存在节点
...
...
tag-service/src/main/java/com/keymobile/tagmanager/model/TagRequestBody.java
0 → 100644
View file @
59088d96
package
com
.
keymobile
.
tagmanager
.
model
;
import
com.keymobile.tagmanager.util.Constants
;
import
lombok.Data
;
/**
* @author xiesh
* @version 1.0.0
* @date 2022/04/27
* @desc tag ngdb参数解析实体
*/
@Data
public
class
TagRequestBody
{
private
String
id
;
private
String
name
;
private
String
nameEn
;
private
String
path
;
private
String
desc
;
private
String
imgId
;
private
Integer
order
;
private
Integer
level
;
private
String
tagType
;
//0, 系统标签, 1 ,自定义标签
private
String
idPath
;
private
String
creator
;
private
String
createDate
;
private
String
isOpen
=
Constants
.
TAG_CLOSE_STATUS
;
//0 不公开, 1, 公开
private
Integer
domain
;
private
String
dimensionType
=
Constants
.
TAG_DIMENSION_FALSE
;
//0 非维度标签, 1 维度标签
private
String
dept
;
// 部门
private
String
importId
;
//记录导入的Id,后面撤销用到
private
String
tagUser
;
private
String
proDept
;
//公司机构id
}
tag-service/src/main/java/com/keymobile/tagmanager/service/TagService.java
View file @
59088d96
...
...
@@ -14,6 +14,7 @@ import java.util.UUID;
import
java.util.stream.Collectors
;
import
org.apache.commons.lang3.StringUtils
;
import
org.bson.BsonRegularExpression
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -57,7 +58,7 @@ public class TagService {
private
Logger
logger
=
LoggerFactory
.
getLogger
(
TagService
.
class
);
//新增或修改标签
public
Tag
addOrUpdateTag
(
String
parentId
,
Tag
tag
,
String
userName
)
throws
TagNotExistException
,
TagDuplicateException
,
Tag
Exception
{
public
Tag
addOrUpdateTag
(
String
parentId
,
Tag
tag
,
String
userName
)
throws
Exception
{
//定义保存原来的id
String
originId
=
tag
.
getId
();
if
(
StringUtils
.
isNotBlank
(
parentId
))
{
//如果新增子节点
...
...
@@ -233,11 +234,16 @@ public class TagService {
String
fullname
=
org
.
getFullName
();
//分隔fullname
String
[]
fullnames
=
fullname
.
split
(
","
);
String
companyPath
=
""
;
//如果fullname没有两层结构
if
(
fullnames
.
length
<
2
)
{
throw
new
TagNotExistException
(
"get org by id the fullname:"
+
fullname
+
" at least 2 levels;"
);
if
(
fullnames
.
length
<
1
)
{
throw
new
TagNotExistException
(
"get org by id the fullname:"
+
fullname
+
" at least 1 levels;"
);
}
if
(
fullnames
.
length
==
1
){
companyPath
=
fullnames
[
0
];
}
else
{
companyPath
=
fullnames
[
0
]+
Constants
.
TAG_PATH_SEPARATOR
+
fullnames
[
1
];
}
String
companyPath
=
fullnames
[
0
]+
Constants
.
TAG_PATH_SEPARATOR
+
fullnames
[
1
];
//根据companyPath获取机构信息
Org
companyOrg
=
authService
.
findByFullName
(
companyPath
);
if
(
companyOrg
==
null
)
{
...
...
@@ -521,9 +527,9 @@ public class TagService {
//拼接path和username的查询条件
private
Criteria
createRelationNamepathCriteria
(
String
userName
,
Tag
origin
)
{
if
(
Constants
.
TAG_DIMENSION_TRUE
.
equals
(
origin
.
getDimensionType
()))
{
return
Criteria
.
where
(
"path"
).
regex
(
"^"
+
origin
.
getPath
()
+
Constants
.
TAG_PATH_SEPARATOR
).
and
(
"dept"
).
is
(
origin
.
getDept
());
return
Criteria
.
where
(
"path"
).
regex
(
new
BsonRegularExpression
(
"^"
+
origin
.
getPath
()
+
Constants
.
TAG_PATH_SEPARATOR
)
).
and
(
"dept"
).
is
(
origin
.
getDept
());
}
return
Criteria
.
where
(
"path"
).
regex
(
"^"
+
origin
.
getPath
()
+
Constants
.
TAG_PATH_SEPARATOR
)
return
Criteria
.
where
(
"path"
).
regex
(
new
BsonRegularExpression
(
"^"
+
origin
.
getPath
()
+
Constants
.
TAG_PATH_SEPARATOR
)
)
.
and
(
"creator"
).
is
(
userName
);
}
//判断标签是否已经存在
...
...
@@ -557,7 +563,7 @@ public class TagService {
Criteria
criteriaOr
=
new
Criteria
();
List
<
Criteria
>
criteriaOrList
=
new
ArrayList
<>();
Criteria
criteria
=
Criteria
.
where
(
"path"
)
.
regex
(
"^"
+
parentTag
.
getPath
()
+
Constants
.
TAG_PATH_SEPARATOR
)
.
regex
(
new
BsonRegularExpression
(
"^"
+
parentTag
.
getPath
()
+
Constants
.
TAG_PATH_SEPARATOR
)
)
.
and
(
"dimensionType"
).
is
(
Constants
.
TAG_DIMENSION_TRUE
);
for
(
String
companyOrgId
:
companyOrgIdList
)
{
Criteria
criteriaPro
=
Criteria
.
where
(
"proDept"
).
is
(
companyOrgId
);
...
...
@@ -617,7 +623,7 @@ public class TagService {
List
<
Criteria
>
criteriaOrList
=
new
ArrayList
<>();
Criteria
criteriaOr
=
new
Criteria
();
Criteria
criteria
=
Criteria
.
where
(
"path"
)
.
regex
(
"^"
+
parentTag
.
getPath
()
+
Constants
.
TAG_PATH_SEPARATOR
)
.
regex
(
new
BsonRegularExpression
(
"^"
+
parentTag
.
getPath
()
+
Constants
.
TAG_PATH_SEPARATOR
)
)
.
and
(
"tagType"
).
is
(
Constants
.
TAG_PERSONAL_TYPE
);
for
(
String
companyOrgId
:
companyOrgIdList
)
{
Criteria
criteriaDim
=
Criteria
.
where
(
"proDept"
).
is
(
companyOrgId
)
...
...
@@ -644,7 +650,7 @@ public class TagService {
private
Criteria
createKeywordRegexQuery
(
List
<
String
>
asList
,
String
keyword
)
{
Criteria
criteriaSearch
=
new
Criteria
();
return
criteriaSearch
.
orOperator
(
asList
.
stream
().
map
(
col
->
{
return
Criteria
.
where
(
col
).
regex
(
keyword
,
"i"
);
return
Criteria
.
where
(
col
).
regex
(
new
BsonRegularExpression
(
keyword
,
"i"
)
);
}).
collect
(
Collectors
.
toList
()).
toArray
(
new
Criteria
[
0
]));
}
//拼接根据机构id查询个人维度标签
...
...
@@ -666,7 +672,7 @@ public class TagService {
criteria
.
andOperator
(
criteriaOr
);
}
if
(
StringUtils
.
isNotBlank
(
path
))
{
criteria
.
and
(
"path"
).
regex
(
"^"
+
path
+
","
);
criteria
.
and
(
"path"
).
regex
(
new
BsonRegularExpression
(
"^"
+
path
+
","
)
);
}
return
criteria
;
}
...
...
@@ -674,7 +680,7 @@ public class TagService {
private
Criteria
createSystemTagCriteria
(
String
path
)
{
Criteria
criteria
=
Criteria
.
where
(
"tagType"
).
is
(
Constants
.
TAG_SYSTEM_TYPE
);
if
(
StringUtils
.
isNotBlank
(
path
))
{
return
criteria
.
and
(
"path"
).
regex
(
"^"
+
path
);
return
criteria
.
and
(
"path"
).
regex
(
new
BsonRegularExpression
(
"^"
+
path
)
);
}
return
criteria
;
}
...
...
@@ -724,7 +730,7 @@ public class TagService {
for
(
String
orgId
:
orgIds
)
{
Criteria
criteriaUser
=
Criteria
.
where
(
"dept"
).
is
(
orgId
).
and
(
"tagUser"
).
is
(
userName
);
if
(
StringUtils
.
isNotBlank
(
path
))
{
criteriaUser
.
and
(
"path"
).
regex
(
"^"
+
path
+
","
);
criteriaUser
.
and
(
"path"
).
regex
(
new
BsonRegularExpression
(
"^"
+
path
+
","
)
);
}
criteriaOrList
.
add
(
criteriaUser
);
}
...
...
@@ -732,7 +738,7 @@ public class TagService {
Criteria
criteriaUser
=
Criteria
.
where
(
"proDept"
).
is
(
companyOrgId
)
.
and
(
"isOpen"
).
is
(
Constants
.
TAG_OPEN_STATUS
);
if
(
StringUtils
.
isNotBlank
(
path
))
{
criteriaUser
.
and
(
"path"
).
regex
(
"^"
+
path
+
","
);
criteriaUser
.
and
(
"path"
).
regex
(
new
BsonRegularExpression
(
"^"
+
path
+
","
)
);
}
criteriaOrList
.
add
(
criteriaUser
);
}
...
...
@@ -748,7 +754,7 @@ public class TagService {
//拼接查询当前系统标签子标签条件
private
List
<
Tag
>
getSystemSubTag
(
Tag
parentTag
)
{
List
<
Tag
>
dirs
=
mongoOperations
.
find
(
new
Query
().
addCriteria
(
Criteria
.
where
(
"path"
)
.
regex
(
"^"
+
parentTag
.
getPath
()
+
Constants
.
TAG_PATH_SEPARATOR
)
.
regex
(
new
BsonRegularExpression
(
"^"
+
parentTag
.
getPath
()
+
Constants
.
TAG_PATH_SEPARATOR
)
)
.
and
(
"tagType"
).
is
(
Constants
.
TAG_SYSTEM_TYPE
))
.
with
(
Sort
.
by
(
getDefaultTagOrders
())),
Tag
.
class
);
dirs
.
add
(
parentTag
);
...
...
@@ -993,7 +999,7 @@ public class TagService {
//
// public List<Tag> getPersonSubTag(Tag parentTag, String userName) {
// List<Tag> dirs = mongoOperations.find(new Query().addCriteria(Criteria.where("path")
// .regex(
"^"+parentTag.getPath() + Constants.TAG_PATH_SEPARATOR
)
// .regex(
new BsonRegularExpression("^"+parentTag.getPath() + Constants.TAG_PATH_SEPARATOR)
)
// .and("tagType").is(Constants.TAG_PERSONAL_TYPE)
// .orOperator(
// Criteria.where("openStatus").is(Constants.TAG_OPEN_STATUS),
...
...
@@ -1004,7 +1010,7 @@ public class TagService {
// }
//
// private Criteria createPathRegexQuery(String path) {
// return Criteria.where("path").regex(
"^"+path
);
// return Criteria.where("path").regex(
new BsonRegularExpression("^"+path)
);
// }
public
List
<
SysTag
>
listSysTags
()
{
...
...
tag-service/src/main/java/com/keymobile/tagmanager/service/busi/TagCtrlService.java
View file @
59088d96
...
...
@@ -49,18 +49,16 @@ public class TagCtrlService {
tag
.
setCreator
(
userName
);
tag
.
setTagUser
(
userId
);
tag
.
setDept
(
org
);
//根据当前登录用户所属机构获取公司机构id
String
companyOrgId
=
tagService
.
getCompanyOrgIdByUserOrgId
(
org
);
tag
.
setProDept
(
companyOrgId
);
LogManager
.
logInfo
(
LogConstants
.
CTX_OPTTAG
,
"新增/修改标签成功"
);
//调用新增或者修改标签接口
return
tagService
.
addOrUpdateTag
(
parentId
,
tag
,
userName
);
}
public
void
delete
Tag
(
String
tagId
)
throws
Exception
{
public
void
delete
(
String
tagId
)
throws
Exception
{
String
userName
=
UserInfoUtils
.
getUserName
();
tagService
.
deleteTag
(
tagId
,
userName
);
LogManager
.
logInfo
(
LogConstants
.
CTX_OPTTAG
,
"删除标签成功"
);
...
...
@@ -148,6 +146,8 @@ public class TagCtrlService {
orgIds
.
add
(
String
.
valueOf
(
dept
));
}
}
System
.
out
.
println
(
"params------------------"
+
userName
+
"------------------"
+
orgIds
+
"------------------"
+
keyword
+
"------------------"
+
path
+
"------------------"
+
domain
+
"------------------"
+
new
Page
(
pageSize
,
pageNo
)+
"------------------"
);
return
tagService
.
searchPersonalDimensionTagByPage
(
userName
,
orgIds
,
keyword
,
path
,
domain
,
new
Page
(
pageSize
,
pageNo
));
}
...
...
tag-service/src/main/java/com/keymobile/tagmanager/service/ngdb/impl/ExcelParserSVCImpl.java
View file @
59088d96
package
com
.
keymobile
.
tagmanager
.
service
.
ngdb
.
impl
;
import
com.alibaba.common.lang.ExceptionUtil
;
import
com.keymobile.common.oss.service.OssCommonService
;
import
com.keymobile.tagmanager.facade.response.Result
;
import
com.keymobile.tagmanager.facade.service.ExcelParserSVC
;
...
...
@@ -34,7 +35,7 @@ public class ExcelParserSVCImpl implements ExcelParserSVC {
List
<
SysTag
>
resultBody
=
excelParserCtrlService
.
parseExcel
(
is
);
result
=
Result
.
genOkResult
(
resultBody
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
Result
.
genFailedResult
(
e
.
getMessage
());
}
finally
{
if
(
is
!=
null
)
{
...
...
@@ -60,7 +61,7 @@ public class ExcelParserSVCImpl implements ExcelParserSVC {
List
<
SysInfo
>
resultBody
=
excelParserCtrlService
.
parseSysExcel
(
is
);
result
=
Result
.
genOkResult
(
resultBody
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
result
=
Result
.
genFailedResult
(
e
.
getMessage
());
}
finally
{
if
(
is
!=
null
)
{
...
...
@@ -86,7 +87,7 @@ public class ExcelParserSVCImpl implements ExcelParserSVC {
String
resultStr
=
ossCommonService
.
uploadAndGenExpireTimeUrl
(
is
,
fileName
,
"xlsx"
,
365
*
24
*
60
*
60L
);
result
=
Result
.
genOkResult
(
resultStr
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
result
=
Result
.
genFailedResult
(
e
.
getMessage
());
}
finally
{
if
(
is
!=
null
)
{
...
...
tag-service/src/main/java/com/keymobile/tagmanager/service/ngdb/impl/TagFileSVCImpl.java
View file @
59088d96
package
com
.
keymobile
.
tagmanager
.
service
.
ngdb
.
impl
;
import
com.alibaba.common.lang.ExceptionUtil
;
import
com.keymobile.common.oss.service.OssCommonService
;
import
com.keymobile.tagmanager.facade.response.Result
;
import
com.keymobile.tagmanager.facade.service.TagFileSVC
;
...
...
@@ -47,7 +48,7 @@ public class TagFileSVCImpl implements TagFileSVC {
String
resultStr
=
ossCommonService
.
uploadAndGenExpireTimeUrl
(
is
,
fileName
,
"xlsx"
,
365
*
24
*
60
*
60L
);
result
=
Result
.
genOkResult
(
resultStr
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
result
=
Result
.
genFailedResult
(
e
.
getMessage
());
}
finally
{
if
(
is
!=
null
)
{
...
...
@@ -73,7 +74,7 @@ public class TagFileSVCImpl implements TagFileSVC {
String
resultStr
=
ossCommonService
.
uploadAndGenExpireTimeUrl
(
is
,
fileName
,
"xlsx"
,
365
*
24
*
60
*
60L
);
result
=
Result
.
genOkResult
(
resultStr
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
result
=
Result
.
genFailedResult
(
e
.
getMessage
());
}
finally
{
if
(
is
!=
null
)
{
...
...
@@ -99,7 +100,7 @@ public class TagFileSVCImpl implements TagFileSVC {
String
resultBody
=
tagFileCtrlService
.
importTag
(
is
,
deptIdPath
);
result
=
Result
.
genOkResult
(
resultBody
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
result
=
Result
.
genFailedResult
(
e
.
getMessage
());
}
return
ServiceContext
.
setRespBodyDto
(
result
);
...
...
@@ -139,7 +140,7 @@ public class TagFileSVCImpl implements TagFileSVC {
result
=
Result
.
genFailedResult
(
"传入参数为空"
);
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
result
=
Result
.
genFailedResult
(
e
.
getMessage
());
}
finally
{
if
(
is
!=
null
)
{
...
...
@@ -163,7 +164,7 @@ public class TagFileSVCImpl implements TagFileSVC {
String
resultBody
=
tagFileCtrlService
.
importSystem
(
is
);
result
=
Result
.
genOkResult
(
resultBody
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
result
=
Result
.
genFailedResult
(
e
.
getMessage
());
}
return
ServiceContext
.
setRespBodyDto
(
result
);
...
...
tag-service/src/main/java/com/keymobile/tagmanager/service/ngdb/impl/TagRelSVCImpl.java
View file @
59088d96
package
com
.
keymobile
.
tagmanager
.
service
.
ngdb
.
impl
;
import
com.alibaba.common.lang.ExceptionUtil
;
import
com.keymobile.tagmanager.facade.response.Result
;
import
com.keymobile.tagmanager.facade.service.TagRelSVC
;
import
com.keymobile.tagmanager.model.TagRelation
;
...
...
@@ -24,7 +25,7 @@ public class TagRelSVCImpl implements TagRelSVC {
TagRelation
resultBody
=
tagRelCtrlService
.
addTagRel
(
sourceId
,
targetId
);
result
=
Result
.
genOkResult
(
resultBody
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
result
=
Result
.
genFailedResult
(
e
.
getMessage
());
}
return
ServiceContext
.
setRespBodyDto
(
result
);
...
...
@@ -38,7 +39,7 @@ public class TagRelSVCImpl implements TagRelSVC {
tagRelCtrlService
.
deleteTagRel
(
id
);
result
=
Result
.
genOkResult
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
result
=
Result
.
genFailedResult
(
e
.
getMessage
());
}
return
ServiceContext
.
setRespBodyDto
(
result
);
...
...
@@ -52,7 +53,7 @@ public class TagRelSVCImpl implements TagRelSVC {
List
<
TagRelation
>
resultBody
=
tagRelCtrlService
.
getSourceTags
(
tagId
);
result
=
Result
.
genOkResult
(
resultBody
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
result
=
Result
.
genFailedResult
(
e
.
getMessage
());
}
return
ServiceContext
.
setRespBodyDto
(
result
);
...
...
@@ -66,7 +67,7 @@ public class TagRelSVCImpl implements TagRelSVC {
List
<
TagRelation
>
resultBody
=
tagRelCtrlService
.
getTargetTags
(
tagId
);
result
=
Result
.
genOkResult
(
resultBody
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
result
=
Result
.
genFailedResult
(
e
.
getMessage
());
}
return
ServiceContext
.
setRespBodyDto
(
result
);
...
...
@@ -79,7 +80,7 @@ public class TagRelSVCImpl implements TagRelSVC {
List
<
TagRelation
>
resultBody
=
tagRelCtrlService
.
getAll
();
result
=
Result
.
genOkResult
(
resultBody
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
);
System
.
out
.
println
(
ExceptionUtil
.
getStackTrace
(
e
)
);
result
=
Result
.
genFailedResult
(
e
.
getMessage
());
}
return
ServiceContext
.
setRespBodyDto
(
result
);
...
...
tag-service/src/main/java/com/keymobile/tagmanager/service/ngdb/impl/TagSVCImpl.java
View file @
59088d96
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment