1717import controllers .annotation .IsCreatable ;
1818import controllers .routes ;
1919import models .*;
20- import models .enumeration .Operation ;
21- import models .enumeration .ResourceType ;
22- import models .enumeration .State ;
23- import models .enumeration .UserState ;
20+ import models .enumeration .*;
2421import org .apache .commons .lang3 .StringUtils ;
2522import play .db .ebean .Transactional ;
2623import play .i18n .Messages ;
@@ -367,6 +364,17 @@ private static ExpressionList<User> getUserExpressionList(String query, String s
367364 return el ;
368365 }
369366
367+ private static ExpressionList <Project > getProjectExpressionList (String query , String searchType ) {
368+
369+ ExpressionList <Project > el = Project .find .select ("id, name" ).where ()
370+ .eq ("projectScope" , ProjectScope .PUBLIC ).disjunction ();
371+
372+ el .icontains ("name" , query );
373+ el .endJunction ();
374+
375+ return el ;
376+ }
377+
370378 private static void addAuthorIfNotMe (Issue issue , List <ObjectNode > users , User issueAuthor ) {
371379 if (!issue .getAuthor ().loginId .equals (UserApp .currentUser ().loginId )) {
372380 addUserToUsersWithCustomName (issueAuthor , users , Messages .get ("issue.assignToAuthor" ));
@@ -391,12 +399,25 @@ static void addUserToUsers(User user, List<ObjectNode> users) {
391399 userNode .put ("loginId" , user .loginId );
392400 userNode .put ("name" , user .getDisplayName ());
393401 userNode .put ("avatarUrl" , user .avatarUrl ());
402+ userNode .put ("type" , "user" );
394403
395404 if (!users .contains (userNode )) {
396405 users .add (userNode );
397406 }
398407 }
399408
409+ static void addProjectToProjects (Project project , List <ObjectNode > projects ) {
410+ ObjectNode projectNode = Json .newObject ();
411+ projectNode .put ("loginId" , project .id );
412+ projectNode .put ("name" , project .owner + "/" + project .name );
413+ projectNode .put ("avatarUrl" , "" );
414+ projectNode .put ("type" , "project" );
415+
416+ if (!projects .contains (projectNode )) {
417+ projects .add (projectNode );
418+ }
419+ }
420+
400421 private static void addUserToUsersWithCustomName (User user , List <ObjectNode > users , String name ) {
401422 ObjectNode userNode = Json .newObject ();
402423 userNode .put ("loginId" , user .loginId );
@@ -580,21 +601,27 @@ public static Result findSharableUsers(String ownerName, String projectName, Lon
580601 return status (Http .Status .NOT_ACCEPTABLE );
581602 }
582603
583- List <ObjectNode > users = new ArrayList <>();
604+ List <ObjectNode > results = new ArrayList <>();
584605
585- ExpressionList <User > el = getUserExpressionList (query , request ().getQueryString ("type" ));
606+ ExpressionList <User > userExpressionList = getUserExpressionList (query , request ().getQueryString ("type" ));
607+ ExpressionList <Project > projectExpressionList = getProjectExpressionList (query , request ().getQueryString ("type" ));
586608
587- int total = el .findRowCount ();
609+ int total = userExpressionList . findRowCount () + projectExpressionList .findRowCount ();
588610 if (total > MAX_FETCH_USERS ) {
589- el .setMaxRows (MAX_FETCH_USERS );
611+ userExpressionList .setMaxRows (MAX_FETCH_USERS / 2 );
612+ projectExpressionList .setMaxRows (MAX_FETCH_USERS / 2 );
590613 response ().setHeader ("Content-Range" , "items " + MAX_FETCH_USERS + "/" + total );
591614 }
592615
593- for (User user :el .findList ()) {
594- addUserToUsers (user , users );
616+ for (User user :userExpressionList .findList ()) {
617+ addUserToUsers (user , results );
595618 }
596619
597- return ok (toJson (users ));
620+ for (Project project : projectExpressionList .findList ()) {
621+ addProjectToProjects (project , results );
622+ }
623+
624+ return ok (toJson (results ));
598625 }
599626
600627 public static Result updateSharer (String owner , String projectName , Long number ){
@@ -618,35 +645,73 @@ public static Result updateSharer(String owner, String projectName, Long number)
618645 final String action = json .findValue ("action" ).asText ();
619646
620647 ObjectNode result = changeSharer (sharer , issue , action );
621- sendNotification (sharer , issue , action );
622648
623649 return ok (result );
624650 }
625651
626652 private static ObjectNode changeSharer (JsonNode sharer , Issue issue , String action ) {
627653 ObjectNode result = Json .newObject ();
628- for (JsonNode sharerLoginId : sharer ) {
654+ List <String > users = new ArrayList <>();
655+
656+ if (sharer .findValue ("type" ).asText ().equals ("project" )) {
657+ changeSharerByProject (sharer .findValue ("loginId" ).asLong (), issue , action , result , users );
658+ } else {
659+ changeSharerByUser (sharer .findValue ("loginId" ).asText (), issue , action , result , users );
660+ }
661+
662+ sendNotification (users , issue , action );
663+ return result ;
664+ }
665+
666+ private static void changeSharerByUser (String loginId , Issue issue , String action , ObjectNode result , List <String > users ) {
667+ if ("add" .equalsIgnoreCase (action )) {
668+ addSharer (issue , loginId );
669+ } else if ("delete" .equalsIgnoreCase (action )) {
670+ removeSharer (issue , loginId );
671+ } else {
672+ play .Logger .error ("Unknown issue sharing action: " + issue + ":" + action + " by " + currentUser ());
673+ }
674+
675+ users .add (loginId );
676+ setShareActionToResponse (action , result );
677+ result .put ("sharer" , User .findByLoginId (loginId ).getDisplayName ());
678+ }
679+
680+ private static void changeSharerByProject (Long projectId , Issue issue , String action , ObjectNode result , List <String > users ) {
681+ List <ProjectUser > projectUsers = ProjectUser .findMemberListByProject (projectId );
682+
683+ for (ProjectUser projectUser : projectUsers ) {
629684 if ("add" .equalsIgnoreCase (action )) {
630- addSharer (issue , sharerLoginId .asText ());
631- result .put ("action" , "added" );
685+ addSharer (issue , projectUser .user .loginId );
632686 } else if ("delete" .equalsIgnoreCase (action )) {
633- result .put ("action" , "deleted" );
634- removeSharer (issue , sharerLoginId .asText ());
687+ removeSharer (issue , projectUser .user .loginId );
635688 } else {
636689 play .Logger .error ("Unknown issue sharing action: " + issue + ":" + action + " by " + currentUser ());
637- result .put ("action" , "Do nothing. Unsupported action: " + action );
638690 }
639- result .put ("sharer" , User .findByLoginId (sharerLoginId .asText ()).getDisplayName ());
691+ users .add (projectUser .user .loginId );
692+ }
693+
694+ setShareActionToResponse (action , result );
695+
696+ result .put ("sharer" , Project .find .byId (projectId ).name );
697+ }
698+
699+ private static void setShareActionToResponse (String action , ObjectNode result ) {
700+ if ("add" .equalsIgnoreCase (action )) {
701+ result .put ("action" , "added" );
702+ } else if ("delete" .equalsIgnoreCase (action )) {
703+ result .put ("action" , "deleted" );
704+ } else {
705+ result .put ("action" , "Do nothing. Unsupported action: " + action );
640706 }
641- return result ;
642707 }
643708
644- private static void sendNotification (JsonNode sharer , Issue issue , String action ) {
709+ private static void sendNotification (List < String > users , Issue issue , String action ) {
645710 Runnable preUpdateHook = new Runnable () {
646711 @ Override
647712 public void run () {
648- for (JsonNode sharerLoginId : sharer ){
649- addSharerChangedNotification (issue , sharerLoginId . asText () , action );
713+ for (String sharerLoginId : users ){
714+ addSharerChangedNotification (issue , sharerLoginId , action );
650715 }
651716 }
652717 };
0 commit comments