@@ -32,15 +32,65 @@ module API
32
32
module V3
33
33
module Workspaces
34
34
module WorkspaceRepresenterFactory
35
+ module Associations
36
+ extend ActiveSupport ::Concern
37
+ include API ::Decorators ::LinkedResource
38
+
39
+ def project_link ( project , name :, getter : "#{ name } _id" )
40
+ # Explicitly check for admin as an archived project
41
+ # will lead to the admin losing permissions in the project.
42
+ if project && !project . visible? && !current_user . admin?
43
+ {
44
+ href : API ::V3 ::URN_UNDISCLOSED ,
45
+ title : I18n . t ( :"api_v3.undisclosed.#{ name } " )
46
+ }
47
+ elsif !project
48
+ {
49
+ href : nil
50
+ }
51
+ else
52
+ associated_resource_default_link ( project ,
53
+ :itself ,
54
+ v3_path : project &.workspace_type ,
55
+ skip_link : -> { false } ,
56
+ title_attribute : :name ,
57
+ getter :)
58
+ end
59
+ end
60
+
61
+ class_methods do
62
+ def associated_project ( name , skip_render : false )
63
+ associated_resource name ,
64
+ representer : ::API ::V3 ::Projects ::ProjectRepresenter ,
65
+ uncacheable_link : true ,
66
+ skip_render :,
67
+ link : ::API ::V3 ::Workspaces ::WorkspaceRepresenterFactory
68
+ . create_link_lambda ( name ) ,
69
+ setter : ::API ::V3 ::Workspaces ::WorkspaceRepresenterFactory
70
+ . create_setter_lambda ( name )
71
+ end
72
+ end
73
+ end
74
+
35
75
module_function
36
76
37
- def create_link_lambda ( name , getter : " #{ name } _id" )
77
+ def create_link_lambda ( name , property_name : name )
38
78
-> ( *) {
39
- instance_exec ( &self . class . associated_resource_default_link ( name ,
40
- v3_path : represented . project &.workspace_type ,
41
- skip_link : -> { false } ,
42
- title_attribute : :name ,
43
- getter :) )
79
+ project_link ( represented . public_send ( name ) ,
80
+ name : property_name ,
81
+ getter : :id )
82
+ }
83
+ end
84
+
85
+ def create_setter_lambda ( name , property_name : name , namespaces : %i( projects programs portfolios ) )
86
+ -> ( fragment :, **) {
87
+ ::API ::Decorators ::LinkObject
88
+ . new ( represented ,
89
+ property_name :,
90
+ namespace : namespaces ,
91
+ getter : :"#{ name } _id" ,
92
+ setter : :"#{ name } _id=" )
93
+ . from_hash ( fragment )
44
94
}
45
95
end
46
96
end
0 commit comments