update cron job and watchlist api endpoint

This commit is contained in:
MuslemRahimi 2024-10-10 22:10:41 +02:00
parent 38aed4098e
commit c936d71e10
3 changed files with 184 additions and 202 deletions

View File

@ -1103,57 +1103,58 @@ async def get_watchlist(data: GetWatchList, api_key: str = Security(get_api_key)
watchlist_id = data['watchListId'] watchlist_id = data['watchListId']
result = pb.collection("watchlist").get_one(watchlist_id) result = pb.collection("watchlist").get_one(watchlist_id)
ticker_list = result.ticker ticker_list = result.ticker
rule_of_list = result.rule_of_list or []
print(rule_of_list)
combined_results = [] # List to store the combined results combined_results = [] # List to store the combined results
combined_news = [] combined_news = []
for ticker in ticker_list: def load_json(file_path):
ticker = ticker.upper() try:
with open(file_path, 'rb') as file:
return orjson.loads(file.read())
except FileNotFoundError:
return None
# Categorize tickers and fetch data
for ticker in map(str.upper, ticker_list):
ticker_type = 'stock'
if ticker in etf_symbols: if ticker in etf_symbols:
try: ticker_type = 'etf'
with open(f"json/quote/{ticker}.json", 'rb') as file:
quote_dict = orjson.loads(file.read())
quote_dict['type'] = 'etf'
combined_results.append(quote_dict)
except:
pass
try:
with open(f"json/market-news/companies/{ticker}.json", 'rb') as file:
news_dict = orjson.loads(file.read())[0]
combined_news.append(news_dict)
except:
pass
elif ticker in crypto_symbols: elif ticker in crypto_symbols:
try: ticker_type = 'crypto'
with open(f"json/quote/{ticker}.json", 'rb') as file:
quote_dict = orjson.loads(file.read()) # Load quote data
quote_dict['type'] = 'crypto' quote_dict = load_json(f"json/quote/{ticker}.json")
combined_results.append(quote_dict) if quote_dict:
except: quote_dict['type'] = ticker_type
pass combined_results.append(quote_dict)
try:
with open(f"json/market-news/companies/{ticker}.json", 'rb') as file: # Load news data
news_dict = orjson.loads(file.read())[0] news_dict = load_json(f"json/market-news/companies/{ticker}.json")
combined_news.append(news_dict) if news_dict:
except: combined_news.append(news_dict[0])
pass
else: # Keys to always include in the combined results
try: always_include = ['symbol', 'name', 'price', 'changesPercentage']
with open(f"json/quote/{ticker}.json", 'rb') as file:
quote_dict = orjson.loads(file.read()) try:
quote_dict['type'] = 'stock' # Create a mapping of stock_screener_data based on symbol for fast lookup
combined_results.append(quote_dict) screener_dict = {
except: item['symbol']: {key: item.get(key) for key in set(always_include + rule_of_list) if key in item}
pass for item in stock_screener_data
try: }
with open(f"json/market-news/companies/{ticker}.json", 'rb') as file:
news_dict = orjson.loads(file.read())[0] # Merge the filtered stock_screener_data into combined_results
combined_news.append(news_dict) for result in combined_results:
except: symbol = result.get('symbol')
pass if symbol in screener_dict:
res = [combined_results, combined_news] result.update(screener_dict[symbol])
return res
except Exception as e:
print(f"An error occurred while merging data: {e}")
print(combined_results)
return [combined_results, combined_news]
def process_option_activity(item): def process_option_activity(item):
item['put_call'] = 'Calls' if item['put_call'] == 'CALL' else 'Puts' item['put_call'] = 'Calls' if item['put_call'] == 'CALL' else 'Puts'
@ -3207,7 +3208,6 @@ async def get_all_politician(api_key: str = Security(get_api_key)):
headers={"Content-Encoding": "gzip"} headers={"Content-Encoding": "gzip"}
) )
try: try:
with open(f"json/congress-trading/search_list.json", 'rb') as file: with open(f"json/congress-trading/search_list.json", 'rb') as file:
res_list = orjson.loads(file.read()) res_list = orjson.loads(file.read())

View File

@ -371,7 +371,7 @@ schedule.every(10).minutes.do(run_threaded, run_tracker).tag('tracker_job')
schedule.every(1).minutes.do(run_threaded, run_cron_quote).tag('quote_job') schedule.every(1).minutes.do(run_threaded, run_cron_quote).tag('quote_job')
schedule.every(15).minutes.do(run_threaded, run_market_moods).tag('market_moods_job') schedule.every(15).minutes.do(run_threaded, run_market_moods).tag('market_moods_job')
schedule.every(30).minutes.do(run_threaded, run_earnings).tag('earnings_job') schedule.every(10).minutes.do(run_threaded, run_earnings).tag('earnings_job')
#schedule.every(10).minutes.do(run_threaded, run_dark_pool_flow).tag('dark_pool_flow_job') #schedule.every(10).minutes.do(run_threaded, run_dark_pool_flow).tag('dark_pool_flow_job')
schedule.every(2).hours.do(run_threaded, run_fda_calendar).tag('fda_calendar_job') schedule.every(2).hours.do(run_threaded, run_fda_calendar).tag('fda_calendar_job')

View File

@ -1,189 +1,171 @@
// Optimized postHotness function // Optimized postHotness function
function postHotness(upvotes, created) { function postHotness(upvotes, created) {
let s = 0; let s = 0;
for (let i = 1; i <= upvotes; i++) { for (let i = 1; i <= upvotes; i++) {
if (i <= 3) { if (i <= 3) {
s += 1; s += 1;
} else if (i <= 6) { } else if (i <= 6) {
s += 3; s += 3;
} else if (i <= 10) { } else if (i <= 10) {
s += 3; s += 3;
} else if (i <= 20) { } else if (i <= 20) {
s += 4; s += 4;
} else if (i <= 40) { } else if (i <= 40) {
s += 5; s += 5;
} else { } else {
s += 6; s += 6;
}
} }
}
const order = Math.log10(Math.max(Math.abs(s), 1)); const order = Math.log10(Math.max(Math.abs(s), 1));
let sign = 0; let sign = 0;
if (s > 0) { if (s > 0) {
sign = 1; sign = 1;
} else if (s < 0) { } else if (s < 0) {
sign = -1; sign = -1;
} }
const interval = 45000; // or 69000 const interval = 45000; // or 69000
const createdDate = new Date(created); const createdDate = new Date(created);
const seconds = (createdDate.getTime() / 1000); const seconds = createdDate.getTime() / 1000;
const hotness = order + (sign * seconds) / interval; const hotness = order + (sign * seconds) / interval;
return Math.round(hotness * 10000000); return Math.round(hotness * 10000000);
} }
module.exports = function (fastify, opts, done) { module.exports = function (fastify, opts, done) {
const pb = opts.pb;
const pb = opts.pb; fastify.post("/get-post", async (request, reply) => {
fastify.post('/get-post', async (request, reply) => {
const data = request.body; const data = request.body;
let filter; let filter;
const sort = data?.sortingPosts === 'hot' ? '-upvote' : '-created'; const sort = data?.sortingPosts === "hot" ? "-upvote" : "-created";
let pinnedPost; let pinnedPost;
let posts; let posts;
try { try {
if (data?.seenPostId.length !== 0) {
filter = data?.seenPostId?.map((id) => `id!="${id}"`).join("&&");
//applies only for profile and user directory
if (data?.seenPostId.length !==0) if (data?.userId) {
{ filter += `&& user="${data?.userId}" && pinned=false`;
filter = data?.seenPostId?.map((id) => `id!="${id}"`).join("&&");
//applies only for profile and user directory
if (data?.userId) {
filter += `&& user="${data?.userId}" && pinned=false`;
}
if (data?.filterTicker) {
filter += `&& tagline="${data?.filterTicker}" && pinned=false`;
}
if(data?.sortingPosts === 'hot') {
//community page code space
// In case of sort === 'hot' show the most recent post up to 7 week by ranking them with the function postHotness
let endDate = new Date();
// Get the date one week earlier
let startDate = new Date();
startDate.setDate(endDate.getDate() - 30);
endDate.setDate(endDate.getDate() + 1)
// Format the dates as needed (e.g., "YYYY-MM-DD")
let endDateStr = endDate.toISOString().split('T')[0];
let startDateStr = startDate.toISOString().split('T')[0];
filter += `&& created >= "${startDateStr}" && created <= "${endDateStr}" && pinned = false`
}
posts = (await pb.collection('posts').getList(data?.startPage, 5, {
sort: '-created',
filter: filter,
expand: 'user,comments(post),alreadyVoted(post)',
fields: "*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type"
}))?.items;
if(data?.sortingPosts === 'hot') {
// Add hotness property to each post
posts?.forEach(post => {
post.hotness = postHotness(post?.upvote, post?.created);
});
posts?.sort((a, b) => b?.hotness - a?.hotness);
}
} }
else {
if (data?.userId) { if (data?.filterTicker) {
filter += `&& tagline="${data?.filterTicker}" && pinned=false`;
}
posts = (await pb.collection('posts').getList(data?.startPage, 5, { if (data?.sortingPosts === "hot") {
sort: sort, //community page code space
filter: `user="${data?.userId}" && pinned=false`, // In case of sort === 'hot' show the most recent post up to 7 week by ranking them with the function postHotness
expand: `user,comments(post),alreadyVoted(post)`,
fields: "*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type"
}))?.items;
let endDate = new Date();
// Get the date one week earlier
let startDate = new Date();
startDate.setDate(endDate.getDate() - 180);
endDate.setDate(endDate.getDate() + 1);
} // Format the dates as needed (e.g., "YYYY-MM-DD")
let endDateStr = endDate.toISOString().split("T")[0];
let startDateStr = startDate.toISOString().split("T")[0];
else if (data?.filterTicker) { filter += `&& created >= "${startDateStr}" && created <= "${endDateStr}" && pinned = false`;
}
posts = await pb.collection('posts').getList(data?.startPage, 5, { posts = (
sort: sort, await pb.collection("posts").getList(data?.startPage, 10, {
filter: `tagline="${data?.filterTicker}" && pinned=false`, sort: "-created",
expand: `user,comments(post),alreadyVoted(post)`, filter: filter,
fields: "*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type" expand: "user,comments(post),alreadyVoted(post)",
}) ; fields:
"*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type",
})
)?.items;
} if (data?.sortingPosts === "hot") {
// Add hotness property to each post
posts?.forEach((post) => {
post.hotness = postHotness(post?.upvote, post?.created);
});
posts?.sort((a, b) => b?.hotness - a?.hotness);
}
} else {
if (data?.userId) {
posts = (
await pb.collection("posts").getList(data?.startPage, 10, {
sort: sort,
filter: `user="${data?.userId}" && pinned=false`,
expand: `user,comments(post),alreadyVoted(post)`,
fields:
"*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type",
})
)?.items;
} else if (data?.filterTicker) {
posts = await pb.collection("posts").getList(data?.startPage, 10, {
sort: sort,
filter: `tagline="${data?.filterTicker}" && pinned=false`,
expand: `user,comments(post),alreadyVoted(post)`,
fields:
"*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type",
});
} else {
//community page code space
// In case of sort === 'hot' show the most recent post up to 7 week by ranking them with the function postHotness
else { if (data?.sortingPosts === "hot") {
//community page code space let endDate = new Date();
// In case of sort === 'hot' show the most recent post up to 7 week by ranking them with the function postHotness // Get the date one week earlier
let startDate = new Date();
startDate.setDate(endDate.getDate() - 30);
endDate.setDate(endDate.getDate() + 1);
if(data?.sortingPosts === 'hot') { // Format the dates as needed (e.g., "YYYY-MM-DD")
let endDateStr = endDate.toISOString().split("T")[0];
let startDateStr = startDate.toISOString().split("T")[0];
let endDate = new Date(); filter = `created >= "${startDateStr}" && created <= "${endDateStr}" && pinned = false`;
// Get the date one week earlier } else {
let startDate = new Date(); filter = `pinned=false`;
startDate.setDate(endDate.getDate() - 30); }
endDate.setDate(endDate.getDate() + 1) posts = await pb.collection("posts").getList(1, 10, {
sort: "-created",
filter: filter,
expand: "user, comments(post), alreadyVoted(post)",
fields:
"*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type",
});
// Format the dates as needed (e.g., "YYYY-MM-DD") posts = posts.items;
let endDateStr = endDate.toISOString().split('T')[0]; // Add hotness property to each post
let startDateStr = startDate.toISOString().split('T')[0]; if (data?.sortingPosts === "hot") {
posts?.forEach((post) => {
post.hotness = postHotness(post?.upvote, post?.created);
});
filter = `created >= "${startDateStr}" && created <= "${endDateStr}" && pinned = false` posts?.sort((a, b) => b?.hotness - a?.hotness);
} }
else {
filter = `pinned=false`;
}
posts = await pb.collection('posts').getList(1, 5, {
sort: '-created',
filter: filter,
expand: 'user, comments(post), alreadyVoted(post)',
fields: "*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type"
}); pinnedPost = await pb.collection("posts").getFullList({
filter: `pinned=true`,
sort: "-created",
expand: `user,comments(post),alreadyVoted(post)`,
fields:
"*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type",
});
posts = posts.items for (let i = pinnedPost?.length - 1; i >= 0; i--) {
// Add hotness property to each post posts?.unshift(pinnedPost[i]);
if(data?.sortingPosts === 'hot') { }
posts?.forEach(post => { }
post.hotness = postHotness(post?.upvote, post?.created); }
}); } catch (e) {
//console.log(e)
posts?.sort((a, b) => b?.hotness - a?.hotness); posts = [];
}
pinnedPost = await pb.collection('posts').getFullList({
filter: `pinned=true`,
sort: '-created',
expand: `user,comments(post),alreadyVoted(post)`,
fields: "*,expand.user,expand.comments(post), expand.alreadyVoted(post).user,expand.alreadyVoted(post).type"
});
for (let i = pinnedPost?.length - 1; i >= 0; i--) {
posts?.unshift(pinnedPost[i]);
}
}
}
}
catch(e)
{
//console.log(e)
posts = [];
} }
reply.send({ items: posts });
});
reply.send({ items: posts }) done();
})
done();
}; };