@@ -12,27 +12,33 @@ defmodule Algora.Jobs do
12
12
alias Algora.Payments.Transaction
13
13
alias Algora.Repo
14
14
alias Algora.Util
15
+ alias AlgoraCloud.Interviews.JobInterview
15
16
16
17
require Logger
17
18
18
19
def list_jobs ( opts \\ [ ] ) do
19
20
JobPosting
20
- |> apply_ordering ( opts )
21
+ |> maybe_filter_by_status ( opts [ :status ] )
21
22
|> maybe_filter_by_user ( opts )
22
23
|> join ( :inner , [ j ] , u in User , on: u . id == j . user_id )
23
- |> maybe_filter_by_users ( opts [ :handles ] )
24
24
|> maybe_filter_by_tech_stack ( opts [ :tech_stack ] )
25
+ |> join ( :left , [ j ] , i in JobInterview , on: i . job_posting_id == j . id )
26
+ |> group_by ( [ j , u , i ] , [ u . contract_signed , j . id , j . inserted_at ] )
27
+ |> order_by ( [ j , u , i ] ,
28
+ desc: u . contract_signed ,
29
+ desc: coalesce ( max ( i . inserted_at ) , j . inserted_at ) ,
30
+ desc: j . inserted_at
31
+ )
25
32
|> maybe_limit ( opts [ :limit ] )
26
33
|> Repo . all ( )
27
34
|> apply_preloads ( opts )
28
35
end
29
36
30
37
def count_jobs ( opts \\ [ ] ) do
31
38
JobPosting
32
- |> order_by ( [ j ] , desc: j . inserted_at )
39
+ |> maybe_filter_by_status ( opts [ :status ] )
33
40
|> maybe_filter_by_user ( opts )
34
41
|> join ( :inner , [ j ] , u in User , on: u . id == j . user_id )
35
- |> maybe_filter_by_users ( opts [ :handles ] )
36
42
|> maybe_filter_by_tech_stack ( opts [ :tech_stack ] )
37
43
|> Repo . aggregate ( :count )
38
44
end
@@ -53,18 +59,14 @@ defmodule Algora.Jobs do
53
59
54
60
defp maybe_filter_by_user ( query , _ ) , do: query
55
61
56
- defp maybe_filter_by_users ( query , nil ) , do: query
57
-
58
- defp maybe_filter_by_users ( query , handles ) do
59
- # Need to handle different query structures based on joins
60
- case query . joins do
61
- # When we have interview join, the user table is the 3rd binding ([j, i, u])
62
- [ _interview_join , _user_join ] -> where ( query , [ j , i , u ] , u . provider_login in ^ handles or u . handle in ^ handles )
63
- # When we only have user join, it's the 2nd binding ([j, u])
64
- [ _user_join ] -> where ( query , [ j , u ] , u . provider_login in ^ handles or u . handle in ^ handles )
65
- # No joins yet, will be added later
66
- [ ] -> where ( query , [ j , u ] , u . provider_login in ^ handles or u . handle in ^ handles )
67
- end
62
+ defp maybe_filter_by_status ( query , nil ) , do: where ( query , [ j ] , j . status in [ :active ] )
63
+
64
+ defp maybe_filter_by_status ( query , :all ) do
65
+ where ( query , [ j ] , j . status in [ :active , :processing ] )
66
+ end
67
+
68
+ defp maybe_filter_by_status ( query , status ) do
69
+ where ( query , [ j ] , j . status == ^ status )
68
70
end
69
71
70
72
defp maybe_filter_by_tech_stack ( query , nil ) , do: query
@@ -77,22 +79,6 @@ defmodule Algora.Jobs do
77
79
defp maybe_limit ( query , nil ) , do: query
78
80
defp maybe_limit ( query , limit ) , do: limit ( query , ^ limit )
79
81
80
- defp apply_ordering ( query , opts ) do
81
- case opts [ :order_by ] do
82
- :last_interview_desc ->
83
- # Sort by most recent interview, then by job posting date
84
- # Use LEFT JOIN to include all jobs, even those without interviews
85
- query
86
- |> join ( :left , [ j ] , i in "job_interviews" , on: i . job_posting_id == j . id )
87
- |> group_by ( [ j ] , [ j . id , j . inserted_at ] )
88
- |> order_by ( [ j , i ] , desc: coalesce ( max ( i . inserted_at ) , j . inserted_at ) , desc: j . inserted_at )
89
-
90
- _ ->
91
- # Default ordering by job posting date
92
- order_by ( query , [ j ] , desc: j . inserted_at )
93
- end
94
- end
95
-
96
82
defp apply_preloads ( jobs , opts ) do
97
83
preloads = [ :user | opts [ :preload ] || [ ] ]
98
84
Repo . preload ( jobs , preloads )
0 commit comments