update cron job and watchlist api endpoint
This commit is contained in:
parent
38aed4098e
commit
c936d71e10
94
app/main.py
94
app/main.py
@ -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())
|
||||||
|
|||||||
@ -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')
|
||||||
|
|||||||
@ -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();
|
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user