@@ -2,7 +2,10 @@ defmodule Algora.Settings do
2
2
@ moduledoc false
3
3
use Ecto.Schema
4
4
5
+ import Ecto.Query
6
+
5
7
alias Algora.Accounts
8
+ alias Algora.Accounts.User
6
9
alias Algora.Repo
7
10
8
11
@ primary_key { :key , :string , [ ] }
@@ -91,10 +94,37 @@ defmodule Algora.Settings do
91
94
set ( "org_matches:#{ org_handle } " , % { "matches" => matches } )
92
95
end
93
96
94
- def get_job_matches ( job_id ) do
95
- case get ( "job_matches:#{ job_id } " ) do
96
- % { "matches" => matches } when is_list ( matches ) -> load_matches ( matches )
97
- _ -> [ ]
97
+ def get_job_matches ( job ) do
98
+ case get ( "job_matches:#{ job . id } " ) do
99
+ % { "matches" => matches } when is_list ( matches ) ->
100
+ load_matches ( matches )
101
+
102
+ _ ->
103
+ [
104
+ tech_stack: job . tech_stack ,
105
+ limit: 50 ,
106
+ users: apply_job_criteria ( User , get_job_criteria ( job . id ) )
107
+ ]
108
+ |> Algora.Cloud . list_top_matches ( )
109
+ |> load_matches_2 ( )
110
+ end
111
+ end
112
+
113
+ def apply_job_criteria ( query , criteria ) do
114
+ Enum . reduce ( criteria , query , fn
115
+ { "country" , country } , query ->
116
+ from ( [ u ] in query , where: u . country == ^ country )
117
+ end )
118
+ end
119
+
120
+ def set_job_criteria ( job_id , criteria ) when is_binary ( job_id ) and is_map ( criteria ) do
121
+ set ( "job_criteria:#{ job_id } " , % { "criteria" => criteria } )
122
+ end
123
+
124
+ def get_job_criteria ( job_id ) do
125
+ case get ( "job_criteria:#{ job_id } " ) do
126
+ % { "criteria" => criteria } when is_map ( criteria ) -> criteria
127
+ _ -> % { }
98
128
end
99
129
end
100
130
@@ -145,6 +175,22 @@ defmodule Algora.Settings do
145
175
end )
146
176
end
147
177
178
+ def load_matches_2 ( matches ) do
179
+ user_map =
180
+ [ ids: Enum . map ( matches , & & 1 [ :user_id ] ) , limit: :infinity ]
181
+ |> Accounts . list_developers ( )
182
+ |> Enum . filter ( & & 1 . provider_login )
183
+ |> Map . new ( fn user -> { user . id , user } end )
184
+
185
+ Enum . flat_map ( matches , fn match ->
186
+ if user = Map . get ( user_map , match [ :user_id ] ) do
187
+ [ % { user: user , contribution_score: match [ "contribution_score" ] } ]
188
+ else
189
+ [ ]
190
+ end
191
+ end )
192
+ end
193
+
148
194
def get_blocked_users do
149
195
case get ( "blocked_users" ) do
150
196
% { "handles" => handles } when is_list ( handles ) -> handles
0 commit comments